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:
Instale a CLI do Google Cloud, mas ignore o comando
gcloud init
.Execute os seguintes comandos para instalar o componente terraform-tools:
gcloud components update gcloud components install terraform-tools
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_ID
–gcloud 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
eyaml
. 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 vet
localmente para testar as alterações do Terraform
antes de executar o pipeline de CI/CD.