파일 보안 및 액세스 권한

파일은 보안 개체이므로 해당 파일에 대한 액세스는 Windows 있는 다른 모든 보안 개체에 대한 액세스를 제어하는 액세스 제어 모델에 의해 규제됩니다. 이 모델에 대한 자세한 설명은 Access Control 참조하세요.

CreateFile, CreateDirectory 또는 CreateDirectoryEx 함수를 호출할 때 파일 또는 디렉터리에 대한 보안 설명자를 지정할 수 있습니다. lpSecurityAttributes 매개 변수에 대해 NULL을 지정하면 파일 또는 디렉터리가 기본 보안 설명자를 가져옵니다. 파일 또는 디렉터리에 대한 기본 보안 설명자의 ACL(액세스 제어 목록)은 부모 디렉터리에서 상속됩니다. 기본 보안 설명자는 파일 또는 디렉터리가 새로 만들어지는 경우에만 할당되며 이름을 바꾸거나 이동할 때는 할당되지 않습니다.

파일 또는 디렉터리 개체의 보안 설명자를 검색하려면 GetNamedSecurityInfo 또는 GetSecurityInfo 함수를 호출합니다. 파일 또는 디렉터리 개체의 보안 설명자를 변경하려면 SetNamedSecurityInfo 또는 SetSecurityInfo 함수를 호출합니다.

파일 및 디렉터리에 대한 유효한 액세스 권한에는 DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNERSYNCHRONIZEstandard액세스 권한이 포함됩니다. 파일 액세스 권한 상수의 표에는 파일 및 디렉터리와 관련된 액세스 권한이 나열되어 있습니다.

SYNCHRONIZE 액세스 권한은 대기 함수 중 하나에서 파일 핸들을 지정할 수 있는 권한으로 표준 액세스 권한 목록 내에 정의되어 있지만 비동기 파일 I/O 작업을 사용하는 경우 동기화를 위해 SYNCHRONIZE 액세스 권한이 있는 파일 핸들을 사용하는 대신 올바르게 구성된 OVERLAPPED 구조에 포함된 이벤트 핸들을 기다려야 합니다.

다음은 파일 및 디렉터리에 대한 일반 액세스 권한 입니다.

액세스 권한 Description
FILE_GENERIC_EXECUTE
FILE_EXECUTE
FILE_READ_ATTRIBUTES
STANDARD_RIGHTS_EXECUTE
SYNCHRONIZE
FILE_GENERIC_READ
FILE_READ_ATTRIBUTES
FILE_READ_DATA
FILE_READ_EA
STANDARD_RIGHTS_READ
SYNCHRONIZE
FILE_GENERIC_WRITE
FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
SYNCHRONIZE

 

Windows 요청된 액세스 권한과 스레드 액세스 토큰의 정보를 파일 또는 디렉터리 개체의 보안 설명자의 정보와 비교합니다. 비교에서 요청된 액세스 권한을 모두 부여하는 것을 금지하지 않는 경우 개체에 대한 핸들이 스레드로 반환되고 액세스 권한이 부여됩니다. 이 프로세스에 대한 자세한 내용은 스레드와 보안 개체 간의 상호 작용을 참조하세요.

기본적으로 파일 또는 디렉터리에 대한 액세스 권한 부여는 해당 파일 또는 디렉터리에 연결된 보안 설명자의 ACL에 의해 엄격하게 제어됩니다. 특히 부모 디렉터리의 보안 설명자는 자식 파일 또는 디렉터리에 대한 액세스를 제어하는 데 사용되지 않습니다. FILE_TRAVERSE 권한은 사용자로부터 BYPASS_TRAVERSE_CHECKING권한을 제거하여 적용할 수 있습니다. 많은 프로그램에서 디렉터리 순회 오류를 올바르게 처리하지 않으므로 일반적인 경우에는 권장되지 않습니다. 디렉터리에 대한 FILE_TRAVERSE 액세스 권한의 주요 용도는 Unix 시스템과의 상호 운용성이 요구 사항인 경우 특정 IEEE 및 ISO POSIX 표준을 준수하도록 설정하는 것입니다.

Windows 보안 모델은 자식 디렉터리가 부모 디렉터리의 보안 설명자에 있는 하나 이상의 ACE를 상속하거나 상속하지 못하도록 하는 방법을 제공합니다. 각 ACE에는 상속할 수 있는 방법과 상속되는 디렉터리 개체에 영향을 줄지 여부를 결정하는 정보가 포함되어 있습니다. 예를 들어 상속된 일부 ACE는 상속된 디렉터리 개체에 대한 액세스를 제어하며, 이를 유효 ACE라고 합니다. 다른 모든 ACE를 상속 전용 ACE라고합니다.

또한 Windows 보안 모델은 ACE 상속 규칙에 따라 자식 개체에 대한 ACE의 자동 상속을 적용합니다. 이 자동 상속은 각 ACE의 상속 정보와 함께 디렉터리 계층 구조에서 보안 제한을 전달하는 방법을 결정합니다.

