Antes de começar
Instalar Google Cloud CLI
Para usar o gcloud beta terraform vet, primeiro você precisa instalar a CLI do Google Cloud:
Instale a CLI do Google Cloud, mas ignore o comando
gcloud init.Execute os seguintes comandos para instalar o componente de ferramentas de terraform:
gcloud components update gcloud components install terraform-toolsVerifique se a CLI gcloud está instalada executando o seguinte comando:
gcloud beta terraform vet --help
Conseguir as permissões necessárias
A conta Google Cloud usada para a validação precisa ter as seguintes permissões:
getIamPolicy:gcloud beta terraform vetprecisa 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: ogcloud beta terraform vetprecisa 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 vetprecisa 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. 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 vetaceita uma sinalização--projectopcional. Essa flag 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 vetretornará 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.