デバイス オブジェクトを表す SDDL

セキュリティ記述子定義言語 (SDDL) では、セキュリティ記述子を表現します。 デバイス オブジェクトのセキュリティは、INF ファイルに配置する SDDL 文字列か、IoCreateDeviceSecure渡す SDDL 文字列で指定できます。 セキュリティ記述子定義言語は、Microsoft Windows SDK ドキュメントにすべて記載されています。

INF ファイルは SDDL のすべての領域をサポートしていますが、IoCreateDeviceSecure ルーチンでは言語のサブセットのみをサポートしています。 このサブセットはここで定義します。

デバイス オブジェクトの SDDL 文字列では、"D:P" という形式の後に、"(A;;Access;;;SID)" という形式の 1 つ以上の式を続けます。 SID 値 値は、、Access の適用先 (ユーザーやグループなど) を決定するセキュリティ識別子を指定します。 Access 値は、SID に認めるアクセス権を指定します。 Access 値と SID 値は、次のとおりです。

注: デバイス オブジェクトに SDDL を使用するとき、ドライバーを Wdmsec.lib にリンクする必要があります。

Access (アクセス)
許可アクセス権を決定する ACCESS_MASK 値を指定します。 この値は、"0x16 進数" 形式の 16 進数の値として、またはアクセス権を表す 2 文字のシンボリック コードのシーケンスとして書き込むことができます。

以下のコードでは、汎用アクセス権を指定できます。

コード 汎用アクセス権

GA

GENERIC_ALL

GR

GENERIC_READ

GW

GENERIC_WRITE

GX

GENERIC_EXECUTE

以下のコードでは、特定のアクセス権を指定できます。

コード 特定のアクセス権

RC

READ_CONTROL

SD

DELETE

WD

WRITE_DAC

WO

WRITE_OWNER

GENERIC_ALL は、ACL を変更する機能など、上記の 2 つの表に記載されているすべての権限が付与されます。

SID
指定したアクセス権が付与される SID を指定します。 SID は、アカウント、エイリアス、グループ、ユーザー、またはコンピューターを表します。

次の SID は、マシン上のアカウントを表します。

SID 説明

SY

System

ユーザー モード コンポーネントなど、オペレーティング システム自体を表します。

LS

Local Service

ローカル サービスの定義済みアカウント (Authenticated と World にも所属)。 この SID は、Windows XP 以降で使用できます。

NS

Network Service

ネットワーク サービスの定義済みアカウント (Authenticated と World にも所属)。 この SID は、Windows XP 以降で使用できます。

以下の SID は、マシン上のグループを表します。

SID 説明

BA

管理者

マシン上の組み込みの管理者グループ。

BU

組み込みのユーザー グループ

すべてのローカル ユーザー アカウントとドメインのユーザーを対象にしたグループ。

BG

組み込みのゲスト グループ

ローカル ゲスト アカウントまたはドメイン ゲスト アカウントでログインするユーザーを対象にしたグループ。

以下の SID は、ユーザーが認証される範囲を表します。

SID 説明

AU

Authenticated Users

ローカル マシンまたはドメインごとに認識されたユーザー。 組み込みゲスト アカウントでログインしたユーザーは認証されないので注意してください。 ただし、コンピューターまたはドメイン上でそれぞれにアカウントを持っているゲスト グループのメンバーは認証されます。

AN

匿名ログオン ユーザー

匿名ネットワーク セッションなど、ID なしでログオンしたユーザー。 組み込みゲスト アカウントでログインしたユーザーは、認証ログオン ユーザーでも匿名ログオン ユーザーでもありません。 この SID は、Windows XP 以降で使用できます。

以下の SID では、ユーザーがマシンにログインする方法を説明します。

SID 説明

IU

対話型ユーザー

ローカル ログオンやリモート デスクトップ ログオンなど、最初、マシンに "対話形式で" ログオンしたユーザー。

NU

ネットワーク ログオン ユーザー

対話型のデスクトップ アクセス (ファイル共有や RPC 呼び出しなど) なしで、マシンにリモートでアクセスするユーザー。

WD

World

Windows XP より前、この SID では、認証されたユーザー、匿名ユーザー、または組み込みのゲスト アカウントであるか否かに関係なく、すべてのセッションを対象にしていました。

Windows XP 以降、この SID は匿名ログオン セッションは対象になりません。認証されたユーザーと組み込みのゲスト アカウントのみが対象となります。

信頼されていないコードまたは "制限された" コードは、World SID の対象にならないので注意してください。 詳細については、次の表の制限付きコード (RC) SID の説明を参照してください。

以下の SID には特に注意してください。

SID 説明

RC

Restricted Code

この SID では、信頼されていないコードごとのアクセスを制御します。 RC を使用したトークンに対する ACL 検証は、2 つのチェックで行われれます。1 つはトークンの通常の SID リスト (WD など) に対して、もう 1 つは 2 つ目のリスト (通常は RC と元のトークン SID のサブセットを含む) に対して行われます。 アクセス権は、トークンが両方のテストに合格した場合にのみ付与されます。 そのため、RC は実際には他の SID との組み合わせで動作します。

