Avant de commencer
Installer Google Cloud CLI
Pour utiliser gcloud beta terraform vet
, vous devez d'abord installer Google Cloud CLI :
Installez Google Cloud CLI, mais ignorez la commande
gcloud init
.Exécutez les commandes suivantes pour installer le composant terraform-tools :
gcloud components update gcloud components install terraform-tools
Vérifiez que gcloud CLI est installé en exécutant la commande suivante :
gcloud beta terraform vet --help
Obtenir les autorisations requises
Le compte Google Cloud que vous utilisez pour la validation doit disposer des autorisations suivantes :
getIamPolicy
:gcloud beta terraform vet
doit obtenir des stratégies Identity and Access Management (IAM) complètes, et les fusionner avec les membres et les liaisons pour disposer d'un état final précis à valider.resourcemanager.projects.get
:gcloud beta terraform vet
doit obtenir l'ancêtre du projet depuis l'API afin de créer avec précision un nom d'élément CAI complet pour tous les projets auxquels des ressources validées sont associées.resourcemanager.folders.get
:gcloud beta terraform vet
doit obtenir l'ancêtre du dossier auprès de l'API afin de créer avec précision un nom d'élément CAI complet si les ressources validées contiennent des ressources liées au dossier.
Configurer une bibliothèque de stratégies
Vous devez créer une bibliothèque de stratégies pour utiliser cet outil.
Valider les règles
1. Générer un plan Terraform
gcloud beta terraform vet
est compatible avec Terraform 0.12 et les versions ultérieures. gcloud beta terraform vet
accepte comme entrée l'objet JSON terraform plan
. Vous pouvez générer le fichier JSON en exécutant les commandes suivantes dans le répertoire Terraform :
terraform plan -out=tfplan.tfplan terraform show -json ./tfplan.tfplan > ./tfplan.json
2. Exécuter gcloud beta terraform vet
gcloud beta terraform vet
vous permet de valider votre fichier JSON terraform plan
par rapport au POLICY_LIBRARY_REPO de votre organisation. Exemple :
git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR
Lorsque vous exécutez cette commande, gcloud beta terraform vet
récupère les données du projet en utilisant les API Google Cloud nécessaires à une validation précise de votre plan.
Options
--policy-library=POLICY_LIBRARY_DIR
: répertoire contenant une bibliothèque de règles--project=PROJECT_ID
-gcloud beta terraform vet
accepte une option--project
facultative. Cette option spécifie le projet par défaut lors de la création de l'ancêtre (à partir de la hiérarchie des ressources Google Cloud) pour toute ressource dans laquelle aucun projet n'est explicitement défini.--format=FORMAT
: le format par défaut est yaml. Les formats acceptés sont les suivants :default
,json
,none
,text
,yaml
. Pour en savoir plus, exécutez $ gcloud topic formats.
Code de sortie et résultat
- Si toutes les contraintes sont validées, la commande renvoie le code de sortie 0 et n'affiche aucune violation.
- Si des problèmes de non-respect sont détectés,
gcloud beta terraform vet
renvoie le code de sortie 2 et affiche la liste des cas de non-respect. Par exemple, la sortie JSON peut ressembler à ceci :
[ { "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" } ]
Exemple CI/CD
Un script bash permettant d'utiliser gcloud beta terraform vet
dans un pipeline CI/CD peut se présenter comme suit :
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
Les développeurs peuvent également utiliser gcloud beta terraform vet
en local pour tester les modifications Terraform avant d'exécuter le pipeline CI/CD.