Microsoft PowerShell のログを収集する
このドキュメントでは、Bindplane エージェントを使用して Microsoft PowerShell ログを Google Security Operations に取り込む方法について説明します。
Microsoft PowerShell は、Microsoft のタスク自動化および構成管理フレームワークで、コマンドライン シェルとスクリプト言語で構成されています。PowerShell ログは、スクリプトの実行、モジュールのアクティビティ、コマンドの呼び出しをキャプチャし、セキュリティ モニタリングとフォレンジック分析のために PowerShell の操作を可視化します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- Windows Server 2016 以降
- Windows ホストと Google SecOps 間のネットワーク接続
- プロキシの背後で実行している場合は、Bindplane エージェントの要件に従ってファイアウォール ポートが開いていることを確認します。
- PowerShell ロギングを構成して Bindplane エージェントをインストールするための Windows ホストへの管理者アクセス権
PowerShell ロギングを構成する
ログを収集するには、Windows ホストで PowerShell ロギングを有効にする必要があります。デフォルトでは、PowerShell のロギングは最小限です。スクリプト ブロック ロギングを有効にして、詳細な PowerShell アクティビティをキャプチャします。
グループ ポリシーを使用してスクリプト ブロック ロギングを有効にする
- 管理者として
gpedit.mscを実行して、ローカル グループ ポリシー エディタを開きます。 - [コンピュータの構成] > [管理用テンプレート] > [Windows コンポーネント] > [Windows PowerShell] に移動します。
- [Turn on PowerShell Script Block Logging] をダブルクリックします。
- [有効] を選択します。
- 必要に応じて、[Log script block invocation start / stop events] をオンにして、各スクリプト ブロックの開始イベントと停止イベントをキャプチャします。このオプションでは大量のログが生成されます。
- [OK] をクリックします。
- 管理者としてコマンド プロンプトを開き、
gpupdate /forceを実行してポリシーをすぐに適用します。
レジストリを使用してスクリプト ブロック ロギングを有効にする
または、次のレジストリ値を設定して、スクリプト ブロックのログ記録を有効にすることもできます。
regeditを管理者として実行して、レジストリ エディタを開きます。HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLoggingに移動します。- キーが存在しない場合は作成します。
EnableScriptBlockLoggingという名前の新しい DWORD(32 ビット)値を作成し、その値を1に設定します。- 変更を反映させるために PowerShell セッションを再起動します。
PowerShell スクリプト ブロック ロギングは、イベント ID 4104 を使用して Microsoft-Windows-PowerShell/Operational イベントログ チャネルにイベントを書き込みます。
省略可: モジュールのロギングを有効にする
モジュール ロギングは、指定されたモジュールのパイプライン実行の詳細を記録します。すべてのモジュールでモジュール ロギングを有効にするには、次の操作を行います。
- ローカル グループ ポリシー エディターで、[コンピューターの構成] > [管理用テンプレート] > [Windows コンポーネント] > [Windows PowerShell] に移動します。
- [Turn on Module Logging] をダブルクリックします。
- [有効] を選択します。
- [Module Names] の横にある [Show] をクリックします。
- すべてのモジュールをログに記録するには、「
*」と入力します。 - [Module Names] ウィンドウで [OK] をクリックします。
- [Module Logging] ウィンドウで [OK] をクリックします。
gpupdate /forceを実行してポリシーを適用します。
モジュール ロギング イベントは、イベント ID 4103 で Windows PowerShell イベントログに書き込まれます。
省略可: 文字起こしを有効にする
トランスクリプトは、すべての PowerShell セッションの入出力のテキストベースのレコードを作成します。音声文字変換を有効にするには、次の操作を行います。
- ローカル グループ ポリシー エディタで、[コンピュータの構成] > [管理用テンプレート] > [Windows コンポーネント] > [Windows PowerShell] に移動します。
- [PowerShell の文字起こしを有効にする] をダブルクリックします。
- [有効] を選択します。
- 必要に応じて、文字起こし出力ディレクトリを指定します。空白のままにすると、文字起こしは各ユーザーの [ドキュメント] フォルダに保存されます。
- タイムスタンプとメタデータを含めるには、[Include invocation headers] をオンにします。
- [OK] をクリックします。
gpupdate /forceを実行してポリシーを適用します。
音声文字変換は、PowerShell_transcript で始まる名前のテキスト ファイルに書き込まれます。
Bindplane エージェントの Google SecOps 認証情報を取得する
Bindplane エージェントを Google SecOps に対して認証するには、次のいずれかの方法を選択します。
- 新しいデプロイ: Chronicle API(オプション 1)を使用します。
- 以前のデプロイ: 2027 年 7 月 20 日に Ingestion API が廃止されるまで、取り込み認証ファイル(オプション 2)を引き続き使用します。
オプション 1: Chronicle API のサービス アカウントを作成する(推奨)
- Google Cloud コンソールにログインし、Google SecOps インスタンスにリンクされている Google Cloud プロジェクトを選択します。
- [IAM と管理] > [サービス アカウント] に移動します。
- [サービス アカウントを作成] をクリックします。
- 次の構成情報を指定します。
- サービス アカウント名: アカウントの名前を入力します(例:
bindplane-ingest)。 - サービス アカウントの説明: 説明を入力します(例:
Bindplane agent log ingestion)。
- サービス アカウント名: アカウントの名前を入力します(例:
- [作成して続行] をクリックします。
- [このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、[ロールを選択] をクリックし、[Chronicle 編集者] を選択します。
- [続行] をクリックして [完了] をクリックします。
- 作成したサービス アカウントをクリックし、[キー] タブに移動します。
- [鍵を追加] > [新しい鍵を作成] の順にクリックします。
- [JSON] を選択し、[作成] をクリックします。鍵ファイルがパソコンにダウンロードされます。
- 鍵ファイルを
ingestion-auth.jsonとして Bindplane コレクタ ディレクトリ(Linux の場合は/opt/observiq-otel-collector/ingestion-auth.json、Windows の場合はC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json)に保存するか、config.yamlのcreds_file_pathを更新して、保存先のパスと一致させます。 - [IAM と管理] > [設定] に移動し、[プロジェクト番号] をコピーします。エクスポーターの構成に必要になります。
オプション 2: 取り込み認証ファイルをダウンロードする(以前のバージョン)
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [収集エージェント] に移動します。
- 取り込み認証ファイルをダウンロードします。
- Bindplane エージェントがインストールされるシステムにファイルを安全に保存します。
Google SecOps のお客様 ID を取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [プロファイル] に移動します。
[組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。
Bindplane エージェントをインストールする
次の手順に沿って、Windows ホストに Bindplane エージェントをインストールします。
Windows へのインストール
- 管理者として コマンド プロンプトまたは PowerShell を開きます。
次のコマンドを実行します。
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietインストールが完了するまで待ちます。
次のコマンドを実行して、インストールの内容を確認します。
sc query observiq-otel-collectorサービスは RUNNING と表示されます。
その他のインストール リソース
その他のインストール オプションとトラブルシューティングについては、Bindplane エージェントのインストール ガイドをご覧ください。
PowerShell ログを収集するように Bindplane エージェントを構成する
Windows 構成ファイルを探す
Windows 構成ファイルは次の場所にあります。
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
構成ファイルを編集します。
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: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: '<CUSTOMER_ID>' endpoint: chronicle.googleapis.com log_type: 'POWERSHELL' raw_log_field: body override_log_type: false service: pipelines: logs/powershell: receivers: - windowseventlog/powershell processors: - batch exporters: - chronicle/powershell
構成パラメータ
各プレースホルダを次のように置き換えます。
レシーバーの構成:
channel: 収集する Windows イベントログ チャンネル。PowerShell スクリプト ブロックのロギングには、Microsoft-Windows-PowerShell/Operationalを使用します。モジュールログの場合は、Windows PowerShellを使用します。raw:trueに設定すると、未加工の Windows イベントログ XML が Google SecOps に送信されます。start_at: エージェントの起動後に新しいイベントのみを収集するには、endに設定します。既存のすべてのイベントを収集するには、beginningに設定します。
エクスポータの構成:
<CUSTOMER_ID>: 前のステップのお客様 ID に置き換えます。creds_file_path: サービス アカウントの JSON キーファイルのフルパス(オプション 1)。認証情報ファイルをこの場所にコピーします。location:<LOCATION>は、Google SecOps インスタンスのリージョン(us、europe、asia-southeast1など)に置き換えます。エクスポーターは、chronicle.googleapis.comの先頭にこの値を付加します。完全なリストについては、リージョン エンドポイントをご覧ください。project:<PROJECT_NUMBER>を [IAM と管理] > [設定] のプロジェクト番号に置き換えます。endpoint:chronicle.googleapis.comに設定したままにします。log_type: PowerShell パーサーを使用するには、POWERSHELLに設定します。
以前の Ingestion API エクスポータ
オプション 2 の取り込み認証ファイルを使用する場合は、
exportersブロックを次のように置き換えます。creds_file_pathを取り込み認証ファイルのパスに設定します。インスタンスが米国以外にある場合は、malachiteingestion-pa.googleapis.comをリージョン エンドポイント(例:europe-malachiteingestion-pa.googleapis.com)に置き換えます。exporters: chronicle/powershell: compression: gzip creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: '<CUSTOMER_ID>' endpoint: malachiteingestion-pa.googleapis.com log_type: 'POWERSHELL' raw_log_field: body override_log_type: false
構成ファイルを保存する
編集が完了したら、[File> Save] をクリックしてファイルを保存します。
Bindplane エージェントを再起動して変更を適用する
Windows
管理者としてコマンド プロンプトまたは PowerShell を使用する場合:
net stop observiq-otel-collector && net start observiq-otel-collectorまたは、Services コンソールを使用します。
Win+Rキーを押し、「services.msc」と入力して Enter キーを押します。- observIQ OpenTelemetry Collector を見つけます。
- 右クリックして [再起動] を選択します。
サービスが実行されていることを確認します。
sc query observiq-otel-collectorログでエラーを確認します。
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
ログの取り込みを確認する
Bindplane エージェントを構成してサービスを再起動すると、PowerShell ログが Google SecOps に流れ始めます。
- Google SecOps コンソールにログインします。
- [Investigate] > [Search] に移動します。
次の検索を実行して、PowerShell ログが取り込まれていることを確認します。
metadata.log_type = "POWERSHELL"イベントが最近のタイムスタンプとともに表示されていることを確認します。
PowerShell スクリプト ブロック ロギング イベント(イベント ID 4104)には、実行されたスクリプト ブロックの詳細(スクリプトの内容、スクリプト ブロック ID、実行コンテキストなど)が表示されます。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
| HostId | principal.resource.product_object_id | プリンシパル リソースに関連付けられたプロダクト オブジェクトの一意の識別子 |
| System.Version | metadata.product_version | イベントを生成したプロダクトのバージョン |
| System.EventId、EventID、winlog.event_id | metadata.product_event_type | プロダクトで定義されているイベントの種類 |
| Computer、System.Computer、computer、winlog.computer_name | principal.hostname | プリンシパル エンティティのホスト名 |
| Computer、System.Computer、computer、winlog.computer_name | principal.asset.hostname | プリンシパルに関連付けられたアセットのホスト名 |
| System.EventRecordID、RecordNumber、winlog.record_id | metadata.product_log_id | プロダクトのロギング システム内のログエントリの一意の識別子 |
| System.Opcode、opcode、winlog.opcode | metadata.description | イベントの説明または追加のコンテキスト |
| ProviderGuid、winlog.provider_guid | metadata.product_deployment_id | プロダクトのデプロイの固有識別子 |
| System.ProcessID、ProcessID、ExecutionProcessID、execution.process_id、winlog.process.pid | principal.process.pid | プリンシパル プロセスのプロセス ID |
| SourceModuleName | principal.resource.name | プリンシパルに関連付けられているリソースの名前 |
| SourceModuleType | principal.resource.resource_subtype | プリンシパルに関連付けられているリソースのサブタイプ |
| security.user_id, UserID, winlog.user.identifier | principal.user.windows_sid | プリンシパル ユーザーの Windows セキュリティ識別子(SID) |
| metadata.event_type | イベントのタイプ(例: USER_LOGIN、NETWORK_CONNECTION) | |
| SourceName、winlog.provider_name | metadata.product_name | イベントを生成したサービスの名前 |
| AccountName、Username、UserName、winlog.user.name | principal.user.userid | プリンシパル ユーザーのユーザー ID |
| ドメイン、winlog.user.domain | principal.administrative_domain | プリンシパルの管理ドメイン |
| Path、target_file、ScriptName、script_name、ContextInfo_Script Name、file_path | target.process.file.full_path | ターゲット プロセスに関連付けられたファイルのフルパス |
| HostName、powershell.Host Name、ContextInfo_Host Name | target.hostname | ターゲット エンティティのホスト名 |
| HostName、powershell.Host Name、ContextInfo_Host Name | target.asset.hostname | ターゲットに関連付けられているアセットのホスト名 |
| Host ID、HostID、ContextInfo_Host ID | target.asset.asset_id | ターゲット アセットの固有識別子 |
| Nombre_de_comando, ContextInfo_Command Name, CommandName | target.application | ターゲットに関連付けられているアプリケーションの名前 |
| HostApplication、ContextInfo_Host Application | target.process.command_line | ターゲット プロセスの起動に使用されたコマンドライン |
| ScriptBlockText | target.process.command_line | ターゲット プロセスの起動に使用されたコマンドライン |
| MessageSourceAddress | principal.ip | プリンシパルの IP アドレス |
| MessageSourceAddress | principal.asset.ip | プリンシパルに関連付けられているアセットの IP アドレス |
| Nombre_de_host | principal.application | プリンシパルに関連付けられているアプリケーションの名前 |
| Version_de_host | principal.platform_version | プリンシパルに関連付けられているプラットフォームのバージョン |
| Id_de_host | principal.resource.id | プリンシパル リソースの固有識別子 |
| Application_host | principal.process.file.full_path | プリンシパル プロセスに関連付けられたファイルのフルパス |
| HostApplication | principal.process.command_line | プリンシパル プロセスの起動に使用されたコマンドライン |
| Usuario, admin_domain | principal.user.userid | プリンシパル ユーザーのユーザー ID |
| Usuario, admin_domain | principal.administrative_domain | プリンシパルの管理ドメイン |
| CommandLine | principal.process.command_line | プリンシパル プロセスの起動に使用されたコマンドライン |
| Machine、machine_id | principal.asset.asset_id | メインアセットの固有識別子 |
| Machine、platform_software | principal.asset.platform_software.platform | アセットのプラットフォーム タイプ(WINDOWS、LINUX など) |
| マシン、プラットフォーム ソフトウェア | principal.asset.platform_software.platform_version | アセットのプラットフォーム ソフトウェアのバージョン |
| MessageSourceAddress | intermediary.ip | 仲介エンティティの IP アドレス |
| MessageSourceAddress、Hostname | intermediary.hostname | 中間エンティティのホスト名 |
| MessageSourceAddress、Hostname | intermediary.asset.hostname | 仲介者に関連付けられたアセットのホスト名 |
| MessageSourceAddress | intermediary.port | 仲介者が使用するポート番号 |
| HostApplication | target.process.command_line | ターゲット プロセスの起動に使用されたコマンドライン |
| HostId | target.asset.asset_id | ターゲット アセットの固有識別子 |
| SequenceNumber、ContextInfo_Sequence Number、Sequence Number | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| ProviderName | principal.resource.attribute.labels | プリンシパル リソースに関連付けられたラベルまたは属性 |
| NewEngineState | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| PreviousEngineState | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| ScriptName | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| ManagementGroupName | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| ソース | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| RenderedDescription | security_result.description | セキュリティ結果または実施されたアクションの説明 |
| TenantId | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| ユーザー名 | principal.user.userid | プリンシパル ユーザーのユーザー ID |
| ActivityID | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| ExecutionThreadID、execution.thread_id、winlog.process.thread.id | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| 出力 | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| データ | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| Data_1 | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| data_1 | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| Data_2 | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| winlog.activity_id | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| winlog.api | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| winlog.channel | principal.resource.attribute.labels | プリンシパル リソースに関連付けられたラベルまたは属性 |
| オフセット | additional.fields | 標準の UDM スキーマでカバーされていない追加のカスタム フィールド |
| SeverityValue | security_result.detection_fields | 追加の検出情報の Key-Value ペア |
| intermediary | intermediary | イベントに関与する仲介エンティティの詳細 |
| security_result | security_result | アクション、重大度、検出を含むセキュリティ結果の概要 |
| metadata.vendor_name | イベントを生成したベンダーの名前 | |
| SourceName | metadata.product_name | イベントを生成したサービスの名前 |
syslog_host |
event.idm.read_only_udm.intermediary.hostname |
変更履歴からマッピング |
Computer |
event.idm.read_only_udm.intermediary.hostname |
変更履歴からマッピング |
Version |
event.idm.read_only_udm.metadata.product_version |
変更履歴からマッピング |
Task |
event.idm.read_only_udm.security_result.detection_fields |
変更履歴からマッピング |
OpcodeValue |
event.idm.read_only_udm.security_result.detection_fields |
変更履歴からマッピング |
ThreadID |
event.idm.read_only_udm.security_result.detection_fields |
変更履歴からマッピング |
AccountType |
event.idm.read_only_udm.security_result.detection_fields |
変更履歴からマッピング |
Offset |
event1.idm.read_only_udm.additional.fields |
変更履歴からマッピング |
SeverityValue |
event1.idm.read_only_udm.additional.fields |
変更履歴からマッピング |
NewEngineState", "PreviousEngineState", "HostVersion", "RunspaceId", "SequenceNumber", "EngineVersion" and "PipelineId |
additional.fields |
変更履歴からマッピング |
Payload |
security_result.detection_fields |
変更履歴からマッピング |
Script Name |
target.file.full_path |
変更履歴からマッピング |
SystemTime |
metadata.event_timestamp |
変更履歴からマッピング |
channel", "keywords", "MessageNumber", "MessageTotal", and "ScriptBlockId |
security_result.detection_fields |
変更履歴からマッピング |
System.ProviderName |
principal.resource.attribute.labels |
変更履歴からマッピング |
HostVersion", "RunspaceId", "PipelineId", "EngineVersion", "DetailSequence", "DetailTotal", "SequenceNumber", and "ScriptName |
additional.fields |
変更履歴からマッピング |
System.EventRecordID", "System.Task", "System.Keywords", "System.Opcode", and "System.ThreadID |
security.detection_fields |
変更履歴からマッピング |
EventLevelName |
security_result.severity |
変更履歴からマッピング |
ManagementGroupName", "Source", "TenantId |
additional_fields |
変更履歴からマッピング |
変更ログ
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。