「退職者のアカウントが半年間有効なままでした」——インシデント調査の中でこのセリフが出てくることがあります。退職処理はHRが行ったが、ADのアカウント無効化が漏れていた。誰も気づかないまま半年が経過し、そのアカウントが不正アクセスの踏み台になっていました。
ADは「構築したら終わり」ではありません。運用の中で権限は肥大化し、設定は形骸化し、不要なアカウントが残り続けます。定期的な監査なしに、ADのセキュリティは維持できません。
この記事では、AD環境のセキュリティ監査で確認すべき対象と、PowerShellを使った効率的な監査手順を解説します。
ADセキュリティ監査とは——何を・なぜ確認するのか
ADセキュリティ監査 Active Directory環境において、アカウント・権限・設定・ログを定期的に確認し、セキュリティ上のリスクを早期に発見・是正する活動。内部不正の防止・インシデントの予兆検知・コンプライアンス対応の目的で実施する。
監査の目的は3つです。
| 目的 | 内容 |
|---|---|
| 権限の棚卸し | 不要なアカウント・過剰な権限を発見して削除・縮小する |
| 設定の健全性確認 | GPOやパスワードポリシーが意図通り機能しているか確認する |
| 異常の早期発見 | 不審なログイン・権限変更・設定変更の痕跡を検知する |
監査の頻度は以下を目安にしてください。
| 監査種別 | 推奨頻度 |
|---|---|
| アカウント棚卸し | 月次 |
| 特権アカウントの確認 | 月次 |
| GPO・セキュリティ設定の確認 | 四半期 |
| ログの確認 | 週次〜月次 |
| 全体的な監査 | 年次 |

監査対象①——アカウント・権限の棚卸し
無効化すべきアカウントの確認
最初に確認すべきは長期間ログインがないアカウントです。退職者・異動者・休職者のアカウントが有効なまま残っているケースが多いです。
# 90日以上ログインがないアカウントを一覧表示する
$date = (Get-Date).AddDays(-90)
Get-ADUser -Filter {
LastLogonDate -lt $date -and Enabled -eq $true
} -Properties LastLogonDate, Department |
Select-Object Name, SamAccountName, LastLogonDate, Department
【出力結果】

出力されたCSVを人事部門と突き合わせて、退職・異動済みのアカウントを無効化します。
特権グループのメンバー確認
Domain Admins・Enterprise Admins・Schema Adminsなどの特権グループは定期的にメンバーを確認します。知らないうちにメンバーが追加されているケースがあります。
# 特権グループのメンバーを一覧表示する
$groups = @(
"Domain Admins",
"Enterprise Admins",
"Schema Admins",
"Backup Operators",
"Account Operators"
)
foreach ($group in $groups) {
Write-Output "=== $group ==="
Get-ADGroupMember -Identity $group -Recursive |
Select-Object Name, SamAccountName, objectClass
}
【出力結果】

確認のポイントは以下です。
- メンバーが必要最低限の人数になっているか
- サービスアカウントや不明なアカウントが含まれていないか
- 前回確認時から追加・削除がないか
パスワードが無期限のアカウントの確認
パスワードが無期限に設定されているアカウントは攻撃者に狙われやすいです。特にサービスアカウントで設定されているケースが多いです。
# パスワードが無期限のアカウントを一覧表示する
Get-ADUser -Filter {
PasswordNeverExpires -eq $true -and Enabled -eq $true
} -Properties PasswordNeverExpires, Description |
Select-Object Name, SamAccountName, Description |
Export-Csv -Path "C:\audit\password_never_expires.csv" -Encoding UTF8 -NoTypeInformation
【出力結果】※本来はCSVファイルに出力されます。

サービスアカウントでパスワード無期限が必要な場合は、説明欄(Description)に理由を記載し、管理台帳で管理してください。
管理者権限を持つアカウントの確認
ローカルの管理者グループに追加されているアカウントも確認対象です。GPOで制御していても、個別に追加されているケースがあります。
監査対象②——GPOとセキュリティ設定の確認
パスワードポリシーの確認
ドメインのパスワードポリシーが意図通りに設定されているか確認します。
# ドメインのパスワードポリシーを確認する
Get-ADDefaultDomainPasswordPolicy |
Select-Object MinPasswordLength, PasswordHistoryCount,
MaxPasswordAge, LockoutThreshold,
LockoutDuration, LockoutObservationWindow
【出力結果】

推奨値と比較して確認してください。
| 設定項目 | 推奨値 |
|---|---|
| 最小パスワード長 | 14文字以上 |
| パスワード履歴 | 24回以上 |
| アカウントロックアウトしきい値 | 5〜10回 |
| ロックアウト期間 | 30分以上 |
GPOの適用状況確認
GPOが意図したOUに正しくリンクされているか確認します。
# ドメイン内の全GPOとリンク先を一覧表示する
Get-GPO -All | ForEach-Object {
$gpo = $_
$links = (Get-GPOReport -Guid $gpo.Id -ReportType XML) -as [xml]
[PSCustomObject]@{
GPO名 = $gpo.DisplayName
状態 = $gpo.GpoStatus
作成日 = $gpo.CreationTime
}
} | Export-Csv -Path "C:\audit\gpo_list.csv" -Encoding UTF8 -NoTypeInformation
【出力結果】※本来はCSVファイルに出力されます。

