このチュートリアルでは、Infrastructure as Code(IaC)が組織のポリシーや Security Health Analytics の検出機能に違反していないことを確認する方法について説明します。
目標
- セキュリティ ポスチャーを作成する。
- プロジェクトにポスチャーをデプロイする。
- サンプルの Terraform ファイルに違反がないか確認する。
- Terraform ファイルの違反を修正し、ファイルを再度確認して修正を検証する。
始める前に
権限を設定する
-
コンソールで、[IAM] ページに移動します。 Google Cloud
IAM に移動 - 組織を選択します。
-
[Principal] 列で、自分または自分が所属するグループを識別するすべての行を見つけます。自分が所属しているグループを確認するには、管理者にお問い合わせください。
- 自分を指定または含んでいるすべての行について、[ロール] 列で、 ロールのリストに必要なロールが含まれているかどうかを確認します。
-
コンソールで、[IAM] ページに移動します。 Google Cloud
IAM に移動 - 組織を選択します。
- [Grant access] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。
- [**ロールを選択**] をクリックして、ロールを検索します。
- 追加のロールを付与するには、 [Add another role] をクリックして各ロールを追加します。
- [保存] をクリックします。
組織に次のロールが割り当てられていることを確認します。 プロジェクト作成者、セキュリティ ポスチャー管理者
ロールを確認する
ロールを付与する
Cloud Shell を設定する
- 自分の組織 ID を確認します。
gcloud organizations list
コンソールで Cloud Shell をアクティブにします。 Google Cloud
コンソールの下部にある Google Cloud Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です 。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています 。セッションが初期化されるまで数秒かかることがあります。
環境を準備する
- アカウントにログインします Google Cloud を初めて使用する場合は、 Google Cloud アカウントを作成して、 実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを Google Cloud 作成または選択します。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択には特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Security Posture サービスと Security Command Center 管理 API を有効にします。
API を有効にするために必要なロール
API を有効にするには、 権限を含む Service Usage 管理者 IAM ロール(
roles/serviceusage.serviceUsageAdmin)が必要です。serviceusage.services.enable詳しくは、ロールを付与する方法をご覧ください。gcloud services enable securityposture.googleapis.com
securitycentermanagement.googleapis.com -
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを Google Cloud 作成または選択します。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択には特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Security Posture サービスと Security Command Center 管理 API を有効にします。
API を有効にするために必要なロール
API を有効にするには、 権限を含む Service Usage 管理者 IAM ロール(
roles/serviceusage.serviceUsageAdmin)が必要です。serviceusage.services.enable詳しくは、ロールを付与する方法をご覧ください。gcloud services enable securityposture.googleapis.com
securitycentermanagement.googleapis.com - プロジェクト番号をコピーします。ポスチャーのデプロイ中にターゲット リソースを設定するには、プロジェクト番号が必要です。
gcloud projects describe PROJECT_ID
- Terraform を初期化します。
terraform init
対策を作成してデプロイする
Cloud Shell で Cloud Shell エディタを起動します。エディタを起動するには、Cloud Shell ウィンドウのツールバーにある
[エディタを開く] をクリックします。example-standard.yamlという名前の YAML ファイルを作成します。次のコードをファイルに貼り付けます。
name: organizations/ORGANIZATION_ID/locations/global/postures/example-standard state: ACTIVE policySets: - policies: - constraint: orgPolicyConstraintCustom: customConstraint: actionType: ALLOW condition: "resource.initialNodeCount == 3" description: Set initial node count to be exactly 3. displayName: fixedNodeCount methodTypes: - CREATE name: organizations/ORGANIZATION_ID/customConstraints/custom.fixedNodeCount resourceTypes: - container.googleapis.com/NodePool policyRules: - enforce: true policyId: fixedNodeCount - constraint: securityHealthAnalyticsCustomModule: config: customOutput: {} description: Set MTU for a network to be exactly 1000. predicate: expression: "!(resource.mtu == 1000)" recommendation: Only create networks whose MTU is 1000. resourceSelector: resourceTypes: - compute.googleapis.com/Network severity: HIGH displayName: fixedMTU moduleEnablementState: ENABLED policyId: fixedMTU - constraint: securityHealthAnalyticsModule: moduleEnablementState: ENABLED moduleName: BUCKET_POLICY_ONLY_DISABLED policyId: bucket_policy_only_disabled - constraint: securityHealthAnalyticsModule: moduleEnablementState: ENABLED moduleName: BUCKET_LOGGING_DISABLED policyId: bucket_logging_disabled policySetId: policySet1
ORGANIZATION_ID は、実際の組織 ID に置き換えます。
Cloud Shell で、ポスチャーを作成します。
gcloud scc postures create organizations/ORGANIZATION_ID/locations/global/postures/example-standard --posture-from-file=example-standard.yaml
コマンドで生成されるポスチャー リビジョン ID をコピーします。
ポスチャーをプロジェクトにデプロイします。
gcloud scc posture-deployments create organizations/ORGANIZATION_ID/locations/global/postureDeployments/example-standard \ --posture-name=organizations/ORGANIZATION_ID/locations/global/postures/example-standard \ --posture-revision-id="POSTURE_REVISION_ID" \ --target-resource=projects/PROJECT_NUMBER
次のように置き換えます。
ORGANIZATION_ID: 組織の ID。POSTURE REVISION_ID: コピーしたポスチャーのリビジョン ID。PROJECT_NUMBER: プロジェクトの番号。
Terraform ファイルを作成して検証する
Cloud Shell で Cloud Shell エディタを起動します。
main.tfという名前の Terraform ファイルを作成します。次のコードをファイルに貼り付けます。
terraform { required_providers { google = { source = "hashicorp/google" } } } provider "google" { region = "us-central1" zone = "us-central1-c" } resource "google_compute_network" "example_network"{ name = "example-network-1" delete_default_routes_on_create = false auto_create_subnetworks = false routing_mode = "REGIONAL" mtu = 100 project = "PROJECT_ID" } resource "google_container_node_pool" "example_node_pool" { name = "example-node-pool-1" cluster = "example-cluster-1" project = "PROJECT_ID" initial_node_count = 2 node_config { preemptible = true machine_type = "e2-medium" } } resource "google_storage_bucket" "example_bucket" { name = "example-bucket-1" location = "EU" force_destroy = true project = "PROJECT_ID" uniform_bucket_level_access = false }PROJECT_IDは、作成したプロジェクトのプロジェクト ID に置き換えます。Cloud Shell で、Terraform プランファイルを作成して JSON 形式に変換します。
terraform plan -out main.plan terraform show -json main.plan > mainplan.json
mainplan.jsonの IaC 検証レポートを作成します。gcloud scc iac-validation-reports create organizations/ORGANIZATION_ID/locations/global --tf-plan-file=mainplan.json
このコマンドは、次の違反を記述する IaC 検証レポートを返します。
example_networkのmtuが 1,000 ではない。example_node_poolのinitial_node_countが 3 ではない。example_bucketで均一なバケットレベルのアクセスが有効になっていない。example_bucketでロギングが有効になっていない。
違反を解決する
Cloud Shell で Cloud Shell エディタを起動します。
main.tfファイルを更新して、次の変更を加えます。terraform { required_providers { google = { source = "hashicorp/google" } } } provider "google" { region = "us-central1" zone = "us-central1-c" } resource "google_compute_network" "example_network"{ name = "example-network-1" delete_default_routes_on_create = false auto_create_subnetworks = false routing_mode = "REGIONAL" mtu = 1000 project = "PROJECT_ID" } resource "google_container_node_pool" "example_node_pool" { name = "example-node-pool-1" cluster = "example-cluster-1" project = "PROJECT_ID" initial_node_count = 3 node_config { preemptible = true machine_type = "e2-medium" } } resource "google_storage_bucket" "example_bucket" { name = "example-bucket-1" location = "EU" force_destroy = true project = "PROJECT_ID" uniform_bucket_level_access = true logging { log_bucket = "my-unique-logging-bucket" // Create a separate bucket for logs log_object_prefix = "tf-logs/" // Optional prefix for better structure } }PROJECT_IDは、作成したプロジェクトのプロジェクト ID に置き換えます。Cloud Shell で、Terraform プランファイルを作成して JSON 形式に変換します。
terraform plan -out main.plan terraform show -json main.plan > mainplan.json
mainplan.jsonの IaC 検証レポートを再作成します。gcloud scc iac-validation-reports create organizations/ORGANIZATION_ID/locations/global --tf-plan-file=mainplan.json
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
プロジェクトを削除します。 Google Cloud
gcloud projects delete PROJECT_ID
次のステップ
- 組織のポリシーに対して IaC を検証するを確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。