Search-UnifiedAuditLog コマンドレット ツールを使用したベスト プラクティス

監査ログは、さまざまなワークロードからのイベントを記録するツールです。 Search-UnifiedAuditLog コマンドレットを使用して、監査ログからデータを検索および取得できます。 このコマンドレットを効果的に使用する方法を理解することが重要です。特に AuditData プロパティの情報を解釈する場合は、ワークロードによってこのプロパティにさまざまな種類の情報が挿入されるためです。

既定では、Search-UnifiedAuditLog コマンドレットは、ResultSize パラメーターを使用して取得する別のレコード数 (最大 5,000 レコード) を指定しない限り、検索要求に対して 100 個の監査レコードを返します。

1 つの検索で、ページ取得を使用して最大 50,000 件の監査レコード を処理できます。 監査ログには大量のデータが含まれる可能性があるため、検索パラメーターを使用する場合は、レコードの数が多くなりすぎないように、できるだけ具体的に指定することが重要です。

Search-UnifiedAuditLog コマンドレットを使用するには、アカウントに Exchange View-Only 監査ログまたは監査ログロールが必要です。 これらのロールは 、コンプライアンス管理と組織管理の役割グループの一部であり、必要に応じて他の役割グループに割り当てることができます。

RecordTypes

RecordType は、レコードを生成したワークロードです。 Search-UnifiedAuditLog コマンドレットを使用して見つかったさまざまな種類のイベントの例を次に示します。

  1. Microsoft Entra IDのグループにメンバーを追加する (AzureActiveDIrectory)
  2. Exchange のメールボックスのプロパティを更新する (ExchangeAdmin)
  3. SharePoint でファイルを削除する (SharePointFileOperation)
  4. Microsoft Teams (MicrosoftTeams) にユーザーをログインする
  5. AIP ハートビート (AipHeartbeat)

これらのイベントは、Search-UnifiedAuditLog コマンドレットを使用して検索および追跡できます。これにより、統合監査ログに記録されているイベントの詳細をフィルター処理して表示できます。

監査データ構造

Search-UnifiedAuditLog -RecordType AipDiscover -StartDate (Get-Date).AddDays(-100) -EndDate (Get-Date)

監査レコードは、一般プロパティ AuditData プロパティの 2 つの部分で構成されます。

全般プロパティ

すべてのワークロードによって同じ方法で設定される一般的なプロパティと、ワークロード固有の情報を含む AuditData プロパティ。 一般的なプロパティには、レコードの種類、作成日、操作、およびユーザー識別子が含まれます。

RunspaceId   : 136b901e-a6bc-4f24-bb58-5c435090df91
RecordType   : AipDiscover
CreationDate : 2022-09-15 5:49:22 PM
UserIds      : AdeleV@M365x23987777.OnMicrosoft.com
Operations   : Access
ResultIndex  : 8
ResultCount  : 8
Identity     : 20728aaf-1964-1a4a-bd72-784fa3c12132
IsValid      : True
ObjectState  : Unchanged

AuditData プロパティ

AuditData プロパティを使用して、イベントに関する最も重要な情報を見つけます。 ワークロードでは、スキーマを使用して監査レコードに挿入するプロパティを記述し、これらのスキーマを使用して監査イベントのペイロードを解釈します。 監査レコードの情報を完全に理解するには、試行錯誤が必要な場合があります。 このプロセスでは、監査ログ レコードの詳細なプロパティに関するガイドが役立ちます。 ユーザーが実行したアクションの詳細は JavaScript Object Notation (JSON) 形式で格納されるため、データを書式設定して情報を抽出するには、さらに処理が必要です。

