次の方法で共有


ファイルのセキュリティとアクセス権

ファイルはセキュリティで保護できるオブジェクトであるため、それにアクセスすることは、Windows のその他のあらゆるセキュリティで保護可能オブジェクトへのアクセスを制御するアクセス制御モデルによって規制されます。 このモデルの詳細については、「アクセスの制御」を参照してください。

セキュリティ記述子

CreateFile、CreateDirectory、または CreateDirectoryEx 関数を呼び出すときに、ファイルまたはディレクトリのセキュリティ記述子指定できます。 lpSecurityAttributes パラメーターにNULLを指定すると、ファイルまたはディレクトリは既定のセキュリティ記述子を取得します。 ファイルまたはディレクトリの既定のセキュリティ記述子のアクセス制御リスト (ACL) は、親ディレクトリから継承されます。 既定のセキュリティ記述子は、ファイルまたはディレクトリが新しく作成された場合にのみ割り当てられ、名前の変更や移動時には割り当てられないことに注意してください。

ファイルまたはディレクトリ オブジェクトのセキュリティ記述子を取得するには、 GetNamedSecurityInfo または GetSecurityInfo 関数を呼び出します。 ファイルまたはディレクトリ オブジェクトのセキュリティ記述子を変更するには、 SetNamedSecurityInfo または SetSecurityInfo 関数を呼び出します。

ファイル アクセス権

ファイルおよびディレクトリに対する有効なアクセス権には、DELETEREAD_CONTROLWRITE_DACWRITE_OWNER、および SYNCHRONIZE標準アクセス権があります。 ファイル アクセス権限定数のテーブルには、ファイルとディレクトリに固有のアクセス権が一覧表示されます。

SYNCHRONIZE アクセス権は、いずれかの待機関数でファイル ハンドルを指定する権限として標準のアクセス権リスト内で定義されていますが、非同期ファイル I/O 操作を使用する場合は、同期のために SYNCHRONIZE アクセス権を持つファイル ハンドルを使用するのではなく、適切に構成された OVERLAPPED 構造体に含まれるイベント ハンドルで待機する必要があります。

ファイルとディレクトリの 汎用アクセス権 を次に示します。

汎用アクセス権 マップされたアクセス権 一般的な意味
FILE_GENERIC_EXECUTE FILE_EXECUTE
FILE_READ_ATTRIBUTES
標準的実行権限
同期
アクセスの実行
FILE_GENERIC_READ FILE_READ_ATTRIBUTES
ファイルのデータ読み取り
FILE_READ_EA
STANDARD_RIGHTS_READ
同期
読み取りアクセス
FILE_GENERIC_WRITE FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA(ファイル書き込みデータ)
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
同期
書き込みアクセス

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 フラグは、ファイルまたはディレクトリのアクセス制御設定を読み取るアクセス許可をバックアップ アプリケーション プロセスに付与します。 このアクセス許可を使用すると、バックアップ アプリケーション プロセスで GetKernelObjectSecuritySetKernelObjectSecurity を呼び出して、アクセス制御設定の読み取りとリセットを行うことができます。

バックアップ アプリケーションがシステム レベルのアクセス制御設定にアクセスできる必要がある場合は、createFile に渡される dwDesiredAccess パラメーター値にACCESS_SYSTEM_SECURITY フラグを指定する必要があります。

バックアップ アプリケーションは BackupRead を呼び出して復元操作に指定されたファイルとディレクトリを読み取り、 BackupWrite を呼び出して書き込みます。

標準アクセス権