Valide as políticas

Antes de começar

Instale a app Google Cloud CLI

Para usar o gcloud beta terraform vet, tem de instalar primeiro a Google Cloud CLI:

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

  2. Execute os seguintes comandos para instalar o componente terraform-tools:

    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
    

Obtenha as autorizações necessárias

A Google Cloud conta que usa para a validação tem de ter as seguintes autorizações:

  • getIamPolicy: gcloud beta terraform vet tem de obter políticas de gestão de identidade e de acesso (IAM) completas e juntá-las com membros e associações para obter um estado final preciso para validação.
  • resourcemanager.projects.get: gcloud beta terraform vet tem de obter a hierarquia do projeto a partir da API para construir com precisão um nome de recurso do CAI completo para todos os projetos aos quais os recursos validados estão relacionados.
  • resourcemanager.folders.get: gcloud beta terraform vet tem de obter a hierarquia de pastas da API para construir com precisão um nome de recurso CAI completo se os recursos validados contiverem recursos relacionados com pastas.

Configure uma biblioteca de políticas

Tem de criar uma biblioteca de políticas para usar esta ferramenta.

Valide as políticas

1. Gere um plano do Terraform

gcloud beta terraform vet é compatível com o Terraform 0.12 ou superior. gcloud beta terraform vet usa terraform plan JSON como entrada. Pode gerar o ficheiro JSON executando os seguintes comandos no seu diretório do Terraform:

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

2. Execução gcloud beta terraform vet

gcloud beta terraform vet permite-lhe validar o seu JSON 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 executa este comando, o gcloud beta terraform vet obtém dados do projeto através de APIs Google Cloud necessárias para uma validação precisa do seu plano.

Bandeiras

  • --policy-library=POLICY_LIBRARY_DIR: diretório que contém uma biblioteca de políticas.
  • --project=PROJECT_IDgcloud beta terraform vet aceita um sinalizador --project opcional. Esta flag especifica o projeto predefinido ao criar a hierarquia (a partir da hierarquia de recursos Google Cloud ) para qualquer recurso que não tenha um projeto explícito definido.
  • --format=FORMAT: a predefinição é yaml. Os formatos suportados são: default, json, none, text e yaml. Para ver mais detalhes, execute $ gcloud topic formats.

Código de saída e resultado

  • Se todas as restrições forem validadas, o comando devolve o código de saída 0 e não apresenta violações.
  • Se forem encontradas violações, o comando gcloud beta terraform vet devolve o código de saída 2 e apresenta uma lista de violações. Por exemplo, o resultado JSON pode ter o seguinte aspeto:
[
  {
    "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 o gcloud beta terraform vet num pipeline de CI/CD pode ter o seguinte aspeto:

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 programadores também podem usar o gcloud beta terraform vetlocalmente para testar as alterações do Terraform antes de executar o pipeline de CI/CD.