AuditData:
{
  "SensitivityLabelEventData":{
    "SensitivityLabelId":"8581574a-c314-42e3-bfdc-a63cf96ed86e"
  },
  "SensitiveInfoTypeData":[
    
  ],
  "ProtectionEventData":{
    "IsProtected":false
  },
  "Common":{
    "ApplicationId":"c00e9d32-3c8d-4a7d-832b-029040e7db99",
    "ApplicationName":"Microsoft Azure Information Protection Word Add-In",
    "ProcessName":"WINWORD",
    "Platform":1,
    "DeviceName":"AdeleVanceWindo",
    "Location":"On-premises file shares",
    "ProductVersion":"2.13.49.0"
  },
  "DataState":"Use",
  "ObjectId":"C:\\452Documentcreated.docx",
  "UserId":"AdeleV@M365x23987777.OnMicrosoft.com",
  "ClientIP":"20.237.230.167",
  "Id":"20728aaf-1964-1a4a-bd72-784fa3c12132",
  "RecordType":93,
  "CreationTime":"2022-09-15T17:49:22",
  "Operation":"Access",
  "OrganizationId":"4b080626-0acc-4940-8af8-bfc836ff1a59",
  "UserType":0,
  "UserKey":"AdeleV@M365x23987777.OnMicrosoft.com",
  "Workload":"Aip",
  "Version":1,
  "Scope":1
}

次の表に、AuditData プロパティの詳細を示します。

パラメーター 説明
RecordType Microsoft Entra ID、Microsoft Teams、Exchange 管理、SharePoint ファイル操作など、レコードを生成したワークロードの種類。
CreationTime アクティビティが実行されたときの UTC 形式の日付と時刻。
操作 SharePoint Online の場合に FileViewed などのアイテムに誰かがアクセスしたときに記録される操作。
OrganizationId GUID の形式の一意のテナント識別子。
UserKey アイテムへのアクセスを取得するために使用される ID。通常はグループのメンバーシップによって実現されます。
Workload SharePoint Online、Exchange Online、OneDrive for Business、Microsoft Entra IDなど、イベントを記録したアプリケーションの名前。
ClientIP アクションが発生したクライアント ワークステーションの IP アドレス。
ObjectID アクセスされたオブジェクトへの完全なパス。
UserID アクションの発生の原因となったアカウントのMicrosoft Entraアカウント識別子。
UserAgent アクションの呼び出しに使用されるクライアント。
SourceFileName アクションに関係するファイルの名前。
UserType "0" (通常のユーザー)、"1" (管理者)、または "2" (Microsoft データ センター管理者またはシステム アカウント) の値を持つ、アクションを実行したユーザーの種類。
EventSource ソースが SharePoint か ObjectMode かを示す SharePoint Online でのみ使用されます。
ResultIndex と ResultCount ResultIndex プロパティと ResultCount プロパティは、大きなレコード セットを操作する場合に便利です。 ResultIndex は、返されたセット内のレコード番号を示し、ResultCount は返されたレコードの合計数を示します。 たとえば、ResultIndex が 1 で ResultCount が 125 の場合、表示されるレコードはセットで返される 125 の最初のレコードであることを意味します。
検索で内部タイムアウトが発生した場合、ResultIndex は -1 に設定されます。 管理者は、監査ログと PowerShell コマンドレットの経験を積むにつれて、監査ログが、ドキュメントと対話したユーザーや特定の期間に新しいドキュメントを作成したユーザーを理解するための貴重な情報源であることを発見します。 監査レコードで提供される情報を完全に利用するには、試行錯誤が必要になる場合があります。

正しいセット イベントを見つける

監査ログを検索するときに適切なイベントを見つけるには、探しているものを把握し、適切なフィルターとパラメーターを使用することが重要です。 監査ログには多数のイベントが含まれる場合があり、特定のアクションを検索することは、大規模で障害のあるデータリスト内の小さなオブジェクトを検索する場合と同様に、困難な場合があります。

この問題に対処する方法の 1 つは、関心のあるアクションの監査イベントを生成する手順を実行し、60 分ほど待ってから、イベントが監査ログに取り込まれるようにしてから、その期間内にイベントを検索することです。

これにより、操作するイベントのセットが小さくなり、分析して使用してさらに検索を実行できます。 また、イベントに対してログに記録された Operations / RecordTypes 値を使用して、検索を絞り込み、探している特定のイベントを見つけることもできます。

次に、特定の日付範囲で、非常に具体的な操作を探してデータをフィルター処理する例を示します。 [レコードの種類] を表示して、検索できるレコードの種類を確認します。

次のスクリプトは、特定の操作を検索します。

