PowerShell ログを収集する
このドキュメントでは、Bindplane を使用して PowerShell ログを Google Security Operations に収集する方法について説明します。パーサーは、未加工の Microsoft PowerShell ログを統合データモデル(UDM)に変換します。まず、未加工のログメッセージからフィールドを抽出し、UDM フィールドに正規化します。次に、特定のイベント ID に基づいて追加のコンテキストでデータを拡充し、最終的にセキュリティ分析用の構造化 UDM イベントを作成します。
始める前に
- Google SecOps インスタンスがあることを確認します。
- Windows 2016 以降があることを確認します。
- プロキシの背後で実行している場合は、ファイアウォール ポートが開いていることを確認します。
Google SecOps の取り込み認証ファイルを取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [コレクション エージェント] に移動します。
- Ingestion Authentication File をダウンロードします。Bindplane をインストールするシステムにファイルを安全に保存します。
Google SecOps のお客様 ID を取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [プロファイル] に移動します。
- [組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。
Windows に Bindplane エージェントをインストールする
- 管理者として コマンド プロンプトまたは PowerShell を開きます。
次のコマンドを実行します。
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
その他のインストール リソース
- その他のインストール オプションについては、こちらのインストール ガイドをご覧ください。
Syslog を取り込んで Google SecOps に送信するように Bindplane エージェントを構成する
- YAML ファイルを構成する前に、[サービス] パネルで
observIQ Distro for Open Telemetry Collector
Service を停止します。 構成ファイルにアクセスします。
config.yaml
ファイルを見つけます。通常、Linux では/etc/bindplane-agent/
ディレクトリに、Windows ではインストール ディレクトリにあります。- テキスト エディタ(
nano
、vi
、メモ帳など)を使用してファイルを開きます。
config.yaml
ファイルを次のように編集します。receivers: windowseventlog/powershell: channel: Microsoft-Windows-PowerShell/Operational max_reads: 100 poll_interval: 5s raw: true start_at: end processors: batch: exporters: chronicle/powershell: endpoint: malachiteingestion-pa.googleapis.com # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' log_type: 'POWERSHELL' override_log_type: false raw_log_field: body customer_id: '<customer_id>' service: pipelines: logs/winpowershell: receivers: - windowseventlog/powershell processors: [batch] exporters: [chronicle/powershell]
<customer_id>
は、実際の顧客 ID に置き換えます。/path/to/ingestion-authentication-file.json
の値を、Google SecOps の取り込み認証ファイルを取得するで認証ファイルを保存したパスに更新します。config.yaml
ファイルを保存したら、observIQ Distro for Open Telemetry Collector
Service を開始します。
Bindplane エージェントを再起動して変更を適用する
Windows で Bindplane エージェントを再起動するには、Services コンソールを使用するか、次のコマンドを入力します。
net stop BindPlaneAgent && net start BindPlaneAgent
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
AccountName | principal.user.userid | 未加工ログの AccountName フィールドから直接マッピングされます。 |
ActivityID | security_result.detection_fields[0].value | 未加工ログの ActivityID フィールドから直接マッピングされます。中かっこが削除されます。 |
チャンネル | IDM オブジェクトにはマッピングされません。 | |
collection_time.nanos | IDM オブジェクトにはマッピングされません。 | |
collection_time.seconds | IDM オブジェクトにはマッピングされません。 | |
コマンド | IDM オブジェクトにはマッピングされません。 | |
CommandLine | IDM オブジェクトにはマッピングされません。 | |
パソコン | principal.hostname | 存在する場合、未加工ログの Computer フィールドから直接マッピングされます。 |
ContextInfo | IDM オブジェクトにはマッピングされません。 | |
ContextInfo_Command Name | security_result.detection_fields[0].value | 存在する場合、未加工ログの ContextInfo_Command Name フィールドから直接マッピングされます。 |
ContextInfo_Command 型 | security_result.detection_fields[1].value | 存在する場合、未加工ログの ContextInfo_Command Type フィールドから直接マッピングされます。 |
ContextInfo_Host アプリケーション | target.process.command_line | powershell.Host Application が存在しない場合、未加工ログの ContextInfo_Host Application フィールドから直接マッピングされます。 |
ContextInfo_Host ID | target.asset.asset_id | powershell.Host ID が存在しない場合、未加工ログの ContextInfo_Host ID フィールドから直接マッピングされます。値の先頭には Host ID: が付加されます。 |
ContextInfo_Host Name | target.hostname | powershell.Host Name が存在しない場合、未加工ログの ContextInfo_Host Name フィールドから直接マッピングされます。 |
ContextInfo_Script Name | target.process.file.full_path | script_name が存在しない場合、未加工ログの ContextInfo_Script Name フィールドから直接マッピングされます。 |
ContextInfo_Sequence Number | security_result.detection_fields[2].value | 存在する場合、未加工ログの ContextInfo_Sequence Number フィールドから直接マッピングされます。文字列に変換されました。 |
ContextInfo_Severity | IDM オブジェクトにはマッピングされません。 | |
create_time.nanos | IDM オブジェクトにはマッピングされません。 | |
create_time.seconds | IDM オブジェクトにはマッピングされません。 | |
customer_id | IDM オブジェクトにはマッピングされません。 | |
データ | IDM オブジェクトにはマッピングされません。 | |
データ | security_result.detection_fields[0].value | 存在する場合、未加工ログの Data フィールドから直接マッピングされます。 |
Data_1 | security_result.detection_fields[1].value | 存在する場合、未加工ログの Data_1 フィールドから直接マッピングされます。 |
Data_2 | security_result.detection_fields[2].value | 存在する場合、未加工ログの Data_2 フィールドから直接マッピングされます。 |
ドメイン | principal.administrative_domain | 未加工ログの Domain フィールドから直接マッピングされます。 |
entries | IDM オブジェクトにはマッピングされません。 | |
ERROR_EVT_UNRESOLVED | IDM オブジェクトにはマッピングされません。 | |
EventCategory | IDM オブジェクトにはマッピングされません。 | |
EventData | IDM オブジェクトにはマッピングされません。 | |
EventID | metadata.product_event_type、security_result.rule_name | 未加工ログの EventID フィールドから直接マッピングされます。値には、security_result.rule_name フィールドの EventID: が接頭辞として付加されます。 |
EventLevel | IDM オブジェクトにはマッピングされません。 | |
EventLevelName | security_result.severity | EventLevelName の値に基づいてマッピングされます。- Information は INFORMATIONAL にマッピングされます。- Verbose は LOW にマッピングされます。 |
EventLog | IDM オブジェクトにはマッピングされません。 | |
EventReceivedTime | IDM オブジェクトにはマッピングされません。 | |
EventType | IDM オブジェクトにはマッピングされません。 | |
EventTime | metadata.event_timestamp | タイムスタンプが存在する場合に、タイムスタンプを抽出するために使用されます。 |
ExecutionProcessID | principal.process.pid | 未加工ログの ExecutionProcessID フィールドから直接マッピングされます(存在し、空でも 0 でもない場合)。文字列に変換されました。 |
ExecutionThreadID | security_result.detection_fields[2].value | 未加工ログの ExecutionThreadID フィールドから直接マッピングされます(存在し、空でも 0 でもない場合)。文字列に変換されました。 |
ファイル | target.process.file.full_path | 存在する場合、未加工ログの File フィールドから直接マッピングされます。 |
ホスト アプリケーション | IDM オブジェクトにはマッピングされません。 | |
HostApplication | IDM オブジェクトにはマッピングされません。 | |
ホスト名 | principal.hostname | 未加工ログの Hostname フィールドから直接マッピングされます。 |
id | IDM オブジェクトにはマッピングされません。 | |
キーワード | IDM オブジェクトにはマッピングされません。 | |
log_type | metadata.log_type | 未加工ログの log_type フィールドから直接マッピングされます。 |
マシン | principal.asset.asset_id、principal.asset.platform_software.platform_version | Machine フィールドが解析され、マシン ID とプラットフォーム情報が抽出されます。マシン ID には接頭辞 Machine ID: が付きます。プラットフォームは、値に基づいて UDM 列挙型にマッピングされます。- win は WINDOWS にマッピングされます。- mac は MAC にマッピングされます。- lin は LINUX にマッピングされます。- その他の値は UNKNOWN_PLATFORM にマッピングされます。 |
ManagementGroupName | additional.fields[0].value.string_value | 存在する場合、未加工ログの ManagementGroupName フィールドから直接マッピングされます。 |
Message.EventTime | metadata.event_timestamp | タイムスタンプが存在する場合、その抽出に使用されます。文字列に変換されました。 |
Message.Message | security_result.description | EventID が [403 、4103 、4104 ] と message_message_not_found にある場合、未加工ログの Message.Message フィールドから直接マッピングされます。改行とタブはカンマに置き換えられます。 |
メッセージ | security_result.description | 存在する場合、未加工ログの Message フィールドから直接マッピングされます。 |
MessageNumber | IDM オブジェクトにはマッピングされません。 | |
MessageSourceAddress | principal.ip | 存在する場合、未加工ログの MessageSourceAddress フィールドから直接マッピングされます。 |
MessageTotal | IDM オブジェクトにはマッピングされません。 | |
MG | IDM オブジェクトにはマッピングされません。 | |
オペコード | metadata.description | 未加工ログの Opcode フィールドから直接マッピングされます。 |
OpcodeValue | IDM オブジェクトにはマッピングされません。 | |
出力 | security_result.detection_fields[0].value | 存在する場合、未加工ログの Output フィールドから直接マッピングされます。 |
powershell.Command Name | security_result.detection_fields[0].value | 存在する場合に powershell.Command Name フィールドから直接マッピングされます。 |
powershell.Command Type | security_result.detection_fields[1].value | 存在する場合に powershell.Command Type フィールドから直接マッピングされます。 |
powershell.Host Application | target.process.command_line | 存在する場合、未加工ログの powershell.Host Application フィールドから直接マッピングされます。 |
powershell.Host ID | target.asset.asset_id | 存在する場合、未加工ログの powershell.Host ID フィールドから直接マッピングされます。値の先頭には Host ID: が付加されます。 |
powershell.Host Name | target.hostname | 存在する場合、未加工ログの powershell.Host Name フィールドから直接マッピングされます。 |
powershell.HostApplication | target.process.command_line | 存在する場合、未加工ログの powershell.HostApplication フィールドから直接マッピングされます。 |
powershell.HostId | target.asset.asset_id | 存在する場合、未加工ログの powershell.HostId フィールドから直接マッピングされます。値の先頭には Host ID: が付加されます。 |
powershell.HostName | target.hostname | 存在する場合、未加工ログの powershell.HostName フィールドから直接マッピングされます。 |
powershell.Script Name | target.process.file.full_path | 存在する場合、未加工ログの powershell.Script Name フィールドから直接マッピングされます。 |
powershell.ScriptName | target.process.file.full_path | 存在する場合、未加工ログの powershell.ScriptName フィールドから直接マッピングされます。 |
powershell.Sequence Number | security_result.detection_fields[2].value | 存在する場合、未加工ログの powershell.Sequence Number フィールドから直接マッピングされます。 |
powershell.SequenceNumber | security_result.detection_fields[0].value | 存在する場合、未加工ログの powershell.SequenceNumber フィールドから直接マッピングされます。 |
powershell.UserId | principal.user.userid | 存在する場合、未加工ログの powershell.UserId フィールドから直接マッピングされます。 |
プロセス ID | principal.process.pid | ExecutionProcessID と ProcessID が存在しないか、空か、0 の場合、未加工ログの Process ID フィールドから直接マッピングされます。文字列に変換されました。 |
ProcessID | principal.process.pid | ExecutionProcessID が存在しないか、空であるか、0 である場合、未加工ログの ProcessID フィールドから直接マッピングされます。文字列に変換されました。 |
ProviderGuid | metadata.product_deployment_id | 未加工ログの ProviderGuid フィールドから直接マッピングされます。中かっこが削除されます。 |
PSEdition | IDM オブジェクトにはマッピングされません。 | |
PSRemotingProtocolVersion | IDM オブジェクトにはマッピングされません。 | |
PSVersion | IDM オブジェクトにはマッピングされません。 | |
RecordNumber | metadata.product_log_id | 未加工ログの RecordNumber フィールドから直接マッピングされます。文字列に変換されました。 |
RenderedDescription | security_result.description | 存在する場合、未加工ログの RenderedDescription フィールドから直接マッピングされます。 |
RunAs ユーザー | IDM オブジェクトにはマッピングされません。 | |
ScriptBlockId | IDM オブジェクトにはマッピングされません。 | |
ScriptBlockText | security_result.detection_fields[0].value | 存在する場合、未加工ログの ScriptBlockText フィールドから直接マッピングされます。 |
ScriptBlock ID | IDM オブジェクトにはマッピングされません。 | |
重大度 | security_result.severity、security_result.severity_details | Severity の値に基づいてマッピングされます。- verbose または info は LOW にマッピングされます。- warn または err は MEDIUM にマッピングされます。- crit は HIGH にマッピングされます。: 生の値も security_result.severity_details にマッピングされます。 |
source.collector_id | IDM オブジェクトにはマッピングされません。 | |
source.customer_id | IDM オブジェクトにはマッピングされません。 | |
ソース | additional.fields[1].value.string_value | 存在する場合、未加工ログの Source フィールドから直接マッピングされます。 |
SourceModuleName | principal.resource.name | 未加工ログの SourceModuleName フィールドから直接マッピングされます。 |
SourceModuleType | principal.resource.resource_subtype | 未加工ログの SourceModuleType フィールドから直接マッピングされます。 |
SourceName | metadata.product_name | 未加工ログの SourceName フィールドから直接マッピングされます。 |
start_time.nanos | IDM オブジェクトにはマッピングされません。 | |
start_time.seconds | IDM オブジェクトにはマッピングされません。 | |
TenantId | additional.fields[2].value.string_value | 存在する場合、未加工ログの TenantId フィールドから直接マッピングされます。 |
ThreadID | IDM オブジェクトにはマッピングされません。 | |
timestamp.nanos | IDM オブジェクトにはマッピングされません。 | |
timestamp.seconds | IDM オブジェクトにはマッピングされません。 | |
type | IDM オブジェクトにはマッピングされません。 | |
UserID | principal.user.windows_sid | 未加工ログの UserID フィールドから直接マッピングされます。 |
ユーザー名 | principal.user.userid | AccountName が存在しない場合、未加工ログの Username フィールドから直接マッピングされます。 |
metadata.vendor_name | Microsoft に設定します。 |
|
metadata.event_type | EventID が 4104 で、_Path が Message に存在する場合、または EventID が 4103 の場合、または EventID が [800 、600 、400 ] にあり、powershell.ScriptName と powershell.HostApplication が存在する場合は、PROCESS_LAUNCH に設定されます。EventID が 403 で、_HostApplication が Message に存在する場合、または EventID が 403 で、NewEngineState が Stopped の場合、PROCESS_TERMINATION に設定します。EventID が 4104 で、_Path が Message に存在しない場合、または EventID が 4103 で、no_value 、script_name が空で、script_name_not_found 、host_application_not_found がすべて true の場合、または EventID が 53504 の場合、または EventID が 40962 の場合、または EventID が 40961 の場合、または EventID が空で MessageSourceAddress が存在する場合は、STATUS_UPDATE に設定します。EventID が空で Username が存在する場合、USER_UNCATEGORIZED に設定します。EventID が空で、MessageSourceAddress と Username が存在しない場合は GENERIC_EVENT に設定します。 |
|
metadata.product_name | SourceName が存在しない場合は、Powershell に設定します。 |
|
security_result.action | ALLOW に設定します。 |
|
security_result.detection_fields[0].key | Activity ID に設定します。 |
|
security_result.detection_fields[1].key | Sequence Number に設定します。 |
|
security_result.detection_fields[2].key | ExecutionThreadID に設定します。 |
|
additional.fields[0].key | Management Group Name に設定します。 |
|
additional.fields[1].key | Source に設定します。 |
|
additional.fields[2].key | TenantId に設定します。 |
|
principal.asset.platform_software.platform | platform_software に win が含まれている場合は WINDOWS 、mac が含まれている場合は MAC 、lin が含まれている場合は LINUX 、それ以外の場合は UNKNOWN_PLATFORM に設定します。 |
|
target.process.file.full_path | EventID が 4104 で、_Path が Message に存在する場合、_Path に設定します。EventID が 4104 で、file_path が Message に存在する場合、file_path に設定します。EventID が 403 で、_HostApplication が Message に存在する場合、_HostApplication に設定します。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。