Créer un exemple de rapport de validation de l'IaC


Ce tutoriel explique comment vérifier que votre infrastructure en tant que code (IaC) ne viole pas les règles de votre organisation ni les détecteurs Security Health Analytics.

Objectifs

  • Créez une stratégie de sécurité.
  • Déployez la posture sur un projet.
  • Vérifiez si un exemple de fichier Terraform présente des cas de non-respect.
  • Corrigez les violations dans le fichier Terraform, puis vérifiez à nouveau le fichier pour confirmer la correction.

Avant de commencer

Configurer les autorisations

  1. Make sure that you have the following role or roles on the organization: Project Creator and Security Posture Admin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the organization.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Accéder à IAM
    2. Sélectionnez l'organisation.
    3. Cliquez sur Accorder l'accès.
    4. Dans le champ Nouveaux comptes principaux, saisissez votre identifiant utilisateur. Il s'agit généralement de l'adresse e-mail d'un compte Google.

    5. Dans la liste Sélectionner un rôle, sélectionnez un rôle.
    6. Pour attribuer des rôles supplémentaires, cliquez sur Ajouter un autre rôle et ajoutez chaque rôle supplémentaire.
    7. Cliquez sur Enregistrer.

    Configurer Cloud Shell

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    2. Trouvez l'ID de votre organisation :
      gcloud organizations list
    3. Préparer l'environnement

      1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
      2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

        Go to project selector

      3. Verify that billing is enabled for your Google Cloud project.

      4. Enable the Security posture service and Security Command Center management APIs.

        Enable the APIs

      5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

        Go to project selector

      6. Verify that billing is enabled for your Google Cloud project.

      7. Enable the Security posture service and Security Command Center management APIs.

        Enable the APIs

      8. Copiez le numéro du projet. Vous aurez besoin du numéro de projet pour définir la ressource cible lors du déploiement de la posture.
        gcloud projects describe PROJECT_ID
      9. Initialisez Terraform :
        terraform init
      10. Créer et déployer une stratégie

        1. Dans Cloud Shell, lancez l'éditeur Cloud Shell. Pour lancer l'éditeur, cliquez sur Bouton Éditeur de code Ouvrir l'éditeur dans la barre d'outils de la fenêtre Cloud Shell.

        2. Créez un fichier YAML nommé example-standard.yaml.

        3. Collez le code suivant dans votre fichier :

        name: organizations/ORGANIZATION_ID/locations/global/postures/example-standard
        state: ACTIVE
        policySets:
        - policies:
          - constraint:
              orgPolicyConstraintCustom:
                customConstraint:
                  actionType: ALLOW
                  condition: "resource.initialNodeCount == 3"
                  description: Set initial node count to be exactly 3.
                  displayName: fixedNodeCount
                  methodTypes:
                  - CREATE
                  name: organizations/ORGANIZATION_ID/customConstraints/custom.fixedNodeCount
                  resourceTypes:
                  - container.googleapis.com/NodePool
                policyRules:
                - enforce: true
            policyId: fixedNodeCount
          - constraint:
              securityHealthAnalyticsCustomModule:
                config:
                  customOutput: {}
                  description: Set MTU for a network to be exactly 1000.
                  predicate:
                    expression: "!(resource.mtu == 1000)"
                  recommendation: Only create networks whose MTU is 1000.
                  resourceSelector:
                    resourceTypes:
                    - compute.googleapis.com/Network
                  severity: HIGH
                displayName: fixedMTU
                moduleEnablementState: ENABLED
            policyId: fixedMTU
          - constraint:
              securityHealthAnalyticsModule:
                moduleEnablementState: ENABLED
                moduleName: BUCKET_POLICY_ONLY_DISABLED
            policyId: bucket_policy_only_disabled
          - constraint:
              securityHealthAnalyticsModule:
                moduleEnablementState: ENABLED
                moduleName: BUCKET_LOGGING_DISABLED
            policyId: bucket_logging_disabled
          policySetId: policySet1

        Remplacez ORGANIZATION_ID par votre ID d'organisation.

        1. Dans Cloud Shell, créez la posture :

          gcloud scc postures create organizations/ORGANIZATION_ID/locations/global/postures/example-standard --posture-from-file=example-standard.yaml
          
        2. Copiez l'ID de révision de la posture généré par la commande.

        3. Déployez la posture sur votre projet :

          gcloud scc posture-deployments create organizations/ORGANIZATION_ID/locations/global/postureDeployments/example-standard \
          --posture-name=organizations/ORGANIZATION_ID/locations/global/postures/example-standard \
          --posture-revision-id="POSTURE_REVISION_ID" \
          --target-resource=projects/PROJECT_NUMBER
          

          Remplacez les éléments suivants :

          • ORGANIZATION_ID : ID de votre organisation
          • POSTURE REVISION_ID : ID de la révision de votre posture que vous avez copié.
          • PROJECT_NUMBER : votre numéro de projet.

        Créer le fichier Terraform et le valider

        1. Dans Cloud Shell, lancez l'éditeur Cloud Shell.

        2. Créez un fichier Terraform nommé main.tf.

        3. Collez le code suivant dans votre fichier :

          terraform {
            required_providers {
              google = {
                source  = "hashicorp/google"
              }
            }
          }
          
          provider "google" {
            region  = "us-central1"
            zone    = "us-central1-c"
          }
          
          resource "google_compute_network" "example_network"{
            name                            = "example-network-1"
            delete_default_routes_on_create = false
            auto_create_subnetworks         = false
            routing_mode                    = "REGIONAL"
            mtu                             = 100
            project                         = "PROJECT_ID"
          }
          
          resource "google_container_node_pool" "example_node_pool" {
            name               = "example-node-pool-1"
            cluster            = "example-cluster-1"
            project            = "PROJECT_ID"
            initial_node_count = 2
          
            node_config {
              preemptible  = true
              machine_type = "e2-medium"
            }
          }
          
          resource "google_storage_bucket" "example_bucket" {
            name          = "example-bucket-1"
            location      = "EU"
            force_destroy = true
          
            project = "PROJECT_ID"
          
            uniform_bucket_level_access = false
          }
          

          Remplacez PROJECT_ID par l'ID du projet que vous avez créé.

        4. Dans Cloud Shell, créez le fichier de plan Terraform et convertissez-le au format JSON :

          terraform plan -out main.plan
          terraform show -json main.plan > mainplan.json
          
        5. Créez le rapport de validation IaC pour mainplan.json :

          gcloud scc iac-validation-reports create organizations/ORGANIZATION_ID/locations/global --tf-plan-file=mainplan.json
          

          Cette commande renvoie un rapport de validation IaC qui décrit les cas de non-respect suivants :

          • La valeur mtu pour example_network n'est pas égale à 1 000.
          • La valeur initial_node_count pour example_node_pool n'est pas égale à 3.
          • L'accès uniforme au niveau du bucket n'est pas activé pour example_bucket.
          • La journalisation n'est pas activée pour example_bucket.

        Résoudre les cas de violation

        1. Dans Cloud Shell, lancez l'éditeur Cloud Shell.

        2. Modifiez le fichier main.tf en apportant les modifications suivantes :

          terraform {
            required_providers {
              google = {
                source  = "hashicorp/google"
              }
            }
          }
          
          provider "google" {
            region  = "us-central1"
            zone    = "us-central1-c"
          }
          
          resource "google_compute_network" "example_network"{
            name                            = "example-network-1"
            delete_default_routes_on_create = false
            auto_create_subnetworks         = false
            routing_mode                    = "REGIONAL"
            mtu                             = 1000
            project                         = "PROJECT_ID"
          }
          
          resource "google_container_node_pool" "example_node_pool" {
            name               = "example-node-pool-1"
            cluster            = "example-cluster-1"
            project            = "PROJECT_ID"
            initial_node_count = 3
          
            node_config {
              preemptible  = true
              machine_type = "e2-medium"
            }
          }
          
          resource "google_storage_bucket" "example_bucket" {
            name          = "example-bucket-1"
            location      = "EU"
            force_destroy = true
          
            project = "PROJECT_ID"
            uniform_bucket_level_access = true
          
            logging {
              log_bucket   = "my-unique-logging-bucket" // Create a separate bucket for logs
              log_object_prefix = "tf-logs/"             // Optional prefix for better structure
            }
          }
          

          Remplacez PROJECT_ID par l'ID du projet que vous avez créé.

        3. Dans Cloud Shell, créez le fichier de plan Terraform et convertissez-le au format JSON :

          terraform plan -out main.plan
          terraform show -json main.plan > mainplan.json
          
        4. Recréez le rapport de validation IaC pour mainplan.json :

          gcloud scc iac-validation-reports create organizations/ORGANIZATION_ID/locations/global --tf-plan-file=mainplan.json
          

      Effectuer un nettoyage

      Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

      Supprimer le projet

      1. In the Google Cloud console, go to the Manage resources page.

        Go to Manage resources

      2. In the project list, select the project that you want to delete, and then click Delete.
      3. In the dialog, type the project ID, and then click Shut down to delete the project.

      Étapes suivantes