$Operations = ("SensitivityLabelUpdated", "SensitivityLabelApplied", "FileSensitivityLabelApplied")
$StartDate = (Get-Date).AddDays(-90)
$EndDate = (Get-Date).AddDays(1)
[Array]$Records = Search-UnifiedAuditLog -StartDate $StartDate -EndDate $EndDate -Formatted -ResultSize 5000 -Operations $Operations

次のスクリプトでは、特定のレコードの種類を検索します。 この例では、AipDiscover に を使用します。

Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-100) -EndDate (Get-Date) -RecordType AipDiscover -Operations Access -ResultSize 5 -Formatted | Format-Table UserIds, CreationDate, Operations

次のスクリプトは、結果を配列に格納し、特定の値を検索します。 この例では、CreationDate を使用します。

[array]$Records  = Search-UnifiedAuditLog -RecordType AipDiscover -StartDate (Get-Date).AddDays(-100) -EndDate (Get-Date)
$Records | Where-Object {$_.CreationDate -eq "2022-09-15 5:49:22 PM"}

大量の監査データを管理する

大規模なテナントから多数の監査レコードを取得する必要がある場合、または長期間にわたって複数の操作を検索する必要がある場合は、1 回の検索で 5,000 を超えるレコードが返される可能性があります。

Search-UnifiedAuditLog コマンドレットから大量のデータを管理するには、ReturnLargeSet パラメーターと ReturnNextPreviewPage パラメーターを使用します。 これらのパラメーターを使用すると、大きな結果セットを返す検索を実行し、後続の検索で結果の次のページを取得できます。

  1. SessionId パラメーターを使用して、検索セッションを識別し、取得するページ数を指定します。 これにより、コマンドレットは複数のページのデータをフェッチして返します。
  2. SessionId パラメーターは、Search-UnifiedAuditLog コマンドレットを使用して大量の監査データを検索する場合にも使用されます。 コマンドレットはページあたり最大 5,000 件のレコードを返します。そのため、それ以上のレコードを検索する場合は、SessionId パラメーターを使用して検索セッションを識別し、取得するページ数を指定する必要があります。 その後、コマンドレットはセッション識別子を使用して追加のデータ ページをフェッチし、それらを返します。
  3. 50,000 を超えるレコードを検索する必要がある場合は、作業を複数の検索に分割し、検索ごとに異なる条件を使用します。
  4. 検索の結果を Azure ログ分析、Azure Data Explorer などの外部リポジトリに格納して、簡単にアクセスおよび分析できます。
  5. 検索条件と監査データ管理プロセスを定期的に確認して更新し、適切なデータをキャプチャし、効率的に管理していることを確認します。 これにより、潜在的なセキュリティの問題を把握し、organizationの全体的なセキュリティを向上させることができます。

大量のデータを取得する手順

大量の監査データをフェッチするには、次の手順に従います。

  1. セッション識別子を生成します。
  2. ループを使用して、複数のページのデータを取得します。
  3. Search-UnifiedAuditLog コマンドを繰り返し実行して、使用可能なすべてのデータをフェッチします。
  4. Search-UnifiedAuditLog の各実行のデータを保存します。
  5. すべてのページがフェッチされたら、日付でデータを並べ替え、CSV ファイルにエクスポートします。

Search-UnifiedAuditLog には、SessionID と SessionCommand という大きなデータ セットの取得をサポートする 2 つのパラメーターがあります。 SessionID と SessionCommand の両方を組み合わせて、大規模なデータセットを処理できます。 SessionId パラメーターは、検索セッションを識別するための文字列値を保持します。 単純な数値から、New-Guid コマンドレットで生成された GUID まで、任意の値を使用できます。 セッション識別子が存在すると、複数のページのデータをフェッチする必要がある可能性があることを Search-UnifiedAuditLog に示します。

eg.
$SessionId = "5b5a5a5a-5b5b-5c5c-5d5d-5e5e5e5e5e5e"
$SessionId = "UnifiedAuditLogSearch 01/02/17"