特に確認すべき点は以下です。
- 使用されていない(リンクなし)GPOが残っていないか
- 無効化されているGPOが意図的なものか
- セキュリティ設定GPOがドメインルートに正しくリンクされているか
Kerberos委任の確認
Kerberos委任(Kerberos Delegation) あるサービスアカウントが、ユーザーの代わりに別のサービスにアクセスできる仕組み。設定を誤ると攻撃者に悪用される可能性があるため、定期的な確認が必要。
無制限委任(Unconstrained Delegation)が設定されているアカウント・コンピュータは攻撃者に悪用されるリスクがあります。
# 無制限委任が設定されているアカウントを確認する(DCを除く)
Get-ADComputer -Filter {
TrustedForDelegation -eq $true
} -Properties TrustedForDelegation |
Where-Object { $_.DistinguishedName -notlike "*Domain Controllers*" } |
Select-Object Name, DistinguishedName
Get-ADUser -Filter {
TrustedForDelegation -eq $true
} -Properties TrustedForDelegation |
Select-Object Name, SamAccountName
DC以外で無制限委任が設定されている場合は、制約付き委任(Constrained Delegation)への変更を検討してください。
監査対象③——ログと異常の確認
特権アカウントの使用状況確認
管理者アカウントがいつ・どこから使われているかを確認します。深夜や休日の使用・普段と異なる端末からの使用は要注意です。
確認すべき主なイベントIDは以下です。
| イベントID | 内容 |
|---|---|
| 4624 | ログオン成功 |
| 4625 | ログオン失敗 |
| 4648 | 明示的な資格情報でのログオン |
| 4728 | セキュリティグループへのメンバー追加 |
| 4732 | ローカルグループへのメンバー追加 |
| 4756 | ユニバーサルグループへのメンバー追加 |
Windowsイベントログの詳細については「Windowsイベントログ重要ID一覧|セキュリティ調査で使うIDまとめ」を参照してください。
AD設定変更の確認
ADの設定変更(グループへのメンバー追加・GPO変更・アカウント作成)が正当な操作によるものかを確認します。
# 直近30日間のAD設定変更イベントを収集する
$startDate = (Get-Date).AddDays(-30)
Get-WinEvent -ComputerName "DC01" -FilterHashtable @{
LogName = "Security"
Id = @(4728, 4732, 4756, 4720, 4722)
StartTime = $startDate
} | Select-Object TimeCreated, Id, Message |
Export-Csv -Path "C:\audit\ad_changes.csv" -Encoding UTF8 -NoTypeInformation
【出力結果】

よくある失敗パターン4選
① 監査をやりっぱなしにする
「棚卸しリストは作ったが、無効化・削除の対応をしていない」というケースです。監査は「問題を発見すること」が目的ではなく、「発見した問題を是正すること」が目的です。監査結果には必ず対応期限と担当者を設定し、是正まで完結させてください。
② 特権グループの監査を見落とす
一般アカウントの棚卸しは行っているが、Domain Adminsなどの特権グループのメンバー確認を忘れているケースがあります。特権グループへの不正なメンバー追加は攻撃者の権限昇格の典型的な手口です。特権グループは一般アカウントより高頻度で確認してください。
③ サービスアカウントを監査対象から外す
「サービスアカウントは自動処理用だから変更しない」という思い込みで監査対象から外しているケースがあります。サービスアカウントはパスワード無期限・高権限のものが多く、攻撃者に狙われやすい対象です。必ず監査対象に含めてください。
④ 監査結果を記録・比較しない
毎回の監査結果をCSVで出力しているが、前回との比較をしていないパターンです。変化を検知することが監査の核心です。前回比較で「増えたアカウント」「追加されたグループメンバー」を発見することに価値があります。監査結果は必ず保存し、前回との差分を確認してください。
定期監査チェックリスト
月次確認(アカウント・権限)
- [ ] 90日以上未ログインのアカウントを確認・無効化した
- [ ] Domain Admins・Enterprise Adminsのメンバーを確認した
- [ ] 新規作成された特権アカウントを確認した
- [ ] 前月からの権限変更(グループメンバー追加・削除)を確認した
四半期確認(設定)
- [ ] ドメインパスワードポリシーの設定値を確認した
- [ ] GPOのリンク状態・有効・無効を確認した
- [ ] パスワード無期限アカウントのリストを確認・更新した
- [ ] Kerberos無制限委任の設定を確認した
- [ ] ローカル管理者グループのメンバーを主要端末で確認した
年次確認(全体)
- [ ] 全アカウントと組織の人員を突き合わせた
- [ ] 全特権アカウントの業務上の必要性を確認した
- [ ] GPOの整理(不要なGPOの削除)を実施した
- [ ] 監査手順書を最新の状態に更新した
監査結果の管理
- [ ] 監査結果をCSVで保存・記録した
- [ ] 前回との差分を確認した
- [ ] 発見した問題に対応期限・担当者を設定した
- [ ] 是正が完了したことを確認した
まとめ
今日確認すべきことは1つです。
Domain Adminsグループのメンバーを今すぐ確認してください。
Get-ADGroupMember -Identity "Domain Admins" -Recursive | Select-Object Name, SamAccountName を実行して、現在のメンバーを確認します。知らないアカウントや不要になったアカウントが含まれていた場合は、即座に是正してください。
AD監査は「一度やれば終わり」ではなく、定期的に繰り返すことで初めて効果を発揮します。まず月次の「アカウント棚卸し」と「特権グループ確認」から始めて、運用として定着させてください。
あわせてご覧ください


コメント