Active Directoryのグループメンバーシップの変更を効果的に追跡する方法

Active Directory の変更への対応は、特に複数の管理者が関与している場合は、少々面倒です。誰がいつ変更を加えたかが常にわかるとは限りません。これは、セキュリティを監視したり、単にトラブルシューティングをしようとしている場合には非常に重要です。この記事では、Domain AdminsEnterprise AdminsSchema Adminsなどのスーパー特権グループに誰かがユーザーを追加すると、自動的に通知 (メールまたは Messenger 経由) できる監査ポリシーと PowerShell スクリプトの設定について詳しく説明します。基本的に、これは 1 日中ログを手動で調べることなく、重要な変更を監視できる方法です。これを設定すると、新しいユーザーが保護されたグループに参加するたびにアラートがポップアップ表示されるようになり、疑わしいアクティビティを検出したり、承認された変更を確認したりすることが容易になります。

Active Directoryのグループメンバーシップの変更を追跡する方法

ADグループメンバーシップの変更に対する監査ポリシーを有効にする

この部分では、そもそもこれらのグループの変更をログに記録するように Windows を設定する方法について説明します。Windows にこれらのイベントを追跡するように指示しないと、後でアラートが表示されなくなります。基本的には、グループ ポリシー管理コンソール( gpmc.msc ) を開き、既定のドメイン コントローラー ポリシーを編集します。コンピューターの構成 > ポリシー > Windows の設定 > セキュリティの設定 > 詳細な監査の構成 > アカウント管理に移動する必要があります。次に、成功イベントで監査セキュリティ グループ管理ポリシーを有効にします。これにより、Windows は AD グループ メンバーシップの追加、削除、または変更をすべてログに記録します。マシンによっては、適切にログ記録を開始するために再起動または gpupdate /force が必要になる場合があります。これが完了すると、誰かがグループを変更するたびに、イベント ID 4732 (グローバル グループにメンバーが追加された) または 4728 (ローカル グループにメンバーが追加された) のイベントが記録されます。これらのログには、どのグループが変更されたか、誰が変更したか、誰が追加されたかなどの詳細が示されます

PowerShell で変更を報告する

ここからはより実践的な話になります。過去24時間のセキュリティログをスキャンし、変更イベントを抽出するPowerShellスクリプトを実行できます。以下に典型的なスニペットを示します。少しぎこちないですが、目的は達成できます。

$time = (get-date) - (new-timespan -hour 24) $result = Get-WinEvent -FilterHashtable @{logname='Security';id=4732, 4728;StartTime=$Time} -ErrorAction SilentlyContinue | ForEach-Object { $eventXml = ([xml]$_. ToXml()).Event [PSCustomObject]@{ TimeCreated = $eventXml. System. TimeCreated. SystemTime -replace '\.\d+.*$' NewUser = $eventXml. EventData. Data[0]."#text" Group = $eventXml. EventData. Data[2]."#text" Admin = $eventXml. EventData. Data[6]."#text" Computer = $eventXml. System. Computer } } $result | Format-Table -AutoSize 

このスクリプトは、最近のADグループ変更イベントを取得します。取得できる主な情報は、変更されたグループ、追加されたユーザー、変更を行ったユーザーです。簡単な監査に最適です。より対象を絞り込み、例えば特権グループのみにしたい場合は、次のようなフィルターを追加します。

$AdminGroups = @('Enterprise Admins', 'Domain Admins', 'DNSAdmins', 'Microsoft Exchange Servers') $filtered = $result | Where-Object { $_. Group -in $AdminGroups }

こうすることで、大きな重要な変更についてのみ通知が届きます。

メールまたはメッセンジャーアラートを設定する

変更を特定したら、通知を受け取ることが重要です。簡単な方法は、PowerShell でSend-MailMessageを使用することです。

if ($filtered) { $mailBody = $filtered | ConvertTo-Html -Fragment Send-MailMessage -SmtpServer "your.smtp.server" -From "[email protected]" -To "[email protected]" -Subject "AD Group Change Detected" -Body $mailBody -BodyAsHtml -Priority High } 

これにより、権限グループが変更されるたびに、見やすくフォーマットされたHTMLメールが送信されます。MessengerやTeamsをご利用の場合は、Webhookやサードパーティ製モジュールなどを使用してアラートをプッシュできるスクリプトが利用可能です。Teamsの場合は、通常、Incoming Webhookコネクタを作成し、スクリプトでそのコネクタを指定するのが便利です。

すべてのドメインコントローラを監視する

環境が大きく、複数のDCがある場合は、各DCでこの処理を実行する必要があります。一番簡単な方法は?PowerShellを使って、すべてのコントローラーをループ処理することです。

$DCs = Get-ADDomainController -Filter * foreach ($DC in $DCs) { Get-WinEvent -ComputerName $DC. Name -FilterHashtable @{logname='Security';id=4732, 4728;StartTime=$time} # And process the logs as needed } 

あるいは、各DCに(GPOなどを使って)スクリプトを定期的に実行するスケジュールタスクを設定することもできます。そうすれば、一日中ログチェックのためにクリックし続ける必要はありません。設定してしまえば、あとは放っておくだけです。非常に慎重な場合は、SplunkやGraylogなどのSIEMでログを一元管理することもできますが、それはまた別の話です。

確かに、これらすべてを設定するのは面倒に思えますが、一度実行してしまえば、もう手動でログを調べる必要がなくなるので、本当に安心です。さらに、特に大規模で多忙な環境で複数の管理者がいる場合、管理者の不正な操作を早期に発見するのに役立ちます。大規模な環境やセキュリティを重視する組織では、間違いなく導入する価値があります。

まとめ

  • AD グループの変更に対する高度な監査ポリシーを有効にします。
  • PowerShell を使用して最近のイベントをスキャンし、疑わしい変更を探します。
  • 即時通知のために電子メールまたはメッセージアラートを設定します。
  • すべてのドメイン コントローラーにわたってログを繰り返したり、一元管理したりします。

まとめ

このプロセスは完璧ではありません。ログに遅延が生じたり、ポリシーの調整が必要になったり、あらゆる環境ですべてが完璧に機能するとは限りません。しかし、全体としては、手動でログを頻繁に確認することなく、重要なActive Directoryの変更を監視するための確実な一歩となります。導入後は、不正なユーザーの追加を検知したり、混雑した環境で変更を確認したりするのに非常に役立ちます。このプロセスが、誰かがADセキュリティを常に適切に管理するのに役立つことを願っています。