SessionCommand は、大量の監査データを処理する方法を Search-UnifiedAuditLog に示します。 返されたデータに重複レコードが含まれている可能性があります。 このパラメーターは、次のように設定できます。

  • ReturnLargeSet: 返される監査レコードは並べ替え解除されます。 このメソッドを使用して最大 50,000 個の監査レコードをフェッチできますが、データがすべてフェッチされたら、必ずデータを並べ替える必要があります。
  • ReturnNextPreviewPage: Search-UnifiedAuditLog は、日付で並べ替えられた監査レコードを返します。 ただし、このメソッドを使用してフェッチできるのは最大 5,000 レコードのみです。 ページングまたは ResultSize パラメーターを使用して返されるレコードの最大数は 5,000 レコードです。

注:

常に、指定された SessionId 値に同じ SessionCommand 値を使用します。 同じセッション ID に対して ReturnLargeSet と ReturnNextPreviewPage を切り替えないでください。 それ以外の場合、出力は 10,000 件の結果に制限されます。

SessionId サンプル スクリプト

次の例では、スクリプトは最初にExchange Online管理モジュールをインポートし、Exchange Onlineへのリモート接続を作成します。 次に、検索の開始日と終了日を設定し、Search-UnifiedAuditLog コマンドレットを使用して、指定した日付範囲内のエントリを統合監査ログで検索します。

その後、スクリプトは foreach ループを使用して、コマンドレットによって返されるレコードの配列をスキャンし、必要に応じて各レコードを処理します。 この場合、各レコードの操作名とユーザー ID が出力されます。

# Import the Exchange Online Management module
Import-Module ExchangeOnlineManagement
# Create a remote connection to Exchange Online
$UserCredential = Get-Credential
Connect-IPPSSession
# Search the Unified Audit Log for entries with the specified SessionID
$SessionId = "5b5a5a5a-5b5b-5c5c-5d5d-5e5e5e5e5e5e"
$StartDate = (Get-Date).AddDays(-90)
$EndDate = (Get-Date).AddDays(1)
[Array]$Records = Search-UnifiedAuditLog -StartDate $StartDate -EndDate $EndDate -SessionId $SessionId

# Scan through the array of records
foreach ($Record in $Records)
{
    # Process each record as needed
    # For example, you could print the operation name and user identity
    Write-Host "Operation: $($Record.RecordType)"
    Write-Host "User Identity: $($Record.Operations)"
    Write-Host "User Identity: $($Record.AuditData)"
}

ReturnLargeSet サンプル スクリプト

次の例では、Search-UnifiedAuditLog コマンドレットを使用して、指定した開始時刻と終了時刻の間のエントリを監査ログで検索します。 ReturnLargeSet パラメーターは、$parameters オブジェクトで SessionId パラメーターと SessionCommand パラメーターを指定することによって設定されます。 その後、検索の結果がループされ、各エントリがコンソールに出力されます。

ReturnLargeSet: 並べ替えられていないデータを返します。 ページングを使用すると、最大 50,000 件の結果にアクセスできます。 これは、順序付けされた結果が不要で、検索待ち時間用に最適化されている場合に推奨される値です。

# Set the start and end time for the audit log search
$startTime = "01/01/2022 00:00:00"
$endTime = "12/31/2022 23:59:59"

# Set the parameters for the search
$parameters = @{
    StartDate = $startTime
    EndDate = $endTime
    SessionId = "UnifiedAuditLogSearch 01/02/17"
    SessionCommand = "ReturnLargeSet"
}

# Perform the search and store the results in a variable
$results = Search-UnifiedAuditLog @parameters

# Loop through the results and output each entry
for ($i = 0; $i -lt $results.Count; $i++) {
    $entry = $results[$i]
    Write-Output $entry
}

ReturnNextPreviewPage サンプル スクリプト

次のスクリプトは、Search-UnifiedAuditLog コマンドレットと ReturnNextPreviewPage パラメーターを使用して検索を実行します。 検索は、指定した開始時刻と終了時刻を使用して実行されます。 その後、検索の結果がコンソールに出力されます。

# Set the start and end time for the audit log search
$startTime = "01/01/2022 00:00:00"
$endTime = "12/31/2022 23:59:59"

 
# Set the parameters for search
$parameters = @{
    SessionId = "UnifiedAuditLogSearch 01/02/17"
    SessionCommand = "ReturnNextPreviewPage"
    StartDate = $startTime
    EndDate = $endTime
}

# Retrieve results
$resultpage = Search-UnifiedAuditLog @parameters