ファイルのセキュリティとアクセス権
ファイルはセキュリティで保護できるオブジェクトであるため、それにアクセスすることは、Windows のその他のあらゆるセキュリティで保護可能オブジェクトへのアクセスを制御するアクセス制御モデルによって規制されます。 このモデルの詳細については、「アクセスの制御」を参照してください。
CreateFile、CreateDirectory、または CreateDirectoryEx 関数を呼び出すときに、ファイルまたはディレクトリのセキュリティ記述子を指定できます。 lpSecurityAttributes パラメーターに NULL を指定すると、ファイルまたはディレクトリは既定のセキュリティ記述子を取得します。 ファイルまたはディレクトリの既定のセキュリティ記述子のアクセス制御リスト (ACL) は、親ディレクトリから継承されます。 既定のセキュリティ記述子は、ファイルまたはディレクトリが新しく作成された場合にのみ割り当てられ、名前の変更や移動時には割り当てられないことに注意してください。
ファイルまたはディレクトリ オブジェクトのセキュリティ記述子を取得するには、GetNamedSecurityInfo または GetSecurityInfo 関数を呼び出します。 ファイルまたはディレクトリ オブジェクトのセキュリティ記述子を変更するには、SetNamedSecurityInfo または SetSecurityInfo 関数を呼び出します。
ファイルおよびディレクトリに対する有効なアクセス権には、DELETE、READ_CONTROL、WRITE_DAC、WRITE_OWNER、および SYNCHRONIZE 標準アクセス権があります。 「ファイル アクセス権限定数」の表に、ファイルとディレクトリに固有のアクセス権の一覧を示します。
SYNCHRONIZE アクセス権は、いずれかの待機関数でファイル ハンドルを指定する権限として標準のアクセス権リスト内で定義されていますが、非同期ファイル I/O 操作を使用する場合は、同期のために SYNCHRONIZE アクセス権を持つファイル ハンドルを使用するのではなく、適切に構成された OVERLAPPED 構造体に含まれるイベント ハンドルで待機する必要があります。
ファイルとディレクトリの汎用アクセス権を次に示します。
アクセス権 | 説明 |
---|---|
FILE_GENERIC_EXECUTE |
FILE_READ_ATTRIBUTES STANDARD_RIGHTS_EXECUTE SYNCHRONIZE |
FILE_GENERIC_READ |
FILE_READ_DATA FILE_READ_EA STANDARD_RIGHTS_READ SYNCHRONIZE |
FILE_GENERIC_WRITE |
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 セキュリティ モデルでは、子ディレクトリが親ディレクトリのセキュリティ記述子の 1 つ以上の 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 を使用して、許可されたアクセス権を明示的に許可します。
ストレージ オブジェクトへのアクセスを管理するもう 1 つの方法は、暗号化です。 Windows でのファイル システム暗号化の実装は、暗号化されたファイル システム (EFS) です。 EFS は、ディレクトリではなくファイルのみを暗号化します。 暗号化の利点は、ファイル システムと標準の Windows アクセス制御アーキテクチャではなく、メディアに適用されるファイルに対して追加の保護を提供することです。 ファイル暗号化の詳細については、「ファイルの暗号化」を参照してください。
ほとんどの場合、ファイルまたはディレクトリ オブジェクトのセキュリティ設定を読み書きする機能は、カーネル モード プロセスに制限されます。 明らかに、ユーザー プロセスがプライベート ファイルまたはディレクトリの所有権またはアクセス制限を変更できることは望ましくありません。 ただし、ファイルまたはディレクトリに対するアクセス制限によってアプリケーションのユーザー モード プロセスでファイルの読み取りが許可されていない場合、バックアップ アプリケーションはファイルのバックアップのジョブを完了できません。 バックアップ アプリケーションは、完全なバックアップを確保するために、ファイル オブジェクトとディレクトリ オブジェクトのセキュリティ設定をオーバーライドできる必要があります。 同様に、バックアップ アプリケーションがディスク常駐コピーでファイルのバックアップ コピーを書き込もうとしたときに、バックアップ アプリケーション プロセスに対する書き込み特権を明示的に拒否した場合、復元操作は完了できません。 この場合も、バックアップ アプリケーションがファイルのアクセス制御設定をオーバーライドできる必要があります。
SE_BACKUP_NAME および SE_RESTORE_NAME アクセス特権は、アプリケーションをバックアップする機能を提供するために特別に作成されました。 バックアップ アプリケーション プロセスのアクセス トークンでこれらの特権が付与され、有効になっている場合は、CreateFile を呼び出してバックアップ用のファイルまたはディレクトリを開き、dwDesiredAccess パラメーターの値として標準 READ_CONTROL アクセス権を指定できます。 ただし、呼び出し元のプロセスをバックアップ プロセスとして識別するには、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 を呼び出して書き込みます。
関連トピック