Forseti オープンソースのログを収集する
このドキュメントでは、Google Cloud Storage V2 を使用して Forseti Open Source ログを Google Security Operations に取り込む方法について説明します。
Forseti Security は、Google Cloud Platform 環境のセキュリティ強化に役立つオープンソースのツール群であり、コミュニティ主導で集められた各種ツールが揃っています。Forseti は、定期的な頻度で GCP リソースのインベントリ スナップショットを取得し、リソースをスキャンしてアクセス制御が意図したとおりに設定されていることを確認し、Cloud IAM ポリシーの可視性を提供します。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス。
- Cloud Storage API が有効になっている GCP プロジェクト。
- GCS バケットを作成、管理する権限。
- GCS バケットの IAM ポリシーを管理する権限。
- 既存の Forseti Security デプロイ(たとえば、Google Compute Engine の Forseti Terraform モジュールを使用してデプロイされたもの)。
- Forseti サーバー構成ファイル(
forseti_conf_server.yaml)へのアクセス権。
Google Cloud Storage バケットを作成する
Google Cloud コンソールを使用する
- Google Cloud Console に移動します。
- プロジェクトを選択するか、新しいプロジェクトを作成します。
- ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
- [バケットを作成] をクリックします。
次の構成情報を提供してください。
設定 値 バケットに名前を付ける グローバルに一意の名前( forseti-violations-exportなど)を入力します。ロケーション タイプ ニーズに基づいて選択します(リージョン、デュアルリージョン、マルチリージョン)。 ロケーション ロケーションを選択します(例: us-central1)。ストレージ クラス Standard(頻繁にアクセスされるログにおすすめ) アクセス制御 均一(推奨) 保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする [作成] をクリックします。
gcloud コマンドライン ツールを使用する
または、gcloud コマンドを使用してバケットを作成します。
gcloud storage buckets create gs://forseti-violations-export \
--location=us-central1 \
--default-storage-class=STANDARD
次のように置き換えます。
forseti-violations-export: 目的のバケット名(グローバルに一意)。us-central1: 希望のリージョン(us-central1、europe-west1など)。
違反を GCS にエクスポートするように Forseti Security を構成する
Forseti Security は、forseti_conf_server.yaml ファイルの通知機能構成を使用して、スキャナ違反を Google Cloud Storage にエクスポートします。
SSH を使用して Forseti サーバー VM に接続します。
gcloud compute ssh forseti-server-vm --project=YOUR_PROJECT_ID --zone=YOUR_ZONEYOUR_PROJECT_IDとYOUR_ZONEは、Forseti デプロイの値に置き換えます。Forseti サーバーの構成ファイルを編集用に開きます。
sudo nano /home/ubuntu/forseti-security/configs/forseti_conf_server.yamlForseti デプロイで GCS ベースの構成を使用している場合は、Forseti サーバー バケットからファイルをダウンロードします。
gsutil cp gs://YOUR_FORSETI_SERVER_BUCKET/configs/forseti_conf_server.yaml ~/forseti_conf_server.yamlnotifierセクションに移動して、resourcesサブセクションを見つけます。エクスポートする違反リソース タイプごとに、
gcs_violations通知ツールを構成します。次のように構成を追加または更新します。notifier: resources: - resource: iam_policy_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/ - resource: firewall_rule_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/ - resource: cloudsql_acl_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/ - resource: bucket_acl_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/ - resource: config_validator_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/次のように置き換えます。
forseti-violations-export: 前の手順で作成した GCS バケット名。violations/: 違反ファイルを整理するための接頭辞パス(省略可)。
構成パラメータ:
resource: 違反リソースタイプ。使用可能なリソースタイプは、デプロイで有効になっている Forseti スキャナによって異なります。一般的な型には、iam_policy_violations、firewall_rule_violations、cloudsql_acl_violations、bucket_acl_violations、config_validator_violations、groups_settings_violationsなどがあります。should_notify: このリソースタイプの通知を有効にするには、trueに設定します。data_format: エクスポートされたデータの形式。有効な値はcsvまたはjsonです。デフォルトはcsvです。gcs_path: 違反がエクスポートされる Cloud Storage パス。パスはgs://で始まり、末尾にスラッシュを含める必要があります。
構成ファイルを保存します。
GCS から構成をダウンロードした場合は、更新したファイルを Forseti サーバー バケットにアップロードします。
gsutil cp ~/forseti_conf_server.yaml gs://YOUR_FORSETI_SERVER_BUCKET/configs/forseti_conf_server.yamlForseti サーバーの構成を再読み込みします。
forseti server configuration reload構成が正常に読み込まれたことを確認します。
forseti server configuration get | grep gcs_violations
Google SecOps サービス アカウントを取得する
Google SecOps は、一意のサービス アカウントを使用して GCS バケットからデータを読み取ります。このサービス アカウントにバケットへのアクセス権を付与する必要があります。
Forseti Open Source のログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Forseti Violations)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
[ログタイプ] として [Forseti Open Source] を選択します。
[サービス アカウントを取得する] をクリックします。
一意のサービス アカウント メールアドレスが表示されます(例:)。
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comこのメールアドレスをコピーします。次のステップでこれを使用します。
[次へ] をクリックします。
次の入力パラメータの値を指定します。
- ストレージ バケットの URL: 接頭辞パスを含む GCS バケット URI を入力します。
gs://forseti-violations-export/violations/- 次のように置き換えます。
forseti-violations-export: GCS バケット名。violations/: ログが保存されるオプションの接頭辞/フォルダパス(ルートの場合は空のままにします)。
Source deletion option: 必要に応じて削除オプションを選択します。
- なし: 転送後にファイルを削除しません(テストにおすすめ)。
- 転送されたファイルを削除する: 転送が完了した後にファイルを削除します。
- 転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。
- ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます。デフォルトは 180 日です。
- アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
Google SecOps サービス アカウントに IAM 権限を付与する
Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者ロールが必要です。
Google Cloud コンソールを使用する
- [Cloud Storage] > [バケット] に移動します。
- バケット名をクリックします。
- [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成の詳細を指定します。
- プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
- ロールを割り当てる: [ストレージ オブジェクト閲覧者] を選択します。
- [保存] をクリックします。
gcloud コマンドライン ツールを使用する
または、gcloud コマンドを使用して権限を付与します。
gcloud storage buckets add-iam-policy-binding gs://forseti-violations-export \
--member="serviceAccount:chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com" \
--role="roles/storage.objectViewer"
次のように置き換えます。
forseti-violations-export: バケット名。chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com: Google SecOps サービス アカウントのメールアドレス。
gsutil コマンドライン ツールを使用する(以前のバージョン)
gsutil iam ch serviceAccount:chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com:objectViewer \
gs://forseti-violations-export
権限を確認する
権限が正しく付与されたことを確認するには:
gcloud storage buckets get-iam-policy gs://forseti-violations-export \
--flatten="bindings[].members" \
--filter="bindings.role:roles/storage.objectViewer"
出力に Google SecOps サービス アカウントのメールアドレスが表示されます。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
| data.resource_data.instanceGroupUrls | about | instanceGroupUrls の配列から統合 |
| data.resource_data.nodePools.*.statusMessage | metadata.description | nodePool.statusMessage の値 |
| data.resource_type | metadata.event_type | kms_cryptokey/serviceaccount_key の場合は RESOURCE_PERMISSIONS_CHANGE、ファイアウォールの場合は RESOURCE_DELETION、kubernetes_cluster の場合は STATUS_HEARTBEAT、それ以外の場合は GENERIC_EVENT に設定します。 |
| data.scanner_index_id | metadata.product_log_id | 値が直接コピーされ、文字列に変換されます。 |
| metadata.product_name | 「FORSETI SECURITY」に設定します。 | |
| metadata.vendor_name | 「FORSETI」に設定 | |
| data.resource_data.direction | network.direction | 方向が INGRESS の場合、INBOUND に設定します |
| data.resource_data.endpoint | principal.ip | 値を直接コピー |
| data.resource_data.nodeConfig.oauthScopes.0 | principal.url | 値を直接コピー |
| data.full_name、serviceAccount | principal.user.userid | grok を使用して data.full_name から抽出されるか、空でない場合は serviceAccount に設定されます。 |
| data.violation_data.protection_level、data.violation_data.purpose、data.violation_data.project_id、data.violation_data.node_pool_name、data.violation_data.violation_reason | security_result.detection_fields | 複数の Key-Value ペアからマージされた |
| data.violation_type | security_result.category | FIREWALL_BLACKLIST_VIOLATION の場合は POLICY_VIOLATION、KE_VERSION_VIOLATION の場合は UNKNOWN_CATEGORY、それ以外の場合は ACL_VIOLATION に設定します。 |
| data.rule_name | security_result.rule_name | 値を直接コピー |
| data.violation_type | security_result.summary | 値を直接コピー |
| data.resource_data.zone | target.asset.attribute.cloud.availability_zone | 値を直接コピー |
| target.asset.attribute.cloud.environment | 「GOOGLE_CLOUD_PLATFORM」に設定 | |
| data.full_name | target.asset.attribute.cloud.project.id | grok を使用して data.full_name から抽出 |
| data.resource_data.subnetwork | target.asset.attribute.cloud.vpc.name | 値を直接コピー |
| data.resource_data.nodeConfig.machineType | target.asset.hardware | machineType と定数 CPU プラットフォームから統合 |
| data.resource_data.privateClusterConfig.privateEndpoint | target.ip | 値を直接コピー |
| data.resource_data.versionTemplate.algorithm、data.resource_data.key_algorithm | target.labels | アルゴリズムの Key-Value ペア(存在する場合)を統合 |
| data.resource_data.location | target.location.name | 値を直接コピー |
| data.resource_name | target.resource.name | 値を直接コピー |
| data.resource_id | target.resource.product_object_id | resource_name と異なる場合は直接コピーされる値 |
| data.resource_type | target.resource.resource_subtype | resource_type が kubernetes_cluster の場合は「gke」に設定します。 |
| data.resource_type | target.resource.resource_type | 元の resource_type に基づいて特定のタイプにマッピング |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。