WordPress CMS ログを収集する
以下でサポートされています。
Google SecOpsSIEM
概要
このパーサーは、JSON 形式または書式なしテキスト形式のメッセージから WordPress CMS ログを抽出します。JSON 形式と JSON 以外の形式の両方のログを処理し、関連するフィールドを解析して UDM にマッピングします。これには、ユーザーの詳細、ネットワーク情報、リソース属性、セキュリティ結果の詳細が含まれます。また、パーサーは、データ型の変換、フィールドの統合、Kubernetes やその他のリソースの特定のロギング パターンの処理など、いくつかのデータ変換も実行します。
始める前に
- Google SecOps インスタンスがあることを確認します。
- WordPress ウェブサイトへの特権アクセス権があることを確認します。
- Webhook 機能を有効にするプラグイン(WP Webhooks など)。
WordPress ログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [新しく追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: Wordpress ログ)。
- [ソースタイプ] として [Webhook] を選択します。
- [ログタイプ] として [Wordpress] を選択します。
- [次へ] をクリックします。
- 省略可: 次の入力パラメータの値を指定します。
- 分割区切り文字: ログ行を区切るために使用される区切り文字(
\n
など)。 - アセットの名前空間: アセットの名前空間。
- 取り込みラベル: このフィードのイベントに適用されるラベル。
- 分割区切り文字: ログ行を区切るために使用される区切り文字(
- [次へ] をクリックします。
- [Finalize] 画面でフィードの設定を確認し、[送信] をクリックします。
- [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
- シークレット キーをコピーして保存します。この秘密鍵を再び表示することはできません。必要に応じて、新しい秘密鍵を再生成できますが、この操作により以前の秘密鍵は無効になります。
- [詳細] タブで、[エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。このエンドポイント URL は、クライアント アプリケーションで指定する必要があります。
- [完了] をクリックします。
Webhook フィードの API キーを作成する
Google Cloud コンソール > [認証情報] に移動します。
[認証情報を作成] をクリックして [API キー] を選択します。
API キーのアクセスを Google Security Operations API に制限します。
エンドポイント URL を指定する
- クライアント アプリケーションで、Webhook フィードで指定された HTTPS エンドポイント URL を指定します。
次の形式でカスタム ヘッダーの一部として API キーとシークレット キーを指定して、認証を有効にします。
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
推奨事項: API キーは URL ではなくヘッダーとして指定してください。Webhook クライアントがカスタム ヘッダーをサポートしていない場合は、次の形式のクエリ パラメータを使用して API キーとシークレット キーを指定できます。
ENDPOINT_URL?key=API_KEY&secret=SECRET
次のように置き換えます。
ENDPOINT_URL
: フィードのエンドポイント URL。API_KEY
: Google Security Operations の認証に使用する API キー。SECRET
: フィードの認証用に生成したシークレット キー。
WordPress Webhook を構成する
- WordPress プラグイン ディレクトリから WP Webhooks プラグイン(または選択した Webhook プラグイン)をインストールして有効にします。
- WordPress 管理者メニューの [WP Webhooks] サブメニューに移動します(通常は [設定] の下にあります)。
- 上部のバーメニューで [Send Data](データを送信)をクリックします。
- Webhook をトリガーする WordPress アクションを選択します。一般的な例としては、publish_post(新しい投稿が公開されたとき)、user_register(新しいユーザーが登録されたとき)、comment_post(新しいコメントが投稿されたとき)などがあります。これは、選択して Google SecOps に送信するデータによって異なります。
- [Add Webhook URL] をクリックします。
- Webhook を構成します。
- 名前: Webhook にわかりやすい名前を付けます(例: Google SecOps フィード)。
- Webhook URL: Google SecOps エンドポイントの URL を貼り付けます。
- [Save Webhook] をクリックします。
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
ClientIP |
principal.ip |
クライアントの IP アドレスは、未加工ログの ClientIP フィールドから抽出されます。 |
Code |
target.resource.attribute.labels.key |
値「Code」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
Code |
target.resource.attribute.labels.value |
未加工ログの Code フィールドの値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
CurrentUserID |
target.user.userid |
未加工ログの CurrentUserID は文字列に変換され、target.user.userid フィールドにマッピングされます。 |
EditUserLink |
target.url |
元のログの EditUserLink は target.url フィールドにマッピングされます。 |
EventType |
metadata.product_event_type |
元のログの EventType は metadata.product_event_type フィールドにマッピングされます。 |
FirstName |
target.user.first_name |
元のログの FirstName は target.user.first_name フィールドにマッピングされます。 |
insertId |
metadata.product_log_id |
元のログの insertId は metadata.product_log_id フィールドにマッピングされます。 |
labels.compute.googleapis.com/resource_name |
additional.fields.key |
値「Resource Name」が additional.fields オブジェクトのキーとして割り当てられます。 |
labels.compute.googleapis.com/resource_name |
additional.fields.value.string_value |
未加工ログの labels.compute.googleapis.com/resource_name の値は、additional.fields オブジェクトの文字列値として割り当てられます。 |
labels.k8s-pod/app_kubernetes_io/instance |
target.resource.attribute.labels.key |
値「Kubernetes IO Instance」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
labels.k8s-pod/app_kubernetes_io/instance |
target.resource.attribute.labels.value |
未加工ログの labels.k8s-pod/app_kubernetes_io/instance の値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
labels.k8s-pod/app_kubernetes_io/managed-by |
target.resource.attribute.labels.key |
値「Kubernetes IO Instance Manager」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
labels.k8s-pod/app_kubernetes_io/managed-by |
target.resource.attribute.labels.value |
未加工ログの labels.k8s-pod/app_kubernetes_io/managed-by の値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
labels.k8s-pod/app_kubernetes_io/name |
target.resource.attribute.labels.key |
値「Kubernetes IO Instance Name」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
labels.k8s-pod/app_kubernetes_io/name |
target.resource.attribute.labels.value |
元のログの labels.k8s-pod/app_kubernetes_io/name の値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
labels.k8s-pod/controller-revision-hash |
target.resource.attribute.labels.key |
値「Controller Revision Hash」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
labels.k8s-pod/controller-revision-hash |
target.resource.attribute.labels.value |
元のログの labels.k8s-pod/controller-revision-hash の値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
labels.k8s-pod/helm_sh/chart |
target.resource.attribute.labels.key |
値「Kubernetes IO Instance Manager SH」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
labels.k8s-pod/helm_sh/chart |
target.resource.attribute.labels.value |
未加工ログの labels.k8s-pod/helm_sh/chart の値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
labels.k8s-pod/k8s-app |
target.resource.attribute.labels.key |
値「Application」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
labels.k8s-pod/k8s-app |
target.resource.attribute.labels.value |
未加工ログの labels.k8s-pod/k8s-app の値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
labels.k8s-pod/pod-template-generation |
target.resource.attribute.labels.key |
値「Pod テンプレートの生成」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
labels.k8s-pod/pod-template-generation |
target.resource.attribute.labels.value |
未加工ログの labels.k8s-pod/pod-template-generation の値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
labels.k8s-pod/pod-template-hash |
target.resource.attribute.labels.key |
値「Pod Template Hash」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
labels.k8s-pod/pod-template-hash |
target.resource.attribute.labels.value |
元のログの labels.k8s-pod/pod-template-hash の値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
LastName |
target.user.last_name |
元のログの LastName は target.user.last_name フィールドにマッピングされます。 |
logName |
target.resource.attribute.labels.key |
値「Log Name」が target.resource.attribute.labels オブジェクトのキーとして割り当てられます。 |
logName |
target.resource.attribute.labels.value |
元のログの logName フィールドの値が、target.resource.attribute.labels オブジェクトの値として割り当てられます。 |
receiveTimestamp |
metadata.event_timestamp |
未加工ログの receiveTimestamp が解析され、metadata.event_timestamp フィールドにマッピングされます。 |
resource.labels.cluster_name |
additional.fields.key |
値「Cluster Name」が additional.fields オブジェクトのキーとして割り当てられます。 |
resource.labels.cluster_name |
additional.fields.value.string_value |
未加工ログの resource.labels.cluster_name の値は、additional.fields オブジェクトの文字列値として割り当てられます。 |
resource.labels.cluster_name |
target.resource.resource_type |
resource.labels.cluster_name が存在する場合、値「CLUSTER」が target.resource.resource_type に割り当てられます。 |
resource.labels.container_name |
metadata.product_event_type |
resource.type が「k8s_container」の場合、resource.labels.container_name の値と resource.labels.namespace_name を使用して metadata.product_event_type が作成されます。 |
resource.labels.container_name |
target.resource.name |
元のログの resource.labels.container_name の値が target.resource.name フィールドに割り当てられます。 |
resource.labels.location |
target.location.country_or_region |
元のログの resource.labels.location の値が target.location.country_or_region フィールドに割り当てられます。 |
resource.labels.namespace_name |
additional.fields.key |
値「Namespace Name」が additional.fields オブジェクトのキーとして割り当てられます。 |
resource.labels.namespace_name |
additional.fields.value.string_value |
未加工ログの resource.labels.namespace_name の値は、additional.fields オブジェクトの文字列値として割り当てられます。 |
resource.labels.namespace_name |
metadata.product_event_type |
resource.type が「k8s_container」の場合、resource.labels.namespace_name の値と resource.labels.container_name を使用して metadata.product_event_type が作成されます。 |
resource.labels.node_name |
metadata.product_event_type |
resource.type が「k8s_node」の場合、resource.labels.node_name の値を使用して metadata.product_event_type が作成されます。 |
resource.labels.pod_name |
additional.fields.key |
値「Pod Name」が additional.fields オブジェクトのキーとして割り当てられます。 |
resource.labels.pod_name |
additional.fields.value.string_value |
未加工ログの resource.labels.pod_name の値は、additional.fields オブジェクトの文字列値として割り当てられます。 |
resource.labels.project_id |
additional.fields.key |
値「Project Id」が additional.fields オブジェクトのキーとして割り当てられます。 |
resource.labels.project_id |
additional.fields.value.string_value |
未加工ログの resource.labels.project_id の値は、additional.fields オブジェクトの文字列値として割り当てられます。 |
resource.type |
target.resource.resource_subtype |
元のログの resource.type の値が target.resource.resource_subtype フィールドに割り当てられます。 |
Roles |
target.user.user_role |
元のログの Roles フィールドは、大文字に変換され、target.user.user_role フィールドにマッピングされます。 |
SessionID |
network.session_id |
元のログの SessionID は network.session_id フィールドにマッピングされます。 |
sev |
security_result.severity |
sev フィールドの値によって、security_result.severity の値が決まります。「INFO」または「NOTICE」は「INFORMATIONAL」にマッピングされ、「WARN」は「MEDIUM」にマッピングされ、「ERR」は「ERROR」にマッピングされます。 |
TargetUsername |
target.user.user_display_name |
元のログの TargetUsername は target.user.user_display_name フィールドにマッピングされます。 |
textPayload |
metadata.description |
resource.type が「k8s_node」の場合、textPayload の値は metadata.description フィールドにマッピングされます。 |
textPayload |
network.application_protocol |
プロトコル(HTTP など)は、grok パターンを使用して textPayload フィールドから抽出されます。 |
textPayload |
network.http.method |
HTTP メソッド(GET、POST など)は、grok パターンを使用して textPayload フィールドから抽出されます。 |
textPayload |
network.http.referral_url |
URL は、Grok パターンを使用して textPayload フィールドから抽出されます。 |
textPayload |
network.http.response_code |
HTTP レスポンス コードは、grok パターンを使用して textPayload フィールドから抽出され、整数に変換されます。 |
textPayload |
network.received_bytes |
受信バイトは Grok パターンを使用して textPayload フィールドから抽出され、符号なし整数に変換されます。 |
textPayload |
principal.ip |
送信元 IP アドレスは、grok パターンを使用して textPayload フィールドから抽出されます。 |
textPayload |
security_result.description |
説明は、Grok パターンを使用して textPayload フィールドから抽出されます。 |
textPayload |
target.file.full_path |
パスは、grok パターンを使用して textPayload フィールドから抽出されます。 |
UserAgent |
network.http.user_agent |
元のログの UserAgent は network.http.user_agent フィールドにマッピングされます。値「USER_RESOURCE_ACCESS」が metadata.event_type に割り当てられます。 |
変更点
2024-05-07
- バグの修正:
- 未解析のログと破棄されたログを解析するようにパーサー ロジックを変更しました。
2023-05-25
- 新しく作成されたパーサー。