サンプルの IaC 検証レポートを作成する


このチュートリアルでは、Infrastructure as Code(IaC)が組織のポリシーまたは Security Health Analytics の検出項目に違反していないことを確認する方法について説明します。

目標

  • セキュリティ体制を作成します。
  • 体制をプロジェクトにデプロイします。
  • Terraform ファイルの例で違反を確認します。
  • Terraform ファイルの違反を修正し、ファイルを再度確認して修正を確認します。

始める前に

権限を設定する

  1. 組織に次のロールがあることを確認します。 Project Creator and Security Posture Admin

    ロールを確認する

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動
    2. 組織を選択します。
    3. [プリンシパル] 列で、自分のメールアドレスを含む行を見つけます。

      自分のメールアドレスがその列にない場合、ロールは割り当てられていません。

    4. 自分のメールアドレスを含む行の [ロール] 列で、ロールのリストに必要なロールが含まれているかどうかを確認します。

    ロールを付与する

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動
    2. 組織を選択します。
    3. [ アクセスを許可] をクリックします。
    4. [新しいプリンシパル] フィールドに、自分のメールアドレスを入力します。
    5. [ロールを選択] リストでロールを選択します。
    6. 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
    7. [保存] をクリックします。

Cloud Shell を設定する

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  2. 自分の組織 ID を確認します。
    gcloud organizations list

環境を準備する

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Google Cloud CLI をインストールします。
  3. gcloud CLI を初期化するには:

    gcloud init
  4. Google Cloud プロジェクトを作成または選択します

    • Google Cloud プロジェクトを作成します。

      gcloud projects create PROJECT_ID

      PROJECT_ID は、作成する Google Cloud プロジェクトの名前に置き換えます。

    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID

      PROJECT_ID は、実際の Google Cloud プロジェクト名に置き換えます。

  5. Google Cloud プロジェクトで課金が有効になっていることを確認します

  6. Security posture service and Security Command Center management API を有効にします。

    gcloud services enable securityposture.googleapis.com securitycentermanagement.googleapis.com
  7. Google Cloud CLI をインストールします。
  8. gcloud CLI を初期化するには:

    gcloud init
  9. Google Cloud プロジェクトを作成または選択します

    • Google Cloud プロジェクトを作成します。

      gcloud projects create PROJECT_ID

      PROJECT_ID は、作成する Google Cloud プロジェクトの名前に置き換えます。

    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID

      PROJECT_ID は、実際の Google Cloud プロジェクト名に置き換えます。

  10. Google Cloud プロジェクトで課金が有効になっていることを確認します

  11. Security posture service and Security Command Center management API を有効にします。

    gcloud services enable securityposture.googleapis.com securitycentermanagement.googleapis.com
  12. プロジェクト ID をコピーします。
    gcloud projects describe PROJECT_ID
  13. Terraform を初期化します。
    terraform init

対策を作成してデプロイする

  1. Cloud Shell で、Cloud Shell エディタを起動します。エディタを起動するには、Cloud Shell ウィンドウのツールバーにある コードエディタ ボタン [エディタを開く] をクリックします。

  2. example-standard.yaml という名前の YAML ファイルを作成します。

  3. 次のコードをファイルに貼り付けます。

    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 に置き換えます。

  4. Cloud Shell で体制を作成します。

    gcloud scc postures create organizations/ORGANIZATION_ID/locations/global/postures/example-standard --posture-from-file=example-standard.yaml
    
  5. コマンドによって生成された体制リビジョン ID をコピーします。

  6. この体制をプロジェクトにデプロイします。

    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_ID
    

    次のように置き換えます。

    • ORGANIZATION_ID: 組織の ID。
    • POSTURE REVISION_ID: コピーした体制リビジョン ID。
    • PROJECT_ID: 実際のプロジェクト ID。

Terraform ファイルを作成して検証する

  1. Cloud Shell で Cloud Shell エディタを起動します。

  2. main.tf という名前の Terraform ファイルを作成します。

  3. 次のコードをファイルに貼り付けます。

    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 に置き換えます。

  4. Cloud Shell で Terraform 計画ファイルを作成し、JSON 形式に変換します。

    terraform plan -out main.plan
    terraform show -json main.plan > mainplan.json
    
  5. mainplan.json の IaC 検証レポートを作成します。

    gcloud scc iac-validation-reports create organizations/ORGANIZATION_ID/locations/global --tf-plan-file=mainplan.json
    

    このコマンドは、次の違反を説明する IaC 検証レポートを返します。

    • example_networkmtu は 1,000 ではありません。
    • example_node_poolinitial_node_count が 3 ではありません。
    • example_bucket で、均一なバケットレベルのアクセスが有効になっていません。
    • example_bucket でロギングが有効になっていません。

違反を解決する

  1. Cloud Shell で Cloud Shell エディタを起動します。

  2. 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 に置き換えます。

  3. Cloud Shell で、Terraform 計画ファイルを作成し、JSON 形式に変換します。

    terraform plan -out main.plan
    terraform show -json main.plan > mainplan.json
    
  4. mainplan.json の IaC 検証レポートを再作成します。

    gcloud scc iac-validation-reports create organizations/ORGANIZATION_ID/locations/global --tf-plan-file=mainplan.json
    

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

次のステップ