Windowsのセキュリティ設定を記述するSDDL文字列とは?Tech TIPS

Windowsでセキュリティ設定を記述するためにはSDDL文字列を利用する。SDDLは、ファイルやサービス、レジストリなどのセキュリティ設定や監査のために利用される。SDDL内では、組み込みのアクセス権やユーザーアカウントは、2文字の英字で省略して記述される。

» 2016年05月25日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
Tech TIPS
Windows Server Insider


「Tech TIPS」のインデックス

連載目次

対象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とは

 「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を表すSDDL文字列

 リソースへのアクセス制御に使われる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フラグ」は、DACLに適用されるセキュリティ記述子の制御用フラグであり、以下のような意味を持つ。

文字列 フラグ名 意味
"P" SE_DACL_PROTECTED DACLが継承されたACEによって変更されないように保護する
"AR" SE_DACL_AUTO_INHERIT_REQ DACLを子オブジェクトへ継承するように要求する
"AI" SE_DACL_AUTO_INHERITED 継承によって作成されたDACLであることを示す
DACLフラグ文字列とその意味
DACLフラグの文字列は、実際にはセキュリティ記述子の制御用フラグの設定APIのパラメータとして扱われる。これらを組み合わせて使用する(無指定も可能)。

●「ACE文字列」の構成

 「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】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。