Guide de démarrage rapide gcloud beta terraform vet

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

  1. Accédez à Cloud Shell et clonez la bibliothèque de stratégies.

    Cloner la bibliothèque de règles

  2. 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
    
  3. 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 domaine gserviceaccount.com peuvent figurer dans une stratégie IAM.

  4. 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éer policy-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
  5. Initialisez Terraform et générez un plan Terraform à l'aide de la commande suivante :

    terraform init
    
  6. Exportez le plan Terraform et cliquez sur Autoriser si vous y êtes invité :

    terraform plan -out=test.tfplan
    
  7. Convertissez le plan Terraform au format JSON :

    terraform show -json ./test.tfplan > ./tfplan.json
    
  8. Installez le composant terraform-tools :

    sudo apt-get install google-cloud-sdk-terraform-tools
    
  9. 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"
    }
    ]
    
  10. 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
    
  11. 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.