はじめに
Active Directory(AD)は、社内ネットワークにおける「身分証明書の発行所」であり、すべてのアクセス権限を司るインフラの心臓部です。
攻撃者がドメインコントローラー(DC)や特権アカウントへの足がかりを得た場合、真っ先に行うのが「隠蔽工作と永続化(Persistence)」です。具体的には、人知れずバックドア用のアカウントを作成したり、一般ユーザーを「Domain Admins」に追加したり、GPO(グループポリシー)を改ざんして全端末にマルウェアを配布しようとします。
こうした不正操作をリアルタイムに検知し、インシデント発生時に「誰が・いつ・どのオブジェクトの・どの属性を変更したか」を正確に立証するのが「ディレクトリサービスの変更監査」です。
この記事では、ADの変更監査を有効化するための高度な監査ポリシー設計、最重要イベントID、そしてPowerShellを用いた追跡クエリを解説します。
Linuxエンジニア向けの例え
OpenLDAPでいう auditlog オーバーレイや389 Directory ServerのRetro Changelogプラグインに近い発想です。デフォルトではLDAPへの書き込み操作の「成否」しか残らず、「どの属性がどの値からどの値に変わったか」までは見えないことが多いため、OpenLDAPでも accesslog オーバーレイを別途有効化して差分を記録する運用が一般的です。ADにおける「ディレクトリ サービスの変更の監査」+SACL設定は、まさにこの accesslog オーバーレイに相当する「変更前後の値まで追跡する」ための明示的な追加構成だとイメージすると理解しやすいでしょう。
- GPOの編集にはDC管理用GPOへの編集権限、SACLの設定にはドメインルートオブジェクトへの管理権限が必要です。
- SACLを
Everyone×このオブジェクトとすべての下位オブジェクトに設定すると、特に大規模な環境ではセキュリティログの流量が大幅に増加します。本番環境への適用前に、検証環境でログ量とDCのディスク/パフォーマンスへの影響を確認してください。 - イベントID 5136単体は改ざん前後の値を含みますが、認証情報や個人情報を含む属性(例:一部のカスタム属性)が監査対象に含まれていないか、展開前に棚卸しすることを推奨します。
1. なぜ既定(デフォルト)のAD監査では不十分なのか?
初期状態のActive Directoryでも一部のアカウント作成などは記録されますが、以下のような致命的な死角が存在します。
- 「変更前」と「変更後」の値が記録されない: ユーザーの属性(例: 電話番号、所属部署、SPN属性など)が書き換えられても、どの値からどの値に変更されたかが分かりません。
- 高リスクな権限委任(ACL改ざん)が検知できない: オブジェクトに対するアクセス権(「パスワードのリセット権限」を一般ユーザーに付与するなど)の変更が記録されません。
- GPOの改ざん内容が見えない: GPOファイルが編集された事実は分かっても、「具体的にどのセキュリティ設定が緩和されたか」がログに残りません。
これらを可視化するためには、「ディレクトリ サービスの変更の監査(Directory Service Changes)」を明示的に構成し、さらに監視対象オブジェクトにSACL(システムアクセス制御リスト)を設定する必要があります。
2. AD変更監査の有効化手順(GPO + SACL)
ADのオブジェクト変更を属性レベルで詳細に追跡するには、①監査ポリシーの有効化 と ②ディレクトリ上の監査設定(SACL) の両方が必要です。
ステップ1:グループポリシーでのポリシー有効化
「Default Domain Controllers Policy」またはDC専用のGPOを編集します。
パス: コンピューターの構成 → ポリシー → Windows の設定 → セキュリティの設定 → 監査ポリシーの詳細な構成 → 監査ポリシー → DS アクセス
対象ポリシー: 「ディレクトリ サービスの変更の監査」
設定: 「成功」(必要に応じて「失敗」も有効化)
ステップ2:監視対象オブジェクトの SACL 設定
ディレクトリ全体の変更を漏れなくキャプチャするため、ADのルートコンテナに監査エントリ(SACL)を定義します。
-
dsa.msc(Active Directory ユーザーとコンピューター)を開きます。 - 「表示」メニューで 「高度な機能」 にチェックを入れます。
- ドメイン名(例:
corp.local)を右クリック → 「プロパティ」 → 「セキュリティ」タブ → 「詳細設定」 をクリックします。 - 「監査」タブ を選択し、「追加」 をクリックします。
- プリンシパル:
Everyone - 適用先:
このオブジェクトとすべての下位オブジェクト - アクセス許可: 以下の項目にチェックを入れます。
- 「すべてのプロパティの書き込み」
- 「子オブジェクトの作成」
- 「子オブジェクトの削除」
- 「アクセス許可の変更」(※ACL改ざん検知に必須)
これで、AD内の全オブジェクト(ユーザー、グループ、OU、GPOなど)に対する変更操作が監査ログとして生成されるようになります。
3. 監視すべき「最重要イベントID」一覧
ディレクトリサービス監査において、SIEMやSOCで即時アラートを設定すべきイベントIDです。
| イベントID | イベント名 | 監視・検知できる攻撃・不正操作 |
|---|---|---|
| 5136 | ディレクトリ サービス オブジェクトが変更された | 【最重要】属性値の書き換え。SPNの追加(Kerberoasting)、sIDHistoryの付与、シャドウ管理者化。 |
| 5137 | ディレクトリ サービス オブジェクトが作成された | バックドア用アカウントの新規作成、不正なOUやコンピュータの追加。 |
| 5141 | ディレクトリ サービス オブジェクトが削除された | 攻撃後の証拠隠滅、正規アカウントの不正削除。 |
| 4728 | グローバル セキュリティ グループにメンバーが追加された | Domain Admins、Enterprise Admins等の特権グループへのユーザー昇格。 |
| 4738 | ユーザー アカウントが変更された | パスワードの無期限化、アカウントの有効化/無効化切り替え。 |
| 4742 | コンピューター アカウントが変更された | 制約なし委任(Unconstrained Delegation)の不正付与。 |
※ Domain Admins 等のグループはグローバルセキュリティグループのため4728が対象ですが、ローカルセキュリティグループへの追加は4732、ユニバーサルグループへの追加は4756と、スコープによってイベントIDが異なる点に注意してください。
4. イベントID 5136 を読み解く:属性変更の追跡
EID 5136 の最大の強みは、「OperationType(操作の種類)」によって変更前後の値がペアで出力される点です。1回の属性変更につき「古い値の削除」と「新しい値の追加」の計2件のイベントが生成され、共通の OpCorrelationID で相互に紐付けられます。
- Value Added(値の追加): 新しく設定された値
- Value Deleted(値の削除): 変更前に設定されていた元の値
警戒すべき属性の変更例
servicePrincipalName (SPN):
一般ユーザーアカウントに突如SPNが追加された場合、Kerberoasting攻撃の標的を作成している可能性があります。
sIDHistory:
特権ユーザー(RID 500など)のSIDが別アカウントの sIDHistory に注入されると、一般ユーザーの見た目のままドメイン管理者権限を行使できるようになります(SID History Injection)。
adminCount:
通常一般ユーザーでは 0 または未設定ですが、ここが 1 に変化した場合、保護された管理グループに昇格したことを意味します。
5. PowerShellによる不審なAD変更の即時抽出
DC上のセキュリティログから、直近で発生した特権グループの変更や属性変更をPowerShellで抽出するスクリプトです。
特権グループ(Domain Admins等)へのメンバー追加を抽出(EID 4728)
# 直近24時間以内で「セキュリティグループにメンバーが追加された」ログを抽出
$StartTime = (Get-Date).AddDays(-1)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4728; StartTime=$StartTime} | ForEach-Object {
$xml = [xml]$_.ToXml()
$data = $xml.Event.EventData.Data
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
SubjectUser = ($data | Where-Object { $_.Name -eq 'SubjectUserName' }).'#text' # 操作した管理者
TargetUser = ($data | Where-Object { $_.Name -eq 'MemberName' }).'#text' # 追加されたユーザー
TargetGroup = ($data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text' # 対象グループ
}
} | Format-Table -AutoSize
危険な属性変更(EID 5136)の監視
# SPNやsIDHistoryの変更を伴うEID 5136ログを抽出
$Filter = @{
LogName = 'Security'
Id = 5136
StartTime = (Get-Date).AddDays(-1)
}
# OperationTypeはXMLから取得すると "%%14674"(追加)/ "%%14675"(削除)という
# 生のメッセージコードのまま返ってくるため、可読なラベルへのマッピングを用意する
$OpTypeMap = @{
'%%14674' = 'Added'
'%%14675' = 'Deleted'
}
Get-WinEvent -FilterHashtable $Filter | ForEach-Object {
$xml = [xml]$_.ToXml()
$data = $xml.Event.EventData.Data
$attribute = ($data | Where-Object { $_.Name -eq 'AttributeLDAPDisplayName' }).'#text'
# 警戒すべき属性に絞り込み
if ($attribute -in @('servicePrincipalName', 'sIDHistory', 'userAccountControl')) {
$rawOpType = ($data | Where-Object { $_.Name -eq 'OperationType' }).'#text'
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
Operator = ($data | Where-Object { $_.Name -eq 'SubjectUserName' }).'#text'
ObjectDN = ($data | Where-Object { $_.Name -eq 'ObjectDN' }).'#text'
Attribute = $attribute
OpType = if ($OpTypeMap.ContainsKey($rawOpType)) { $OpTypeMap[$rawOpType] } else { $rawOpType }
AttributeVal = ($data | Where-Object { $_.Name -eq 'AttributeValue' }).'#text'
}
}
} | Format-List
ヒント: 1回の変更操作は「Deleted(旧値)」と「Added(新値)」の2イベントに分かれて出力されるため、OpCorrelationID($data 内の該当フィールド)をキーに2件を突き合わせることで「旧値→新値」の完全な差分を再構築できます。
まとめ:ADをブラックボックスにしない
Active Directoryに対する攻撃は、エンドポイントのマルウェア感染とは異なり、「正規の管理機能や属性」を悪用して静かに行われます。
- 高度な監査ポリシーで「ディレクトリサービスの変更」を有効化する
- ドメインルートに適切なSACLを設定し、属性変更を追跡可能にする
- EID 5136(属性変更)と EID 4728(グループメンバー追加)をSIEMで常時アラート監視する
ディレクトリサービスの透明性を確保し、内部不正や侵害された管理者権限によるステルスな権限昇格を水際で食い止めましょう。
今すぐ実行すべき確認コマンド
# 1. 「ディレクトリ サービスの変更の監査」が有効になっているか確認
auditpol /get /subcategory:"ディレクトリ サービスの変更"
# 2. 直近1時間でEID 5136が実際に記録されているか確認(SACL未設定だと0件のまま)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=5136; StartTime=(Get-Date).AddHours(-1)} -ErrorAction SilentlyContinue | Measure-Object
# 3. 直近24時間のDomain Adminsへのメンバー追加有無を確認
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4728; StartTime=(Get-Date).AddDays(-1)} -ErrorAction SilentlyContinue | Measure-Object