Ce guide de démarrage rapide vous explique comment implémenter une contrainte qui applique une restriction de domaine. Vous allez tester cette contrainte et générer intentionnellement une erreur. Vous devrez ensuite modifier la contrainte de sorte que votre domaine soit transmis.
Avant de commencer
- Vous avez besoin d'un projet Google Cloud.
Vous devez disposer des autorisations IAM (Identity and Access Management) suivantes pour ce projet :
resourcemanager.projects.getIamPolicy
: cette autorisation peut être accordée avec le rôle Examinateur de sécurité pour l'organisation.resourcemanager.projects.get
: cette autorisation peut être accordée avec le rôle Lecteur de projet pour l'organisation.
Pour vous aider à démarrer rapidement, ces instructions utilisent un environnement Cloud Shell préinstallé avec Terraform et un dépôt de bibliothèque de règles clonée. Dans ces instructions, nous partons du principe que vous disposez déjà d'un compte Google Cloud.
Démarrage rapide
Accédez à Cloud Shell et clonez la bibliothèque de stratégies.
Copiez l'exemple de contrainte de restriction de domaine IAM dans le répertoire
policies/constraints
.cp samples/iam_service_accounts_only.yaml policies/constraints
Examinez la contrainte que vous avez copiée en l'affichant sur le terminal.
cat policies/constraints/iam_service_accounts_only.yaml
Le résultat ressemble à ceci :
# 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
gserviceaccount.com
est visible en bas. Elle indique que seuls les membres du domainegserviceaccount.com
peuvent figurer dans une stratégie IAM.Pour vérifier que la stratégie fonctionne comme prévu, créez le fichier Terraform
main.tf
suivant dans le répertoire actuel. Vous pouvez utiliser nano, vim ou l'éditeur Cloud Shell pour créerpolicy-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" ] }
Remplacez les éléments suivants :
PROJECT_ID
: ID de votre projet.EMAIL_ADDRESS
: un exemple d'adresse e-mail. Il peut s'agir de n'importe quelle adresse e-mail valide. Exemple :user@example.com
Initialisez Terraform et générez un plan Terraform à l'aide de la commande suivante :
terraform init
Exportez le plan Terraform et cliquez sur Autoriser si vous y êtes invité :
terraform plan -out=test.tfplan
Convertissez le plan Terraform au format JSON :
terraform show -json ./test.tfplan > ./tfplan.json
Installez le composant terraform-tools :
sudo apt-get install google-cloud-sdk-terraform-tools
Saisissez la commande suivante pour vérifier que votre plan Terraform est conforme à vos règles :
gcloud beta terraform vet tfplan.json --policy-library=. --format=json
Étant donné que l'adresse e-mail que vous avez fournie dans la liaison de stratégie IAM n'appartient pas à un compte de service, le plan ne respecte pas la contrainte que vous avez configurée.
[ { "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" } ]
Pour autoriser un autre domaine (votre adresse e-mail), modifiez
policy-library/policies/constraints/iam_service_accounts_only.yaml
et ajoutez votre domaine de messagerie à la liste d'autorisation de domaines. Dans l'exemple suivant, nous avons ajoutéexample.com
, mais vous devez saisir le domaine de votre propre adresse e-mail :apiVersion: constraints.gatekeeper.sh/v1alpha1 kind: GCPIAMAllowedPolicyMemberDomainsConstraintV1 metadata: name: service_accounts_only spec: severity: high match: target: ["organizations/**"] parameters: domains: - gserviceaccount.com - example.com
Validez à nouveau votre plan Terraform pour éviter toute violation :
gcloud beta terraform vet tfplan.json --policy-library=. --format=json
Résultat attendu :
[]
Dépannage
Si l'erreur "Error 403: The caller does not have permission, forbidden"
s'affiche, cela signifie que vous n'avez pas remplacé PROJECT_ID
par le nom de votre projet dans policy-library/main.tf
ou que vous ne disposez pas des autorisations nécessaires pour le projet que vous avez spécifié.
Après avoir modifié le nom et/ou les autorisations du projet (resourcemanager.projects.getIamPolicy
et resourcemanager.projects.get
), revenez en arrière et exportez à nouveau le plan Terraform, puis convertissez-le au format JSON.