Validar políticas

Antes de começar

Instalar Google Cloud CLI

Para usar o gcloud beta terraform vet, primeiro você precisa instalar a CLI do Google Cloud:

  1. Instale a CLI do Google Cloud, mas ignore o comando gcloud init.

  2. Execute os seguintes comandos para instalar o componente de ferramentas de terraform:

    gcloud components update
    gcloud components install terraform-tools
    
  3. Verifique se a CLI gcloud está instalada executando o seguinte comando:

    gcloud beta terraform vet --help
    

Conseguir as permissões necessárias

A conta do Google Cloud usada para a validação precisa ter as seguintes permissões:

  • getIamPolicy: gcloud beta terraform vet precisa ter políticas completas de gerenciamento de identidade e acesso (IAM) e mesclá-las com membros e vinculações para ter um estado final preciso para validar.
  • resourcemanager.projects.get: o gcloud beta terraform vet precisa ter a ancestralidade do projeto da API para criar um nome completo de recurso do CAI com precisão para todos os projetos aos quais os recursos validados estejam relacionados.
  • resourcemanager.folders.get: gcloud beta terraform vet precisa ter a ancestralidade da pasta da API para criar um nome de recurso do CAI completo com precisão se os recursos validados tiverem recursos relacionados à pasta.

Configurar uma biblioteca de políticas

Crie uma biblioteca de políticas para usar essa ferramenta.

Validar políticas

1. Gerar um plano do Terraform

gcloud beta terraform vet é compatível com o Terraform 0.12+. gcloud beta terraform vet usa o JSON terraform plan como entrada. Para gerar o arquivo JSON, execute os seguintes comandos no seu diretório do Terraform:

terraform plan -out=tfplan.tfplan
terraform show -json ./tfplan.tfplan > ./tfplan.json

2. Executar gcloud beta terraform vet

O gcloud beta terraform vet permite validar o JSON do terraform plan em relação ao POLICY_LIBRARY_REPO da sua organização. Por exemplo:

git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR
gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR

Quando você executa esse comando, o gcloud beta terraform vet recupera os dados do projeto usando as APIs do Google Cloud necessárias para uma validação precisa do seu plano.

Sinalizações

  • --policy-library=POLICY_LIBRARY_DIR: diretório que contém uma biblioteca de políticas.
  • --project=PROJECT_ID: gcloud beta terraform vet aceita uma sinalização --project opcional. Essa sinalização especifica o projeto padrão ao criar a ancestralidade (a partir da hierarquia de recursos do Google Cloud) para qualquer recurso que não tenha um projeto explícito definido.
  • --format=FORMAT: o padrão é yaml. Os formatos suportados são: default, json, none, text, yaml. Para mais detalhes, execute formatos de tópico do gcloud $.

Código de saída e saída

  • Se todas as restrições forem validadas, o comando retornará o código de saída 0 e não exibirá violações.
  • Se houver violações, o gcloud beta terraform vet retornará o código de saída 2 e exibirá uma lista de violações. Por exemplo, a saída JSON pode ser assim:
[
  {
    "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"
  }
]

Exemplo de CI/CD

Um script bash para usar gcloud beta terraform vet em um pipeline de CI/CD pode ter a seguinte aparência:

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

Os desenvolvedores também podem usar gcloud beta terraform vet localmente para testar as alterações do Terraform antes de executar o pipeline de CI/CD.