Memvalidasi kebijakan

Sebelum memulai

Instal Google Cloud CLI

Untuk menggunakan gcloud beta terraform vet, Anda harus menginstal Google Cloud CLI terlebih dahulu:

  1. Instal Google Cloud CLI, tetapi lewati perintah gcloud init.

  2. Jalankan perintah berikut untuk menginstal komponen terraform-tools:

    gcloud components update
    gcloud components install terraform-tools
    
  3. Pastikan gcloud CLI sudah terinstal dengan menjalankan perintah berikut:

    gcloud beta terraform vet --help
    

Mendapatkan izin yang diperlukan

Akun Google Cloud yang Anda gunakan untuk validasi harus memiliki izin berikut:

  • getIamPolicy: gcloud beta terraform vet perlu mendapatkan kebijakan Identity and Access Management (IAM) lengkap dan menggabungkannya dengan anggota dan binding guna mendapatkan status akhir yang akurat untuk memvalidasi.
  • resourcemanager.projects.get: gcloud beta terraform vet perlu mendapatkan ancestry project dari API agar dapat membuat Nama Aset CAI lengkap secara akurat untuk project apa pun yang terkait dengan resource yang divalidasi.
  • resourcemanager.folders.get: gcloud beta terraform vet perlu mendapatkan ancestry folder dari API agar dapat membuat Nama Aset CAI lengkap secara akurat jika resource yang divalidasi berisi resource terkait folder.

Menyiapkan library kebijakan

Anda harus membuat library kebijakan untuk menggunakan alat ini.

Memvalidasi kebijakan

1. Membuat rencana Terraform

gcloud beta terraform vet kompatibel dengan Terraform 0.12+. gcloud beta terraform vet menggunakan JSON terraform plan sebagai inputnya. Anda dapat membuat file JSON dengan menjalankan perintah berikut di direktori Terraform:

terraform plan -out=tfplan.tfplan
terraform show -json ./tfplan.tfplan > ./tfplan.json

2. Jalankan gcloud beta terraform vet

gcloud beta terraform vet memungkinkan Anda memvalidasi JSON terraform plan terhadap POLICY_LIBRARY_REPO organisasi Anda. Contoh:

git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR
gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR

Saat Anda menjalankan perintah ini, gcloud beta terraform vet akan mengambil data project dengan menggunakan Google Cloud API yang diperlukan untuk validasi rencana Anda secara akurat.

Flag

  • --policy-library=POLICY_LIBRARY_DIR - Direktori yang berisi library kebijakan.
  • --project=PROJECT_ID - gcloud beta terraform vet menerima flag --project opsional. Flag ini menentukan project default saat membangun ancestry (dari hierarki resource Google Cloud) untuk resource apa pun yang tidak memiliki kumpulan project eksplisit.
  • --format=FORMAT - Defaultnya adalah yaml. Format yang didukung adalah: default, json, none, text, yaml. Untuk mengetahui detail selengkapnya, jalankan $ format topik gcloud.

Kode exit dan output

  • Jika semua batasan telah divalidasi, perintah akan menampilkan kode exit 0 dan tidak menampilkan pelanggaran.
  • Jika pelanggaran ditemukan, gcloud beta terraform vet akan menampilkan kode exit 2, dan menampilkan daftar pelanggaran. Misalnya, output JSON mungkin terlihat seperti ini:
[
  {
    "constraint": "GCPIAMAllowedPolicyMemberDomainsConstraintV2.service_accounts_only",
    "constraint_config": {
      "api_version": "constraints.gatekeeper.sh/v1alpha1",
      "kind": "GCPIAMAllowedPolicyMemberDomainsConstraintV2",
      "metadata": {
        "annotations": {
          "description": "Checks that members that have been granted IAM roles belong to allowlisted domains.",
          "validation.gcp.forsetisecurity.org/originalName": "service_accounts_only",
          "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/iam_service_accounts_only.yaml"
        },
        "name": "service-accounts-only"
      },
      "spec": {
        "match": {
          "target": [
            "organizations/**"
          ]
        },
        "parameters": {
          "domains": [
            "gserviceaccount.com"
          ]
        },
        "severity": "high"
      }
    },
    "message": "IAM policy for //cloudresourcemanager.googleapis.com/projects/PROJECT_ID contains member from unexpected domain: user:me@example.com",
    "metadata": {
      "ancestry_path": "organizations/ORG_ID/projects/PROJECT_ID",
      "constraint": {
        "annotations": {
          "description": "Checks that members that have been granted IAM roles belong to allowlisted domains.",
          "validation.gcp.forsetisecurity.org/originalName": "service_accounts_only",
          "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/iam_service_accounts_only.yaml"
        },
        "labels": {},
        "parameters": {
          "domains": [
            "gserviceaccount.com"
          ]
        }
      },
      "details": {
        "member": "user:me@example.com",
        "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID"
      }
    },
    "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID",
    "severity": "high"
  }
]

Contoh CI/CD

Skrip bash untuk menggunakan gcloud beta terraform vet di pipeline CI/CD bisa terlihat seperti ini:

terraform plan -out=tfplan.tfplan
terraform show -json ./tfplan.tfplan > ./tfplan.json
git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR
VIOLATIONS=$(gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR --format=json)
retVal=$?
if [ $retVal -eq 2 ]; then
  # Optional: parse the VIOLATIONS variable as json and check the severity level
  echo "$VIOLATIONS"
  echo "Violations found; not proceeding with terraform apply"
  exit 1
fi
if [ $retVal -ne 0]; then
  echo "Error during gcloud beta terraform vet; not proceeding with terraform apply"
  exit 1
fi

echo "No policy violations detected; proceeding with terraform apply"

terraform apply

Developer juga dapat menggunakan gcloud beta terraform vet secara lokal untuk menguji perubahan Terraform sebelum menjalankan pipeline CI/CD Anda.