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
Buka Cloud Shell dan buat clone library kebijakan.
Salin contoh batasan domain IAM ke direktori
policies/constraints
.cp samples/iam_service_accounts_only.yaml policies/constraints
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 domaingserviceaccount.com
yang boleh ada dalam kebijakan IAM.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 membuatpolicy-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
.
Lakukan inisialisasi Terraform dan buat rencana Terraform menggunakan cara berikut:
terraform init
Ekspor rencana Terraform. Jika diminta, klik Authorize:
terraform plan -out=test.tfplan
Konversikan rencana Terraform ke JSON:
terraform show -json ./test.tfplan > ./tfplan.json
Instal komponen terraform-tools:
sudo apt-get install google-cloud-sdk-terraform-tools
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" } ]
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 menambahkanexample.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
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.