Valider les règles

Avant de commencer

Installer Google Cloud CLI

Pour utiliser gcloud beta terraform vet, vous devez d'abord installer Google Cloud CLI :

  1. Installez Google Cloud CLI, mais ignorez la commande gcloud init.

  2. Exécutez les commandes suivantes pour installer le composant terraform-tools :

    gcloud components update
    gcloud components install terraform-tools
    
  3. 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.