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] に移動します。
サービス アカウントを見つけて、[editプリンシパルを編集] をクリックします。
[別のロールを追加] をクリックし、次のロールを選択します。
前のステップで作成したカスタム 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にサービス アカウントのメールアドレスを入力します。[保存] > [テスト] をクリックします。テストは失敗することが想定されます。
[テスト] の右側にある 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] に移動し、プロジェクトを選択します。
プリンシパルのリストでサービス アカウントを見つけて、そのアカウントの edit(プリンシパルを編集)をクリックします。
[別のロールを追加] をクリックし、[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 |
省略可
返されるフィールドのカンマ区切りのリスト。 デフォルト値は 値の例は次のとおりです。 このアクションは常に 高度なフィルタを構成するオプションもあります。たとえば、 |
アクションの出力
Enrich Resource アクションは、次の出力を提供します。
| アクションの出力タイプ | 対象 |
|---|---|
| ケースウォールのアタッチメント | 利用不可 |
| ケースウォールのリンク | 利用不可 |
| ケースウォール テーブル | 利用不可 |
| 拡充テーブル | 利用不可 |
| 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"
}
}
]
出力メッセージ
Enrich Resource アクションは、次の出力メッセージを返すことができます。
| 出力メッセージ | メッセージの説明 |
|---|---|
|
アクションが成功しました。 |
Error executing action "Enrich resources". Reason:
ERROR_REASON |
アクションが失敗しました。 サーバーへの接続、入力パラメータ、または認証情報を確認してください。 |
スクリプトの結果
次の表に、リソースを拡充アクションを使用した場合のスクリプト結果の出力値を示します。
| スクリプトの結果名 | 値 |
|---|---|
is_success |
True または False |
リソース スナップショットを取得する
リソース スナップショットを取得アクションを使用して、Cloud Asset Inventory を使用してリソースに関する情報を取得します。
このアクションは Google SecOps エンティティに対しては実行されません。
アクションへの入力
Get Resource Snapshot アクションを構成するには、次のパラメータを使用します。
| パラメータ | 説明 |
|---|---|
Resource Names |
必須 詳細を取得するリソースのカンマ区切りのリスト。 このパラメータを構成するには、メタデータ リソースの完全な名前を |
Fields To Return |
Optional 返されるフィールドのカンマ区切りのリスト。 次の形式ですべてのフィールドを入力します。 assets.FIELD
値の例は次のとおりです。 このアクションは常に デフォルト値は |
アクションの出力
Get Resource Snapshot アクションでは、次の出力が提供されます。
| アクションの出力タイプ | 対象 |
|---|---|
| ケースウォールのアタッチメント | 利用不可 |
| ケースウォールのリンク | 利用不可 |
| ケースウォール テーブル | 利用不可 |
| 拡充テーブル | 利用不可 |
| JSON の結果 | 利用可能 |
| 出力メッセージ | 利用可能 |
| スクリプトの結果 | 利用可能 |
JSON の結果
次の例は、Get Resource Snapshot アクションを使用した場合に受信される 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" } } ] } } ]
出力メッセージ
Get Resource Snapshot アクションは、次の出力メッセージを返すことができます。
| 出力メッセージ | メッセージの説明 |
|---|---|
Successfully returned information about the following resources
using Google Cloud Asset Inventory:
ASSET_IDENTIFIER
|
アクションが成功しました。 |
Error executing action "Get Resource Snapshot". Reason:
ERROR_REASON |
アクションが失敗しました。 サーバーへの接続、入力パラメータ、または認証情報を確認してください。 |
スクリプトの結果
次の表に、Get Resource Snapshot アクションを使用した場合のスクリプト結果の出力値を示します。
| スクリプトの結果名 | 値 |
|---|---|
is_success |
True または False |
サービス アカウントのロールを一覧表示する
サービス アカウントのロールを一覧表示するアクションを使用して、Cloud Asset Inventory を使用して Google Cloud サービス アカウントに関連するロールを一覧表示します。
このアクションは Google SecOps エンティティに対しては実行されません。
アクションへの入力
List Service Account Roles アクションを構成するには、次のパラメータを使用します。
| パラメータ | 説明 |
|---|---|
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 のプロフェッショナルから回答を得ることができます。