Cloud Asset Inventory を Google SecOps と統合する
このドキュメントでは、Cloud Asset Inventory を Google Security Operations と統合する方法について説明します。
ユースケース
Cloud Asset Inventory の統合では、Google SecOps の機能を使用して次のユースケースをサポートしています。
リソースを拡充する Google Cloud : 完全なリソース名を使用してクラウド リソースの詳細なメタデータを自動的に取得し、セキュリティ アラートのコンテキストを提供します。
リソース スナップショットを取得する: リソースの構成とステータスの特定の時点のビューを取得して、フォレンジック調査と変更分析に役立てます。
サービス アカウントの権限を監査する: サービス アカウントに関連付けられているロールと一意の権限を一覧表示して、過剰な権限を持つ ID を特定し、最小権限の原則を維持します。
マルチクラウド アセットのインベントリ:Google Cloud と接続された外部環境全体のリソースの詳細にアクセスして、調査内でアセットの可視性を一元化します。
始める前に
Google SecOps で Cloud Asset Inventory 統合を構成する前に、次の前提条件の手順を完了します。
次のいずれかの認証方法を選択して構成します。
オプション 1: Workload Identity(推奨): この方法では、サービス アカウントの権限借用を使用して有効期間の短い一時的なアクセス トークンを使用するため、シークレットを保存する必要がありません。
オプション 2: サービス アカウントの JSON キー: この方法は、静的で有効期間の長いシークレット キーファイルに依存します。この方法は、Workload Identity が環境で使用できない場合にのみ使用してください。
サービス アカウントを作成する
サービス アカウントを作成するには、次の操作を行います。
Google Cloud コンソールで、[認証情報] に移動します。
[認証情報を作成] メニューから [サービス アカウント] を選択します。
[サービス アカウント名] フィールドに名前を入力し、[作成して続行] をクリックします。
[続行 > 完了] をクリックして、ロールの割り当てとプリンシパル アクセスの画面をスキップします。
構成手順で使用するために、サービス アカウントのメールアドレスをコピーします。
カスタム IAM ロールを作成する
統合に必要な検索機能を提供するには、カスタムロールを作成します。
Google Cloud コンソールで、[IAM と管理] > [ロール] に移動します。
[ロールを作成] をクリックし、[タイトル](「SecOps アセット検索」など)と一意の [ID] を指定します。
[ロールのリリース段階] を [一般提供] に設定します。
[権限を追加] をクリックして、
cloudasset.assets.searchAllResourcesを追加します。[作成] をクリックします。
サービス アカウントにロールを付与する
インテグレーションがリソースにアクセスできるようにするには、サービス アカウントに次のロールを付与します。
Google Cloud コンソールで、[IAM と管理] > [IAM] に移動します。
サービス アカウントを見つけて、[編集プリンシパルを編集] をクリックします。
[別のロールを追加] をクリックして、次のように選択します。
前のステップで作成したカスタム IAM ロール。
Cloud Asset 閲覧者。
Service Usage コンシューマー(
Quota Project IDを使用する場合にのみ必要)。
[保存] をクリックします。
Workload Identity の認証情報を構成する
この方法または JSON キーの方法を選択して、統合を認証します。Workload Identity は、サービス アカウントの権限借用を使用して有効期間の短い一時的なアクセス トークンを使用するため、推奨される安全性の高いアプローチです。これにより、有効期間の長いシークレットを保存したりローテーションしたりする必要がなくなります。
一意のインスタンス ID を特定する
Workload Identity を使用して認証するには、Google SecOps インスタンスにサービス アカウントの権限を借用する権限を付与する必要があります。これにより、インスタンスは Google Cloud リソースに安全にアクセスできます。
Google SecOps で、[Content Hub] > [Response Integrations] に移動します。
[Cloud Asset Inventory] インテグレーションを選択し、
Workload Identity Emailにサービス アカウントのメールアドレスを入力します。[保存] > [テスト] をクリックします。テストは失敗することが想定されています。
[Test] の右にある close_small をクリックし、
gke-init-python@...またはsoar-python@...で始まる ID メールアドレスのエラー メッセージを検索します。この一意のメールアドレスをコピーします。
Google Cloudでインスタンス ID を承認する
Google SecOps インスタンスの一意の ID を取得したら、Google Cloud リソースにアクセスする権限を付与する必要があります。この手順では、サービス アカウントの権限借用を有効にします。これにより、プラットフォームは静的キーを必要とせずに、有効期間の短いトークンを生成してユーザーに代わって操作できます。
Google Cloud コンソールで、[IAM と管理] > [サービス アカウント] に移動します。
ターゲット サービス アカウントを選択し、[権限> アクセス権を付与] に移動します。
一意のメールアドレスを [新しいプリンシパル] フィールドに貼り付け、サービス アカウント トークン作成者ロール(
roles/iam.serviceAccountTokenCreator)を割り当てます。
割り当てプロジェクトへのアクセス権を付与する
Workload Identity で認証する場合は、API の使用量と課金を追跡するために、統合設定で Quota Project ID を指定する必要があります。
これを承認するには、指定された割り当てプロジェクトに対する次のロールをサービス アカウントに付与する必要があります。
Google Cloud コンソールで、[IAM と管理] > [IAM] に移動して、プロジェクトを選択します。
プリンシパルのリストでサービス アカウントを見つけて、そのアカウントの [編集(プリンシパルを編集)] をクリックします。
[別のロールを追加] をクリックし、[Service Usage コンシューマー] ロール(
roles/serviceusage.serviceUsageConsumer)を選択します。[保存] をクリックします。
JSON キーを構成する
この方法または Workload Identity の方法を選択して、統合を認証します。JSON キーメソッドは、環境で Workload Identity を使用できない場合にのみ使用してください。Workload Identity は、推奨されるより安全なアプローチです。この方法は、手動での管理とローテーションが必要な静的で有効期間の長い秘密鍵ファイルに依存しています。
次の手順に沿って、統合の認証に必要な JSON キーファイルを生成します。
Google Cloud コンソールで、[IAM と管理>サービス アカウント] に移動し、作成したサービス アカウントを選択します。
[キー] タブに移動します。
[鍵を追加] > [新しい鍵を作成] の順にクリックします。
鍵のタイプとして
JSONを選択し、[作成] をクリックします。JSON ファイルがパソコンにダウンロードされます。このファイルの内容全体をコピーし、統合構成時に
User's Service Accountに貼り付けます。
統合のパラメータ
Cloud Asset Inventory の統合には、次のパラメータが必要です。
| パラメータ | 説明 |
|---|---|
API Root |
必須
Cloud Asset Inventory インスタンスの API ルート。 デフォルト値は |
Organization ID |
省略可
Cloud Asset Inventory の統合で使用する組織 ID。 |
Project ID |
Optional Cloud Asset Inventory の統合に使用するプロジェクト ID。値が指定されていない場合、インテグレーションは |
User's Service Account |
必須
サービス アカウントの JSON 鍵ファイルの内容全体。 |
Quota Project ID |
Optional Google Cloud API と課金に使用する Google Cloud プロジェクト ID。このパラメータを使用するには、サービス アカウントに 値が指定されていない場合、インテグレーションは Google Cloud サービス アカウントからプロジェクト ID を取得します。 |
Workload Identity Email |
省略可。 Workload Identity の権限借用に使用されるサービス アカウントのクライアント メールアドレス。 |
Verify SSL |
必須
選択すると、統合によって Cloud Asset Inventory サーバーへの接続時に SSL 証明書が検証されます。 デフォルトで有効になっています。 |
Google SecOps で統合を構成する手順については、統合を構成するをご覧ください。
必要に応じて、後の段階で変更できます。統合インスタンスを構成すると、ハンドブックで使用できるようになります。複数のインスタンスの構成とサポートの詳細については、複数のインスタンスのサポートをご覧ください。
操作
アクションの詳細については、 デスクから保留中のアクションに対応すると手動による対策を実行するをご覧ください。
リソースを拡充する
リソースの拡充アクションを使用して、Cloud Asset Inventory を使用して Google Cloudリソースに関する情報を拡充します。
このアクションは Google SecOps エンティティに対して実行されません。
アクションへの入力
リソースの拡充アクションを構成するには、次のパラメータを使用します。
| パラメータ | 説明 |
|---|---|
Resource Names |
必須
詳細を取得するリソースのリソース名を含むカンマ区切りのリスト。 このパラメータを構成するには、メタデータ リソースの完全な名前を |
Fields To Return |
省略可
返されるフィールドのカンマ区切りのリスト。 デフォルト値は 値の例は次のとおりです。
このアクションは常に 高度なフィルタを構成することもできます。たとえば、 |
アクションの出力
[リソースを拡充] アクションは、次の出力を提供します。
| アクションの出力タイプ | 対象 |
|---|---|
| ケースウォールのアタッチメント | 利用不可 |
| ケースウォールのリンク | 利用不可 |
| ケースウォール テーブル | 利用不可 |
| 拡充テーブル | 利用不可 |
| JSON の結果 | 利用可能 |
| 出力メッセージ | 利用可能 |
| スクリプトの結果 | 利用可能 |
JSON の結果
次の例は、[リソースを拡充] アクションを使用した場合に受信する JSON 結果の出力を示しています。
[
{
"Entity": "//iam.googleapis.com/projects/PROJECT/serviceAccounts/SERVICE_ACCOUNT/keys/KEY_ID",
"EntityResult": {
"additionalAttributes": {
"email": "email@example.iam.gserviceaccount.com",
"uniqueId": 123456789
},
"name": "//iam.googleapis.com/projects/PROJECT/serviceAccounts/SERVICE_ACCOUNT/keys/KEY_ID",
"assetType": "iam.googleapis.com/ServiceAccountKey",
"project": "projects/PROJECT",
"displayName": "projects/PROJECT/serviceAccounts/SERVICE_ACCOUNT@PROJECT.iam.gserviceaccount.com/keys/KEY_ID",
"createTime": "2022-05-26T17:35:07Z",
"versionedResources": [
{
"version": "v1",
"resource": {
"keyAlgorithm": "KEY_ALG_RSA_2048",
"keyOrigin": "GOOGLE_PROVIDED",
"keyType": "USER_MANAGED",
"name": "projects/PROJECT/serviceAccounts/SERVICE_ACCOUNT@PROJECT.iam.gserviceaccount.com/keys/KEY_ID",
"validAfterTime": "2022-05-26T17:35:07Z",
"validBeforeTime": "9999-12-31T23:59:59Z"
}
}
],
"organization": "organizations/ORGANIZATION",
"parentFullResourceName": "//iam.googleapis.com/projects/PROJECT/serviceAccounts/SERVICE_ACCOUNT@PROJECT.iam.gserviceaccount.com",
"parentAssetType": "iam.googleapis.com/ServiceAccount"
}
}
]
出力メッセージ
リソースの拡充アクションは、次の出力メッセージを返すことができます。
| 出力メッセージ | メッセージの説明 |
|---|---|
|
アクションが成功しました。 |
Error executing action "Enrich resources". Reason:
ERROR_REASON |
操作に失敗しました。 サーバーへの接続、入力パラメータ、または認証情報を確認してください。 |
スクリプトの結果
次の表に、リソースの拡充アクションを使用する場合のスクリプト結果出力の値を示します。
| スクリプトの結果名 | 値 |
|---|---|
is_success |
True または False |
リソース スナップショットを取得する
リソース スナップショットを取得アクションを使用して、Cloud Asset Inventory を使用してリソースに関する情報を取得します。
このアクションは Google SecOps エンティティに対して実行されません。
アクションへの入力
リソース スナップショットを取得アクションを構成するには、次のパラメータを使用します。
| パラメータ | 説明 |
|---|---|
Resource Names |
必須 詳細を取得するリソースのカンマ区切りのリスト。 このパラメータを構成するには、メタデータ リソースの完全な名前を |
Fields To Return |
Optional 返されるフィールドのカンマ区切りのリスト。 次の形式で各フィールドを入力します。 assets.FIELD
値の例は アクションは常に デフォルト値は |
アクションの出力
[リソース スナップショットを取得] アクションは、次の出力を提供します。
| アクションの出力タイプ | 対象 |
|---|---|
| ケースウォールのアタッチメント | 利用不可 |
| ケースウォールのリンク | 利用不可 |
| ケースウォール テーブル | 利用不可 |
| 拡充テーブル | 利用不可 |
| JSON の結果 | 利用可能 |
| 出力メッセージ | 利用可能 |
| スクリプトの結果 | 利用可能 |
JSON の結果
次の例は、リソース スナップショットを取得アクションを使用した場合に受信される JSON 結果の出力を示しています。
Google Cloudの JSON の結果
[ { "Entity": "//compute.googleapis.com/projects/example-project/zones/us-central1-a/instances/example-instance", "EntityResult": { "window": { "startTime": "2023-08-14T19:43:41.805828Z", "endTime": "2262-04-11T23:47:16.854775807Z" }, "asset": { "name": "//compute.googleapis.com/projects/example-project/zones/us-central1-a/instances/example-instance", "assetType": "compute.googleapis.com/Instance", "resource": { "version": "v1", "discoveryDocumentUri": "https://www.googleapis.com/discovery/v1/apis/compute/v1/rest", "discoveryName": "Instance", "parent": "//cloudresourcemanager.googleapis.com/projects/example-project-id", "data": { "description": "", "serviceAccounts": [ { "email": "user@example.com", "scopes": [ "https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring.write", "https://www.googleapis.com/auth/servicecontrol", "https://www.googleapis.com/auth/service.management.readonly", "https://www.googleapis.com/auth/trace.append" ] } ], "lastStartTimestamp": "2022-05-26T01:44:52.756-07:00", "deletionProtection": false, "name": "example-name", "keyRevocationActionType": "NONE_ON_KEY_REVOCATION", "canIpForward": false, "shieldedInstanceIntegrityPolicy": { "updateAutoLearnPolicy": true }, "zone": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a", "resourceStatus": {}, "scheduling": { "onHostMaintenance": "MIGRATE", "preemptible": false, "provisioningModel": "STANDARD", "automaticRestart": true }, "machineType": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/machineTypes/e2-micro", "confidentialInstanceConfig": { "enableConfidentialCompute": false }, "selfLink": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances/example-instance", "id": "example-id", "fingerprint": "example-fingerprint", "startRestricted": false, "networkInterfaces": [ { "network": "https://www.googleapis.com/compute/v1/projects/example-project/global/networks/example-network", "stackType": "IPV4_ONLY", "name": "example", "subnetwork": "https://www.googleapis.com/compute/v1/projects/example-project/regions/us-central1/subnetworks/example-network-subnet", "accessConfigs": [ { "type": "ONE_TO_ONE_NAT", "name": "External NAT", "natIP": "192.0.2.1", "networkTier": "PREMIUM" } ], "fingerprint": "example-fingerprint", "networkIP": "203.0.113.2" } ], "allocationAffinity": { "consumeAllocationType": "ANY_ALLOCATION" }, "labelFingerprint": "example-label", "shieldedInstanceConfig": { "enableSecureBoot": false, "enableVtpm": true, "enableIntegrityMonitoring": true }, "cpuPlatform": "Intel Broadwell", "creationTimestamp": "2022-05-26T01:44:40.323-07:00", "status": "RUNNING", "disks": [ { "guestOsFeatures": [ { "type": "VIRTIO_SCSI_MULTIQUEUE" }, { "type": "SEV_CAPABLE" }, { "type": "UEFI_COMPATIBLE" }, { "type": "GVNIC" } ], "interface": "SCSI", "shieldedInstanceInitialState": { "dbxs": [ { "content": "2gcDBhMRFQAAAAAAAAAAABENAAAAAvEOndK", "fileType": "BIN" } ], "dbx": [ { "fileType": "BIN", "content": "2gcDBhMRFQAAAAAAAAAAABENAAAAAvEOndK" } ] }, "diskSizeGb": "10", "deviceName": "example-device-name", "type": "PERSISTENT", "source": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/disks/example-instance", "boot": true, "licenses": [ "https://www.googleapis.com/compute/v1/projects/example-project/global/licenses" ], "index": 0, "autoDelete": true, "mode": "READ_WRITE" } ], "tags": { "items": [ "http-server" ], "fingerprint": "example-fingerprint" }, "displayDevice": { "enableDisplay": false }, "reservationAffinity": { "consumeReservationType": "ANY_ALLOCATION" } }, "location": "us-central1-a" }, "ancestors": [ "projects/example-project-id", "organizations/example-org-id" ], "updateTime": "2023-08-14T19:43:41.805828Z" } } }, { "Entity": "//iam.googleapis.com/projects/example-project/serviceAccounts/example-account-id", "EntityResult": { "window": { "startTime": "2023-12-22T13:37:50Z", "endTime": "2262-04-11T23:47:16.854775807Z" }, "asset": { "name": "//iam.googleapis.com/projects/example-project/serviceAccounts/example-account-id", "assetType": "iam.googleapis.com/ServiceAccount", "resource": { "version": "v1", "discoveryDocumentUri": "https://iam.googleapis.com/$discovery/rest", "discoveryName": "ServiceAccount", "parent": "//cloudresourcemanager.googleapis.com/projects/example-project-id", "data": { "name": "projects/example-project/serviceAccounts/cloud-asset-inventory-auto@example-project.iam.gserviceaccount.com", "projectId": "example-project", "email": "cloud-asset-inventory-auto@example-project.iam.gserviceaccount.com", "uniqueId": "example-account-id", "displayName": "Cloud Asset Inventory Automation", "oauth2ClientId": "example-account-id" } }, "ancestors": [ "projects/example-project-id", "organizations/example-org-id" ], "updateTime": "2023-12-22T13:37:50Z" } } } ]
AWS の JSON の結果
[ { "Entity": "//cloudasset.googleapis.com/organizations/example-org-id/otherCloudConnections/aws/arn:aws:s3:::aps-max-test-bucket", "EntityResult": { "assets": [ { "window": { "startTime": "2024-01-24T17:51:03.412233028Z", "endTime": "2262-04-11T23:47:16.854775807Z" }, "asset": { "name": "//cloudasset.googleapis.com/organizations/example-org-id/otherCloudConnections/aws/arn:aws:s3:::aps-max-test-bucket", "assetType": "cloudasset.googleapis.com/AWS::S3::Bucket", "resource": { "version": "v1", "discoveryDocumentUri": "n/a", "discoveryName": "n/a", "data": { "dataSourceProvider": "AMAZON_WEB_SERVICES", "supplementaryConfigurations": { "PublicAccessBlockConfiguration": { "BlockPublicPolicy": true, "RestrictPublicBuckets": true, "BlockPublicAcls": true, "IgnorePublicAcls": true }, "TagSet": [ { "Key": "my-key2", "Value": "my-value2" }, { "Key": "my-key1", "Value": "my-value1" } ], "ServerSideEncryptionConfiguration": { "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" }, "BucketKeyEnabled": true } ] }, "AccessControlPolicy": { "Grants": [ { "Grantee": { "DisplayName": "example", "ID": "example-id", "Type": "CanonicalUser" }, "Permission": "FULL_CONTROL" } ], "Owner": { "DisplayName": "example", "ID": "example-id" } } }, "configuration": { "Name": "aps-max-test-bucket", "CreationDate": "2023-12-04T15:29:50+00:00" }, "tags": { "my-key2": "my-value2", "my-key1": "my-value1" }, "originalResourceName": "arn:aws:s3:::aps-max-test-bucket", "awsAccount": "arn:aws:organizations::example-id:account/example-account/example-account-id" }, "location": "global" }, "ancestors": [ "organizations/example-org-id" ], "updateTime": "2024-01-24T17:51:03.412233028Z" } } ] } } ]
出力メッセージ
[リソース スナップショットを取得] アクションは、次の出力メッセージを返すことがあります。
| 出力メッセージ | メッセージの説明 |
|---|---|
Successfully returned information about the following resources
using Google Cloud Asset Inventory:
ASSET_IDENTIFIER
|
アクションが成功しました。 |
Error executing action "Get Resource Snapshot". Reason:
ERROR_REASON |
操作に失敗しました。 サーバーへの接続、入力パラメータ、または認証情報を確認してください。 |
スクリプトの結果
次の表に、[リソース スナップショットを取得] アクションを使用する場合のスクリプト結果出力の値を示します。
| スクリプトの結果名 | 値 |
|---|---|
is_success |
True または False |
サービス アカウントのロールの一覧表示
サービス アカウントのロールを一覧表示アクションを使用して、Cloud Asset Inventory を使用して Google Cloud サービス アカウントに関連するロールを一覧表示します。
このアクションは Google SecOps エンティティに対して実行されません。
アクションへの入力
サービス アカウントのロールを一覧表示アクションを構成するには、次のパラメータを使用します。
| パラメータ | 説明 |
|---|---|
Service Accounts |
必須 詳細を取得するサービス アカウントのカンマ区切りのリスト。 |
Check Roles |
Optional サービス アカウントに関連して確認するロールのカンマ区切りのリスト( |
Check Permissions |
Optional サービス アカウントに関連して確認する権限のカンマ区切りのリスト( |
Expand Permissions |
Optional 選択すると、アクションはリソースに関連するすべての一意の権限に関する情報を返します。 デフォルトでは選択されていません。 |
Max Roles To Return |
必須 サービス アカウントに関連するロールの数を返します。 デフォルト値は 100 です。 |
Max Permissions To Return |
必須 サービス アカウントに関連する権限の数を返します。 |
アクションの出力
[サービス アカウントのロールを一覧表示] アクションは、次の出力を提供します。
| アクションの出力タイプ | 対象 |
|---|---|
| ケースウォールのアタッチメント | 利用不可 |
| ケースウォールのリンク | 利用不可 |
| ケースウォール テーブル | 利用不可 |
| 拡充テーブル | 利用不可 |
| JSON の結果 | 利用可能 |
| 出力メッセージ | 利用可能 |
| スクリプトの結果 | 利用可能 |
JSON の結果
次の例は、サービス アカウントのロールを一覧表示するアクションを使用した場合に受信される JSON 結果の出力を示しています。
{
"roles": ["role1", "role2"],
"unique_permissions": ["permission1", "permission2"]
}
出力メッセージ
サービス アカウントのロールを一覧表示アクションは、次の出力メッセージを返すことがあります。
| 出力メッセージ | メッセージの説明 |
|---|---|
|
アクションが成功しました。 |
Error executing action "List Service Account Roles". Reason:
ERROR_REASON |
操作に失敗しました。 サーバーへの接続、入力パラメータ、または認証情報を確認してください。 |
Ping
Ping アクションを使用して、Cloud Asset Inventory への接続をテストします。
このアクションは Google SecOps エンティティに対して実行されません。
アクションへの入力
なし
アクションの出力
[Ping] アクションでは、次の出力が提供されます。
| アクションの出力タイプ | 対象 |
|---|---|
| ケースウォールのアタッチメント | 利用不可 |
| ケースウォールのリンク | 利用不可 |
| ケースウォール テーブル | 利用不可 |
| 拡充テーブル | 利用不可 |
| JSON の結果 | 利用不可 |
| 出力メッセージ | 利用可能 |
| スクリプトの結果 | 利用可能 |
出力メッセージ
Ping アクションは、次の出力メッセージを返すことができます。
| 出力メッセージ | メッセージの説明 |
|---|---|
Successfully connected to the Google Cloud Asset Inventory
server with the provided connection parameters! |
アクションが成功しました。 |
Failed to connect to the Google Cloud Asset Inventory server!
|
操作に失敗しました。 |
スクリプトの結果
次の表に、Ping アクションを使用した場合のスクリプト結果出力の値を示します。
| スクリプトの結果名 | 値 |
|---|---|
is_success |
True または False |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。