Windowsでセキュリティ設定を記述するためにはSDDL文字列を利用する。SDDLは、ファイルやサービス、レジストリなどのセキュリティ設定や監査のために利用される。SDDL内では、組み込みのアクセス権やユーザーアカウントは、2文字の英字で省略して記述される。
対象OS:Windows 2000 / Windows XP / Windows Server 2003
Windows OSでは、セキュリティを確保するために、システム内部に存在する各種のオブジェクト(ファイルだけでなく、サービスやプロセス、パイプといった、動的に生成されるものも含む)に対して、アクセス権を設定し、権限を持つユーザーやグループからのアクセスを許可し、それ以外からのアクセスを禁止するなどしている。アクセス権の設定で利用される「アクセス制御リスト(ACL)」については、TIPS「アクセス制御リストACLとは?」で解説しているので、参考にしていただきたい。
ACLの設定内容を確認したり、編集したりするためには、エクスプローラの[プロパティ]ダイアログにある[セキュリティ]タブを使ってGUIで操作する方法と、caclsコマンドを使ってコマンドプロンプト上で操作する方法の2種類がある。
このうち、caclsコマンドを使用する方法では、設定できるアクセス権(属性)に制限があり、全ての属性を設定することはできなかった。これに対して、SDDL表記を利用すれば、全ての権限を指定することができる。
またファイルのアクセス権の設定以外にも、Windows OSのセキュリティ設定では、このSDDLを使って設定作業を行うケースもある。例えば、サポート技術情報の「Windows XP Service Pack 2 を実行しているコンピュータのユーザーにリモート アシスタンスを提供できない」や「[MS06-011] 制限の少ない Windows サービスの DACL により、特権が昇格される」などでは、SDDLを使う例が紹介されている。本TIPSでは、このSDDLについて解説する。
「SDDL(Security Descriptor Definition Language)」とは、セキュリティ記述子を表現するための汎用的な表記方法であり、DACLだけでなく、監査の設定や、DCOMのセキュリティ設定など、セキュリティ関連の設定項目で広く利用されている表記方法である。またWindows OSのシステムファイルの初期設定を行うための各種.INFファイル中では、このSDDL文字列による表記を使って、各種ファイルの初期セキュリティ設定が行われている。例えば以下に示すのは、Windows OSインストール後の各種ファイルやレジストリのセキュリティ設定を行う、「%windir%\inf\defltwk.inf」ファイルの一部である。
*ファイル%windir%\inf\defltwk.infの一部
"%BootDrive%\ntbootdd.sys",2,"D:P(A;;GRGX;;;PU)(A;;GA;;;BA)(A;;GA;;;SY)"
"%BootDrive%\autoexec.bat",2,"D:P(A;;GRGX;;;BU)(A;;GRGWGXSD;;;PU)(A;;GA;;;BA)(A;;GA;;;SY)"
……(中略)……
"%SystemRoot%\Debug\UserMode",2,"D:PAR(A;;0x00100023;;;BU)(A;OIIO;0x00100006;;;BU)(A;CIOI;GRGWGXSD;;;PU)(A;CIOI;GA;;;BA)(A;CIOI;GA;;;SY)"
"%SystemRoot%\Temp",2,"D:P(A;CI;0x100026;;;BU)(A;CIOI;GRGWGXSD;;;PU)(A;CIOI;GA;;;BA)(A;CIOI;GA;;;SY)(A;CIOI;GA;;;CO)"
橙色で示した部分がSDDL文字列の例である。(大文字の)アルファベットや記号類が意味もなく並んでいるように見えるが、これがSDDLによるセキュリティ設定の例であり、例えば一番上の行では、ファイル「ntbootdd.sys」のデフォルトのセキュリティ設定を規定している。
SDDLは、セキュリティ設定を表す属性文字列を、なるべく短い文字列でコンパクトの表現できるように設計されている。具体的には、以下の4つの形式がある。
| SDDL表記 | 用途 |
|---|---|
| O:ユーザーSID | オブジェクト所有者のSIDの指定 |
| G:グループSID | オブジェクトのプライマリグループのSIDの指定 |
| D:DACLフラグ(ACE文字列1)(ACE文字列2)……(ACE文字列n) | DACLの指定 |
| S:SACLフラグ(ACE文字列1)(ACE文字列2)……(ACE文字列n) | SACLの指定 |
| SDDLの4つの形式 上の2つはSIDを指定するための文字列。“D:〜”は「DACL(随意アクセス制御リスト」。リソースに対するアクセスの許可/拒否を制御する)、“S:〜”は「SACL(システムアクセス制御リスト」。リソースに対する監査を制御する)を表すためのSDDL文字列。 | |
このようにいくつか種類があるが、本TIPSではリソースへのアクセスを制御するDACLについて解説する。
リソースへのアクセス制御に使われるDACL(随意アクセス制御リスト)は、“D:〜”という文字列で指定する。先頭の“D:”に続いて、「DACLフラグ」が続き、さらに「ACE(アクセス制御エントリ)文字列」が複数続く。
書式: "D:DACLフラグ(ACE文字列1)(ACE文字列2)……(ACE文字列n)"
例: "D:P(A;;GRGX;;;PU)(A;;GA;;;BA)(A;;GA;;;SY)"
この例では、“P”というDACLフラグに続いて、3つのACEが定義されている。以下、それぞれの要素について、見ていこう(ただしDACL以外の要素についても解説する)。
「DACLフラグ」は、DACLに適用されるセキュリティ記述子の制御用フラグであり、以下のような意味を持つ。
| 文字列 | フラグ名 | 意味 |
|---|---|---|
| "P" | SE_DACL_PROTECTED | DACLが継承されたACEによって変更されないように保護する |
| "AR" | SE_DACL_AUTO_INHERIT_REQ | DACLを子オブジェクトへ継承するように要求する |
| "AI" | SE_DACL_AUTO_INHERITED | 継承によって作成されたDACLであることを示す |
| DACLフラグ文字列とその意味 DACLフラグの文字列は、実際にはセキュリティ記述子の制御用フラグの設定APIのパラメータとして扱われる。これらを組み合わせて使用する(無指定も可能)。 | ||
「ACE文字列」は、DACLを構成するACEを定義するために利用される。例えばAdministratorsにフルコントロールを与えるとか、Everyoneからのアクセスを全て拒否する、といったエントリごとに、ACE文字列を1つずつ定義し、連結して使用する。ACE文字列の書式は次のようになっている。
書式: (ACEタイプ;ACEフラグ;権利;オブジェクトGUID;継承オブジェクトGUID;アカウントSID)
例: (A;CIOI;GRGWGXSD;;;PU)
( ) 内には、ACEタイプやACEフラグなどを表す文字列を、“;”で区切って記述する。これらの文字列は基本的には英大文字2文字で表現されている。この例では「A」「CI」「OI」「GR」「GW」「GX」「SD」「PU」といった要素が組み合わされている。ただし全ての項目が指定されているわけではなく、ACLのバージョンによっては省略されている場合がある(「オブジェクトGUID」と「継承オブジェクトGUID」はActive DirectoryのオブジェクトのACLでのみ使われるもので、通常のACLでは上の例のように空欄となっている)。
以下、それぞれの要素について順に見ていこう。
■「ACEタイプ」
ACEの種類を表す。
| 文字列 | タイプ名 | 意味 |
|---|---|---|
| "A" | SDDL_ACCESS_ALLOWED | アクセス許可 |
| "D" | SDDL_ACCESS_DENIED | アクセス拒否 |
| "OA" | SDDL_OBJECT_ACCESS_ALLOWED | オブジェクトアクセス許可 |
| "OD" | SDDL_OBJECT_ACCESS_DENIED | オブジェクトアクセス拒否 |
| "AU" | SDDL_AUDIT | 監査 |
| "AL" | SDDL_ALARM | 警告 |
| "OU" | SDDL_OBJECT_AUDIT | オブジェクト監査 |
| "OL" | SDDL_OBJECT_ALARM | オブジェクト警告 |
| ACEタイプ文字列 アクセスの許可や禁止を定義する。 | ||
■「ACEフラグ」
ACEの継承に関する情報を表す。
| 文字列 | フラグ名 | 意味 |
|---|---|---|
| "CI" | SDDL_CONTAINER_INHERIT | コンテナ継承 |
| "OI" | SDDL_OBJECT_INHERIT | オブジェクト継承 |
| "NP" | SDDL_NO_PROPAGATE | 伝播なし |
| "IO" | SDDL_INHERIT_ONLY | 継承のみ |
| "ID" | SDDL_INHERITED | 継承 |
| "SA" | SDDL_AUDIT_SUCCESS | 監査成功 |
| "FA" | SDDL_AUDIT_FAILURE | 監査失敗 |
| ACEフラグ文字列 継承方法を定義する。 | ||
■「権利」
オブジェクトのアクセス権を表す。
| 文字列 | 権利名 | 意味 | |
|---|---|---|---|
| 一般アクセス権 | |||
| "GA" | SDDL_GENERIC_ALL | 全アクセス権(読み書き実行) | |
| "GR" | SDDL_GENERIC_READ | 読み出し | |
| "GW" | SDDL_GENERIC_WRITE | 書き込み | |
| "GX" | SDDL_GENERIC_EXECUTE | 実行 | |
| 標準アクセス権 | |||
| "RC" | SDDL_READ_CONTROL | ACL情報の読み取り | |
| "SD" | SDDL_STANDARD_DELETE | 削除 | |
| "WD" | SDDL_WRITE_DAC | DACLの書き込み | |
| "WO" | SDDL_WRITE_OWNER | 所有者情報の書き込み | |
| ディレクトリサービスオブジェクトアクセス権 | |||
| "RP" | SDDL_READ_PROPERTY | オブジェクトのプロパティの読み出し | |
| "WP" | SDDL_WRITE_PROPERTY | オブジェクトのプロパティの書き込み | |
| "CC" | SDDL_CREATE_CHILD | 子オブジェクトの作成 | |
| "DC" | SDDL_DELETE_CHILD | 子オブジェクトの削除 | |
| "LC" | SDDL_LIST_CHILDREN | 子オブジェクトの一覧 | |
| "SW" | SDDL_SELF_WRITE | 検証済み書き込みアクセス権によって制御される操作の実行 | |
| "LO" | SDDL_LIST_OBJECT | オブジェクトの一覧 | |
| "DT" | SDDL_DELETE_TREE | 全ての子オブジェクトの削除 | |
| "CR" | SDDL_CONTROL_ACCESS | 拡張アクセス権によって制御される操作の実行 | |
| ファイルアクセス権 | |||
| "FA" | SDDL_FILE_ALL | 全アクセス権(読み書き実行) | |
| "FR" | SDDL_FILE_READ | 読み出し | |
| "FW" | SDDL_FILE_WRITE | 書き込み | |
| "FX" | SDDL_FILE_EXECUTE | 実行 | |
| レジストリアクセス権 | |||
| "KA" | SDDL_KEY_ALL | 全アクセス権(読み書き実行) | |
| "KR" | SDDL_KEY_READ | 読み出し | |
| "KW" | SDDL_KEY_WRITE | 書き込み | |
| "KX" | SDDL_KEY_EXECUTE | 実行 | |
| 16進数による直接指定 | |||
| 0x???????? | − | 16進数で直接アクセス権をビット指定することも可能 | |
| 権利文字列 許可/禁止される権利を定義する。英字2文字による表記だけでなく、16進数を使って直接指定することも可能(例:0x7800003F)。具体的なアクセス権のビット指定については、Windows OSのPlatform SDK(開発キット)に含まれるsddl.hやWinnt.hインクルードファイル、APIの解説(マイクロソフトMSDN「ACE Strings」[英語])などを参照のこと。 | |||
■「オブジェクトGUID」
パスワードの変更やリセットなど、特別なタスクの実行を許可するための権利を表すオブジェクトのGUID文字列を表す。
| GUID文字列 | 名前 | 意味 |
|---|---|---|
| "ab721a53-1e2f-11d0-9819-00aa0040529b" | User-Change-Password | パスワードの変更権利 |
| "00299570-246d-11d0-a768-00aa006e0529" | User-Force-Change-Password | パスワードのリセットの権利 |
| オブジェクトGUIDの例 利用可能なGUIDの一覧については、マイクロソフトTechnet「スクリプトを使用した Active Directory セキュリティの管理」などを参照のこと。 | ||
■「継承オブジェクトGUID」
ACEを継承するオブジェクトのGUIDを表す文字列を指定する。
■「アカウントSID」
ACEの提供対象となるSIDを表す。SIDについてはTIPS「オブジェクトを識別するSIDとは?」を参照のこと。「S-1-……」といった標準的な形式だけでなく、あらかじめ用意されているアカウントに対しては、以下のような2文字の省略形も使用することができる。
| 文字列 | アカウント名 |
|---|---|
| "AO" | Account operators |
| "AN" | Anonymous Logon |
| "AU" | Authenticated Users |
| "BA" | ビルトイン(Built-in) Administrators |
| "BG" | ビルトイン(Built-in) Guests |
| "BO" | Backup Operators |
| "BU" | ビルトイン(Built-in) Users |
| "CA" | Cert Server Admins |
| "CG" | Creator Group |
| "CO" | Creator Owner |
| "DA" | Domain Administrators |
| "DC" | Domain Computers |
| "DD" | Domain Controllers |
| "DG" | Domain Guests |
| "DU" | Domain Users |
| "EA" | Enterprise Administrators |
| "ED" | Enterprise Domain Controllers |
| "IU" | Interactive |
| "LA" | ローカル(Local) Administrator |
| "LG" | ローカル(Local) Guest |
| "LS" | ローカル(Local) Service |
| "NO" | Network Configuration Operators |
| "NS" | Network Service |
| "NU" | Network |
| "PA" | Group Policy Administrators |
| "PO" | Printer Operators |
| "PS" | Principal Self |
| "PU" | Power Users |
| "RC" | Restricted Code |
| "RD" | Terminal Server Users (RD=Remote Desktop) |
| "RE" | Replicator |
| "RS" | RAS Servers |
| "RU" | Pre-Windows 2000 Compatible Access |
| "SA" | Schema Administrators |
| "SO" | Server Operators |
| "SU" | Service |
| "SY" | ローカル(Local) System |
| "WD" | Everyone (WD=world) |
| "S-1-……" | 標準的な表記によるSID |
| SIDアカウントに指定可能な文字列 あらかじめ用意されているアカウントや組み込みアカウントに対しては、ここに示すように、英字2文字の省略形が用意されている。なおこれらの文字列と対応するIDは、Platform SDKに含まれるSddl.hファイルに記述されている。 | |
以上のようにして合成されたSDDL文字列は、例えばWindows Server 2003のcaclsコマンドなどで使用することができる。これについては別記事の「caclsコマンドでACLを編集する(SDDL編)」を参照していただきたい。
■関連リンク
■更新履歴
【2016/05/25】表「権利文字列」の「標準アクセス権」で、SDDL_STANDARD_DELETE(削除)の文字列を「SR」と記しておりましたが、正しくは「SD」でした。お詫びして訂正いたします。
【2006/03/25】初版公開。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.