Questa guida rapida illustra come applicare una limitazione che impone una limitazione del dominio. Testerai la limitazione e genererai intenzionalmente un errore. Poi, dovrai modificare la limitazione in modo che il dominio venga accettato.
Prima di iniziare
- Devi disporre di un progetto Google Cloud.
Per il progetto sono necessarie le seguenti autorizzazioni IAM (Gestione di identità e accessi):
resourcemanager.projects.getIamPolicy
: questa autorizzazione può essere concessa con il ruolo di revisore della sicurezza per l'organizzazione.resourcemanager.projects.get
: questa autorizzazione può essere concessa con il ruolo Visualizzatore progetto per l'organizzazione.
Per iniziare rapidamente, queste istruzioni utilizzano Cloud Shell con Terraform preinstallato e un repository della raccolta di norme clonato. Le istruzioni presuppongono che tu abbia già un account Google Cloud.
Guida rapida
Vai a Cloud Shell e clona la raccolta di norme.
Copia il vincolo di limitazione del dominio IAM di esempio nella directory
policies/constraints
.cp samples/iam_service_accounts_only.yaml policies/constraints
Esamina la limitazione che hai copiato stampandola nel terminale.
cat policies/constraints/iam_service_accounts_only.yaml
L'output è il seguente:
# 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
Nota
gserviceaccount.com
in basso. Questo specifica che solo i membri del dominiogserviceaccount.com
possono essere presenti in un criterio IAM.Per verificare che il criterio funzioni come previsto, crea il seguente file Terraform
main.tf
nella directory corrente. Puoi utilizzare nano, vim o l'editor Cloud Shell per crearepolicy-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" ] }
Sostituisci quanto segue:
PROJECT_ID
: il tuo ID progetto.EMAIL_ADDRESS
: un indirizzo email di esempio. Può essere qualsiasi indirizzo email valido. Ad esempio,user@example.com
.
Inizializza Terraform e genera un piano Terraform utilizzando quanto segue:
terraform init
Esporta il piano Terraform e, se richiesto, fai clic su Autorizza:
terraform plan -out=test.tfplan
Converti il piano Terraform in JSON:
terraform show -json ./test.tfplan > ./tfplan.json
Installa il componente terraform-tools:
sudo apt-get install google-cloud-sdk-terraform-tools
Inserisci il seguente comando per verificare che il tuo piano Terraform sia conforme alle tue norme:
gcloud beta terraform vet tfplan.json --policy-library=. --format=json
Poiché l'indirizzo email che hai fornito nell'associazione dei criteri IAM non appartiene a un account di servizio, il piano viola il vincolo che hai configurato.
[ { "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" } ]
Per consentire un altro dominio (la tua email), modifica
policy-library/policies/constraints/iam_service_accounts_only.yaml
e aggiungi il dominio email alla lista consentita dei domini. Nell'esempio seguente abbiamo aggiuntoexample.com
, ma tu dovrai inserire il dominio per il tuo indirizzo email:apiVersion: constraints.gatekeeper.sh/v1alpha1 kind: GCPIAMAllowedPolicyMemberDomainsConstraintV1 metadata: name: service_accounts_only spec: severity: high match: target: ["organizations/**"] parameters: domains: - gserviceaccount.com - example.com
Ora convalida di nuovo il piano Terraform e non dovrebbero essere rilevate violazioni:
gcloud beta terraform vet tfplan.json --policy-library=. --format=json
Risultato previsto:
[]
Risoluzione dei problemi
Se ricevi il seguente errore, "Error 403: The caller does not have permission, forbidden"
, significa che non hai sostituito PROJECT_ID
in policy-library/main.tf
con il nome del progetto o che non disponi delle autorizzazioni necessarie per il progetto specificato.
Dopo aver modificato il nome e/o le autorizzazioni del progetto (resourcemanager.projects.getIamPolicy
e resourcemanager.projects.get
), torna indietro ed esporta di nuovo il piano Terraform, quindi convertilo in JSON.