액세스 거부 ACE를 사용하여 GENERIC_READ 만 거부하거나 파일에 대한 액세스만 GENERIC_WRITE 수 없습니다. 파일 개체의 경우 GENERIC_READ 또는 GENERIC_WRITE 모두에 대한 제네릭 매핑에 SYNCHRONIZE 액세스 권한이 포함되어 있기 때문입니다. ACE가 트러스티에 대한 GENERIC_WRITE 액세스를 거부하고 트러스티가 액세스를 GENERIC_READ 요청하면 요청에 ACE에서 암시적으로 거부되는 SYNCHRONIZE 액세스가 암시적으로 포함되고 그 반대의 경우도 마찬가지이므로 요청이 실패합니다. 액세스 거부 ACE를 사용하는 대신 액세스 허용 ACE를 사용하여 허용된 액세스 권한을 명시적으로 허용합니다.

스토리지 개체에 대한 액세스를 관리하는 또 다른 방법은 암호화입니다. Windows 파일 시스템 암호화 구현은 암호화된 파일 시스템 또는 EFS입니다. EFS는 디렉터리를 사용하지 않고 파일만 암호화합니다. 암호화의 장점은 파일 시스템과 표준 Windows 액세스 제어 아키텍처를 통하지 않고 미디어에 적용되는 파일에 대한 추가 보호를 제공한다는 것입니다. 파일 암호화에 대한 자세한 내용은 파일 암호화를 참조하세요.

대부분의 경우 파일 또는 디렉터리 개체의 보안 설정을 읽고 쓰는 기능은 커널 모드 프로세스로 제한됩니다. 사용자 프로세스가 개인 파일 또는 디렉터리에 대한 소유권 또는 액세스 제한을 변경할 수 없도록 하려는 것은 분명합니다. 그러나 파일 또는 디렉터리에 적용한 액세스 제한으로 인해 애플리케이션의 사용자 모드 프로세스에서 파일을 읽을 수 없는 경우 백업 애플리케이션은 파일 백업 작업을 완료할 수 없습니다. 백업 애플리케이션은 전체 백업을 보장하기 위해 파일 및 디렉터리 개체의 보안 설정을 재정의할 수 있어야 합니다. 마찬가지로 백업 애플리케이션이 디스크 상주 복사본을 통해 파일의 백업 복사본을 쓰려고 시도하고 백업 애플리케이션 프로세스에 대한 쓰기 권한을 명시적으로 거부하는 경우 복원 작업을 완료할 수 없습니다. 또한 이 경우 백업 애플리케이션은 파일의 액세스 제어 설정을 재정의할 수 있어야 합니다.

SE_BACKUP_NAMESE_RESTORE_NAME 액세스 권한은 애플리케이션을 백업하는 이 기능을 제공하기 위해 특별히 만들어졌습니다. 이러한 권한이 부여되고 백업 애플리케이션 프로세스의 액세스 토큰에서 사용하도록 설정된 경우 CreateFile 을 호출하여 백업용 파일 또는 디렉터리를 열고 표준 READ_CONTROL 액세스 권한을 dwDesiredAccess 매개 변수의 값으로 지정할 수 있습니다. 그러나 호출 프로세스를 백업 프로세스로 식별하려면 CreateFile 호출에 dwFlagsAndAttributes 매개 변수에 FILE_FLAG_BACKUP_SEMANTICS 플래그가 포함되어야 합니다. 함수 호출의 전체 구문은 다음과 같습니다.

HANDLE hFile = CreateFile( fileName,                   // lpFileName
                           READ_CONTROL,               // dwDesiredAccess
                           0,                          // dwShareMode
                           NULL,                       // lpSecurityAttributes
                           OPEN_EXISTING,              // dwCreationDisposition
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                           NULL );                     // hTemplateFile

이렇게 하면 백업 애플리케이션 프로세스가 파일을 열고 표준 보안 검사를 재정의할 수 있습니다. 파일을 복원하기 위해 백업 애플리케이션은 쓸 파일을 열 때 다음 CreateFile 호출 구문을 사용합니다.

HANDLE hFile = CreateFile( fileName,                   // lpFileName
                           WRITE_OWNER | WRITE_DAC,    // dwDesiredAccess
                           0,                          // dwShareMode
                           NULL,                       // lpSecurityAttributes
                           CREATE_ALWAYS,              // dwCreationDisposition
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                           NULL );                     // hTemplateFile

백업 애플리케이션이 파일 또는 디렉터리의 액세스 제어 설정을 변경할 수 있어야 하는 경우가 있습니다. 예를 들어 파일 또는 디렉터리의 디스크 상주 복사본에 대한 액세스 제어 설정이 백업 복사본과 다른 경우입니다. 이 문제는 파일 또는 디렉터리가 백업된 후 이러한 설정이 변경되었거나 손상된 경우에 발생합니다.

CreateFile 호출에 지정된 FILE_FLAG_BACKUP_SEMANTICS 플래그는 백업 애플리케이션 프로세스에 파일 또는 디렉터리의 액세스 제어 설정을 읽을 수 있는 권한을 부여합니다. 이 권한을 사용하여 백업 애플리케이션 프로세스는 GetKernelObjectSecuritySetKernelObjectSecurity 를 호출하여 액세스 제어 설정을 읽고 다시 설정할 수 있습니다.

백업 애플리케이션이 시스템 수준 액세스 제어 설정에 액세스할 수 있어야 하는 경우 CreateFile에 전달된 dwDesiredAccess 매개 변수 값에 ACCESS_SYSTEM_SECURITY 플래그를 지정해야 합니다.

백업 애플리케이션은 BackupRead를 호출하여 복원 작업에 지정된 파일 및 디렉터리를 읽고, BackupWrite에서 파일을 작성합니다.

표준 액세스 권한