Panduan memulai gcloud beta terraform vet

Panduan memulai ini menunjukkan cara menerapkan batasan yang memberlakukan pembatasan domain. Anda akan menguji batasan tersebut dan sengaja menampilkan error. Kemudian, ubah batasan agar domain Anda dinyatakan lulus.

Sebelum memulai

  • Anda memerlukan project Google Cloud.
  • Anda memerlukan izin Identity and Access Management (IAM) berikut untuk project tersebut:

    • resourcemanager.projects.getIamPolicy – Izin ini dapat diberikan dengan peran Security Reviewer untuk organisasi.
    • resourcemanager.projects.get – Izin ini dapat diberikan dengan peran Project Viewer untuk organisasi.

Untuk membantu Anda memulai dengan cepat, petunjuk ini menggunakan Cloud Shell yang telah diinstal sebelumnya dengan Terraform, dan dengan repositori Library Kebijakan yang di-clone. Petunjuk ini mengasumsikan bahwa Anda sudah memiliki akun Google Cloud.

Panduan memulai

  1. Buka Cloud Shell dan buat clone library kebijakan.

    Buat clone library kebijakan

  2. Salin contoh batasan domain IAM ke direktori policies/constraints.

    cp samples/iam_service_accounts_only.yaml policies/constraints
    
  3. Periksa batasan yang disalin dengan mencetaknya ke terminal.

    cat policies/constraints/iam_service_accounts_only.yaml
    

    Outputnya akan terlihat seperti ini:

    # This constraint checks that all IAM policy members are in the
    # "gserviceaccount.com" domain.
    apiVersion: constraints.gatekeeper.sh/v1alpha1
    kind: GCPIAMAllowedPolicyMemberDomainsConstraintV2
    metadata:
      name: service_accounts_only
      annotations:
        description: Checks that members that have been granted IAM roles belong to allowlisted
          domains.
    spec:
      severity: high
      match:
        target: # {"$ref":"#/definitions/io.k8s.cli.setters.target"}
        - "organizations/**"
      parameters:
        domains:
        - gserviceaccount.com
    

    Perhatikan gserviceaccount.com di bagian bawah. Ini menetapkan bahwa hanya anggota dari domain gserviceaccount.com yang boleh ada dalam kebijakan IAM.

  4. Untuk memastikan bahwa kebijakan berfungsi seperti yang diharapkan, buat file main.tf Terraform berikut di direktori saat ini. Anda dapat menggunakan nano, vim, atau Cloud Shell Editor untuk membuat policy-library/main.tf.

    terraform {
      required_providers {
        google = {
          source = "hashicorp/google"
          version = "~> 3.84"
        }
      }
    }
    
    resource "google_project_iam_binding" "sample_iam_binding" {
      project = "PROJECT_ID"
      role    = "roles/viewer"
    
      members = [
        "user:EMAIL_ADDRESS"
      ]
    }
    

    Ganti kode berikut:

    • PROJECT_ID: project ID Anda.
    • EMAIL_ADDRESS: contoh alamat email. Alamat email ini dapat berupa alamat email apa pun yang valid. Contoh, user@example.com.
  5. Lakukan inisialisasi Terraform dan buat rencana Terraform menggunakan cara berikut:

    terraform init
    
  6. Ekspor rencana Terraform. Jika diminta, klik Authorize:

    terraform plan -out=test.tfplan
    
  7. Konversikan rencana Terraform ke JSON:

    terraform show -json ./test.tfplan > ./tfplan.json
    
  8. Instal komponen terraform-tools:

    sudo apt-get install google-cloud-sdk-terraform-tools
    
  9. Masukkan perintah berikut untuk memvalidasi bahwa rencana Terraform mematuhi kebijakan Anda:

    gcloud beta terraform vet tfplan.json --policy-library=. --format=json
    

    Karena alamat email yang Anda berikan di binding kebijakan IAM bukan milik akun layanan, rencana tersebut melanggar batasan yang Anda siapkan.

    [
    {
      "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:user@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:user@example.com",
          "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID"
        }
      },
      "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID",
      "severity": "high"
    }
    ]
  10. Untuk mengizinkan domain lain (email Anda), edit policy-library/policies/constraints/iam_service_accounts_only.yaml dan tambahkan domain email Anda ke daftar domain yang diizinkan. Dalam contoh berikut, kami telah menambahkan example.com, tetapi Anda akan memasukkan domain untuk alamat email Anda sendiri:

    apiVersion: constraints.gatekeeper.sh/v1alpha1
    kind: GCPIAMAllowedPolicyMemberDomainsConstraintV1
    metadata:
      name: service_accounts_only
    spec:
      severity: high
      match:
        target: ["organizations/**"]
      parameters:
        domains:
          - gserviceaccount.com
          - example.com
    
  11. Sekarang validasi lagi rencana Terraform Anda, dan harusnya sudah tidak ada pelanggaran yang ditemukan:

    gcloud beta terraform vet tfplan.json --policy-library=. --format=json
    

    Output yang diharapkan:

    []

Pemecahan masalah

Jika Anda menerima error berikut, "Error 403: The caller does not have permission, forbidden", berarti Anda tidak mengganti PROJECT_ID di policy-library/main.tf dengan nama project Anda, atau Anda tidak memiliki izin yang diperlukan pada project yang ditentukan.

Setelah mengedit nama dan/atau izin project (resourcemanager.projects.getIamPolicy dan resourcemanager.projects.get), kembali dan ekspor rencana Terraform lagi, lalu konversikan rencana Terraform ke JSON.