파일 보안 및 액세스 권한

파일은 보안 개체이기 때문에 이에 대한 액세스는 Windows의 다른 모든 보안 개체에 대한 액세스를 관리하는 액세스 제어 모델에 의해 규제됩니다. 이 모델에 대한 자세한 설명은 액세스 제어를 참조하세요.

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

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

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

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

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

액세스 권한 설명
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 플래그는 백업 애플리케이션 프로세스에 파일 또는 디렉터리의 액세스 제어 설정을 읽을 수 있는 권한을 부여합니다. 이 권한을 사용하여 백업 애플리케이션 프로세스는 GetKernelObjectSecurity SetKernelObjectSecurity를 호출하여 액세스 제어 설정을 읽고 다시 설정할 수 있습니다.

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

백업 애플리케이션은 BackupRead를 호출하여 복원 작업에 대해 지정된 파일 및 디렉터리를 읽고 BackupWrite를 호출하여 해당 파일 및 디렉터리에 씁니다.

표준 액세스 권한