RC を指定する ACL は、どれも WD を指定する必要があります。 ACL で RC が WD とペアになっている場合は、信頼されていないコードを含む Everyone のスーパーセットが記述されます。

信頼されていないコードは、エクスプローラーの [実行] オプションで起動されるコードである可能性があります。 既定では、信頼されていないコードは World の対象になりません。

UD

ユーザーモード ドライバー

この SID では、ユーザーモード ドライバーへのアクセスが許可されます。 現時点では、この SID は、ユーザーモード ドライバー フレームワーク (UMDF) 用に記述されたドライバーのみが対象です。 この SID は、Windows XP 8 以降で使用できます。

"UD" 省略形が認識されない以前のバージョンの Windows では、UMDF ドライバーへのアクセスを許可するには、この SID (S-1-5-84-0-0-0-0) の完全修飾形式を指定する必要があります。 詳細については、『ユーザーモード ドライバー フレームワーク』のドキュメントの「デバイス アクセスの制御」を参照してください。

デバイス オブジェクトの SDDL の例

このセクションでは、Wdmsec.h にある定義済みの SDDL 文字列について説明します。 これらの 定義済みの SDDL 文字列は、テンプレートとして使用して、デバイス オブジェクトの新しい SDDL 文字列を定義することもできます。

SDDL_DEVOBJ_KERNEL_ONLY

"D:P"

SDDL_DEVOBJ_KERNEL_ONLY は "空の" ACL です。 ユーザーモード コード (システムとして実行されているプロセスを含む) では、デバイスを開くことができません。

PnP バス ドライバーでは、PDO を作成するときにこの記述子を使用できます。 そうすれば、INF ファイルで、デバイスのセキュリティ設定を緩和された状態で指定できます。 この記述子を指定すると、INF が処理される前にデバイスを開こうとする試みは、バス ドライバーによって防ぐことができます。

同様に、適切なユーザー モード プログラム (インストーラーなど) がレジストリの最終的なセキュリティ記述子を設定するまで、そのデバイス オブジェクトにアクセスできないように、この記述子により WDM 以外のドライバーで防ぐことができます。

いずれの場合も、既定値は厳密なセキュリティであり、必要に応じて緩和できます。

SDDL_DEVOBJ_SYS_ALL

"D:P(A;;GA;;;SY)"

SDDL_DEVOBJ_SYS_ALL は SDDL_DEVOBJ_KERNEL_ONLY に似ていますが、カーネルモード コードに加えて、システムとして実行されているユーザーモード コードは、任意のアクセス権のためにデバイスを開くこともできます。

レガシ ドライバーでは、この ACL を使用して厳密なセキュリティ設定から開始し、SetFileSecurity ユーザー モード関数を使用して、そのサービスが実行時に個々のユーザーに対してデバイスを開く場合があります。 この場合、サービスはシステムとして実行する必要があります。

SDDL_DEVOBJ_SYS_ALL_ADM_ALL

"D:P(A;;GA;;;SY)(A;;GA;;;BA)"

SDDL_DEVOBJ_SYS_ALL_ADM_ALL では、カーネル、システム、および管理者がデバイスを完全に制御できます。 他のユーザーはデバイスにアクセスできません。

SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_R

"D:P(A;;GA;;;SY)(A;;GRGWGX;;;BA)(A;;GR;;;WD)"

SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_R では、カーネル コンポーネントとシステム コンポーネントがデバイスを完全に制御できます。 既定では、管理者はデバイス全体にアクセスできますが、ACL を変更することはできません (管理者は最初にデバイスを制御する必要があります)。

すべてのユーザー (World SID) に読み取りアクセス権が付与されます。 信頼されていないコードはデバイスにアクセスできません (信頼されていないコードは、エクスプローラーの [実行] オプションを使用して起動されたコードの可能性があります。既定では、World では、制限付きコードは対象になりません)。)

また、トラバーサル アクセス権は通常のユーザーには付与されないので注意してください。 そのため、これは名前空間を持ったデバイスに適した記述子ではない可能性があります。

SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_R_RES_R

"D:P(A;;GA;;;SY)(A;;GRGWGX;;;BA)(A;;GR;;;WD)(A;;GR;;;RC)"

SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_R_RES_R では、カーネルとシステムがデバイスを完全に制御できます。 既定では、管理者はデバイス全体にアクセスできますが、ACL を変更することはできません (管理者は最初にデバイスを制御する必要があります)。

すべてのユーザー (World SID) に読み取りアクセス権が付与されます。 さらに、信頼されていないコードもコードにアクセスできます。 信頼されていないコードは、エクスプローラーの [実行] オプションで起動されるコードである可能性があります。 既定では、World では制限付きコードを対象になりません。

また、トラバーサル アクセス権は通常のユーザーには付与されないので注意してください。 そのため、これは名前空間を持ったデバイスに適した記述子ではない可能性があります。

上記の SDDL 文字列には継承修飾子が含まれていないことに注意してください。 そのため、これらの文字列が適しているのはデバイス オブジェクトのみであり、ファイルやレジストリ キーには使用しないでください。 SDDL を使用した継承の指定の詳細については、Microsoft Windows SDK のドキュメントを参照してください。