この記事はなに?
Windows の SDDL (Security Descriptor Definition Language) を解読します。
Lacさんの記事 の焼き直しです。
SDDL文字列の構造
SDDLは、いくつかの決められたプレフィックスを持つ文字列を、区切りなしに並べたひと続きの文字列です。
O:BAG:SYD:P(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;LA)
癖強いっすね ![]()
SDDLのプレフィックス
プレフィックスには、以下の4つがあります。
| プレフィックス | 意味 |
|---|---|
| O: | Owner (所有者) |
| G: | Group (プライマリグループ) |
| D: | Discretionary Access Control List (DACL) |
| S: | System Access Control List |
S: は、一般ユーザーには関係ないらしいので、ここでは無視です。
先の例を分解すると、こうなります。
| 項目 | 値 |
|---|---|
| 所有者 (O:) | BA |
| プライマリグループ (G:) | SY |
| DACL (D:) | P(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;LA) |
所有者やプライマリグループを表す文字列
所有者やプライマリグループは、SIDか、BA や SY のような、あらかじめ決められている文字列だそうです。
先の例は、このような意味です。
| 文字列 | 意味 |
|---|---|
| BA | Built-in administrators. |
| SY | Local system. |
DACLの構造
プレフィックス D: で始まる DACL の構造です。
フラグ(ACE文字列1)(ACE文字列2)...(ACE文字列n)
フラグで始まり、カッコで囲まれたACE文字列が羅列されます。
先の例を分解するとこうなります。
| 項目 | 値 |
|---|---|
| フラグ | P |
| ACE文字列1 | A;OICI;FA;;;SY |
| ACE文字列2 | A;OICI;FA;;;BA |
| ACE文字列3 | A;OICI;FA;;;LA |
DACLのフラグ
以下の4つのうちのひとつ、あるいは複数を区切りなしに並べた文字列です。
| フラグ | 意味 |
|---|---|
| P | SE_DACL_PROTECTED フラグがセットされている |
| AR | SE_DACL_AUTO_INHERIT_REQ フラグがセットされている |
| AI | SE_DACL_AUTO_INHERITED フラグがセットされている |
| NO_ACCESS_CONTROL | ACLがNull |
意味わかりませんが、重要ではないらしいので、スルーします。
ACE文字列の構造
ACE文字列は、以下の項目をセミコロンで区切って並べた文字列です(その意味は後述)。
- ACEタイプ
- ACEフラグ
- 権限
- オブジェクトのGUID
- 継承オブジェクトのGUID
- アカウントのSID
先の例を分解すると、こうなります。
| 項目 | 値 |
|---|---|
| ACEタイプ | A |
| ACEフラグ | OI と CI |
| 権限 | FA |
| オブジェクトのGUID | (なし) |
| 継承オブジェクトのGUID | (なし) |
| アカウントのSID | SY |
ACEタイプ
あらかじめ決まっている文字列です。A が許可、D が拒否です。他にもいろいろあります。
先の例ですと、A なので許可を意味します。
ACEフラグ
ひとつまたは複数のフラグを区切りなしに並べた文字列です。そのACEがどのように扱われるのかを決めます。
ファイルシステムでよく使うのはこれくらいでしょうか。
| フラグ | 意味 |
|---|---|
| CI | サブフォルダのみに影響 |
| OI | ファイルのみに影響 |
| IO | フォルダ自身には影響しない |
| NP | サブフォルダに継承させない |
先の例ですと、OICI なので、フォルダ自身、サブフォルダ、ファイルに影響します。
権限
0x で始まる16進数か、あらかじめ決められている文字列の羅列になります。
オブジェクトのGUID
ある特定のACE構造体 (Win32 プログラムで使うやつ)の ObjectType メンバーに格納する値です。
たぶん、どんなACEを記述するかによって、値の意味が変わるのだと思われます。
継承オブジェクトのGUID
ある特定のACE構造体 (Win32 プログラムで使うやつ)の InheritedObjectType メンバーに格納する値です。
たぶん、どんなACEを記述するかによって、値の意味が変わるのだと思われます。
アカウントのSID
このACEが適用されるアカウントのSIDです。
参考リンクまとめ
記事内に書いたリンク先のまとめです。