PowerShell による管理者監査ログの解析
(この記事は 2015 年 6 月 15 日に Office Blogs に投稿された記事 Parsing the Admin Audit Logs with PowerShell の翻訳です。最新情報については、翻訳元の記事をご参照ください。)
Exchange 2010 で導入された機能の 1 つに管理者監査ログがあります。組織全体の Exchange PowerShell アクティビティの記録を保存して検索できるという、管理者の皆様にとって非常に便利な機能です。
管理者は、Search-AdminAuditLog コマンドレットを使用して管理者監査ログのデータを照会し、呼び出されたコマンドレット、実行日時、コマンド発行者の ID などを調べることができます。しかし、この検索結果はそのままではわかりにくいため、解析、レポート作成、アーカイブなどの一括操作にはあまり適していませんでした。
お客様からは「どのスイッチを使用してどのコマンドレットが実行されたのかを確認できて便利だが、そのスイッチの値が表示されない点を改善してほしい」というご意見を頂きました。このデータは実際には存在しているのですが、明示的でない形で格納されています。
例として、グローバル アドレス一覧で組織のメール ユーザーの多数 (または全員) の電話番号が間違っているという連絡を受けた場合を想定してみましょう。以下のように、全員の番号が「867-5309」になっていたとします。
組織では Office 365 ディレクトリ同期 (DirSync) を使用しているため、オンプレミスの組織内で変更された情報が、Office 365 に同期されたと考えられます。つまり、Search-AdminAuditLog コマンドレットをオンプレミスで実行する必要があります。
この概念は重要です。Office 365 – Exchange Online テナントの送信コネクタの構成変更を調査する場合は、オンプレミスではなく、テナントに対して検索を実行する必要があるのでご注意ください。それでは Jenny の電話番号 (英語) の問題に戻りましょう。
4 月 6 日に変更されたことがわかっているので、この日付に限定して検索を実行します。
Search-AdminAuditLog -StartDate "4/6/2015 12:00:00 AM" -EndDate 4/6/2015 11:20:00 AM" |
(小さくて読みにくい場合は、スクリーンショットをクリックしてください。)
出力からは、Tommy が Set-User コマンドレットを実行したことがわかりますが、使用されたパラメーターや値についての情報はありません。Tommy は正確には何を実行したのでしょうか。詳細はどのようにして確認できるのでしょうか。
1 つの手掛かりとして、「CmdletParameters」と「ModifiedProperties」が中括弧 { } で囲まれていることに注目してください。中括弧は通常、ハッシュ テーブルを示します。ハッシュ テーブルは、単純に名前と値の組み合わせで構成されています。つまり、表示されている情報は、この出力のキーまたは一部のみである可能性があります。より詳細な情報が隠れているかもしれません。
詳細を調査するために、検索結果を $AuditLog という名前の配列に保存します。これで解析しやすくなります。
$AuditLog = Search-AdminAuditLog -StartDate "4/6/2015 12:00:00 AM" -EndDate "4/6/2015 11:20:00 AM" |
次に、この配列の 1 つのエントリを取り出します。配列変数に [0] を付けて呼び出しを行うと、配列内の最初のエントリだけが戻されます。
$AuditLog[0] |
「CmdletParameters」のオブジェクト型を判別するには、GetType() メソッドを使用します。以下のように配列リストであることがわかりました。
$AuditLog[0].CmdletParameters.GetType() |
最後に CmdletParameters 配列リストを戻して、詳細をすべて明らかにしたいと思います。
$AuditLog[0].CmdletParameters |
監査ログに数千ものエントリが存在すると想定した場合、Tommy が変更したすべてのオブジェクトの一覧を生成するにはどうしたらよいでしょうか。もしくは、Tommy が変更したオブジェクトのうち「Phone」属性が変更されたオブジェクトだけをレポートできるでしょうか。
さいわい、この作業にはそれほど時間はかかりません。私の同僚の Matthew Byrd がまさにこれと同じ問題に直面し、上記のステップを実行する PowerShell スクリプトを作成しました。
このスクリプトは、TechNet Gallery からダウンロード (英語) 可能です。資料も用意されており、スクリプト全体には適宜コメントが記述されています。このスクリプトにはヘルプ (get-help .\Get-SimpleAuditLogReport.ps1) が含まれており、Exchange 2010、Exchange 2013、Office 365 - Exchange Online の各環境で使用できます。ここでは詳細な説明は割愛しますが、代わりにこのスクリプトを使用したデモをお見せします。
このスクリプトでは、Search-AdminAuditLog クエリの結果を加工し、わかりやすく詳細な出力形式に設定します。Search-AdminAuditLog クエリを作成し、その出力を Get-SimpleAuditlogReport スクリプトにパイプして、書式設定と解析を行います。
以下に使用例を一部ご紹介します。
まず、結果を PowerShell 画面に出力します。
$Search = Search-AdminAuditLog -StartDate "4/6/2015 12:00:00 AM" -EndDate "4/6/2015 11:20:00 AM"$Search | C:\Scripts\Get-SimpleAuditLogReport.ps1 –agree |
Get-SimpleAuditLogReport.ps1 スクリプトが、$Search 変数に格納されている結果を受け取り、元のコマンド実行を再現しようとしていることがわかります。これは完璧ではありませんが、Exchange シェル ウィンドウへのコピー/貼り付け操作で実行できるコマンドを提供できます。
次に、結果を CSV ファイルに保存します。これは、大量のデータが戻されたり、結果を後ほど使用したりする場合に便利です。
Search-AdminAuditLog -StartDate "4/6/2015 12:00:00 AM" -EndDate "4/6/2015 11:20:00 AM"| C:\Scripts\Get-SimpleAuditlogReport.ps1 -agree | Export-CSV -path C:\temp\auditlog.csv |
続いて、私のお気に入りの出力オブジェクト Out-GridView を使用して結果を表示させます。これは、CSV と PowerShell を組み合わせた便利な出力オプションです。Out-GridView ウィンドウに表示された結果は、並べ替えやフィルター処理を行うことができます。フィルター処理の結果を選択してコピーし、CSV ファイルに貼り付けられます。また、フィルター処理をしていないそのままの結果を CSV ファイルに保存して、後で使用したり、アーカイブとして保管したりすることも可能です。
Search-AdminAuditLog -StartDate "4/6/2015 12:00:00 AM" -EndDate "4/6/2015 11:20:00 AM"| C:\Scripts\Get-SimpleAuditlogReport.ps1 -agree | Out-GridView –PassThru | Export-Csv -Path c:\temp\auditlog.csv |
ここでは、Tommy が実行したコマンドだけに限定し、システム メールボックスである探索メールボックスに対して実行したコマンドは除外します。
フィルター処理した結果をコピーして CSV ファイルに貼り付けます。Out-GridView にはエクスポートや保存機能は組み込まれていません。フィルター処理の結果を保存するには、エントリをクリックし、Ctrl + A キーですべてを選択し、Ctrl + C キーで結果をクリップボードにコピーして、Excel に貼り付けます。
これで完成です。管理者監査ログをマスターできました。Matthew Byrd の便利なスクリプトのおかげで、監査ログを十分に活用することができます。TechNet (英語) でスクリプトをぜひ確認してください。
Brandon Everhardt