Guia de início rápido do comando gcloud beta terraform vet

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Neste guia de início rápido, mostramos como aplicar uma restrição que impõe uma restrição de domínio. Você vai testar essa restrição e gerar um erro intencionalmente. Em seguida, vai modificar a restrição para que seu domínio seja aprovado.

Antes de começar

  • Você precisa de um projeto do Google Cloud.
  • Você precisa ter as seguintes permissões do Identity and Access Management (IAM) para esse projeto:

    • resourcemanager.projects.getIamPolicy: essa permissão pode ser concedida com o papel de Revisor de segurança da organização.
    • resourcemanager.projects.get: esta permissão pode ser concedida com o papel de Visualizador do projeto da organização.

Para começar rapidamente, estas instruções usam um Cloud Shell pré-instalado com o Terraform e um repositório clonado da Biblioteca de políticas. Para seguir as instruções, é necessário ter uma conta do Google Cloud.

Guia de início rápido

  1. Acesse o Cloud Shell e clone a biblioteca de políticas.

    Clonar biblioteca de políticas

  2. Copie a restrição de amostra de restrição de domínio do IAM para o diretório policies/constraints.

    cp samples/iam_service_accounts_only.yaml policies/constraints
    
  3. Examine a restrição copiada inserindo-a no terminal.

    cat policies/constraints/iam_service_accounts_only.yaml
    

    A saída é assim:

    # This constraint checks that all IAM policy members are in the
    # "gserviceaccount.com" domain.
    apiVersion: constraints.gatekeeper.sh/v1alpha1
    kind: GCPIAMAllowedPolicyMemberDomainsConstraintV2
    metadata:
      name: service_accounts_only
      annotations:
        description: Checks that members that have been granted IAM roles belong to allowlisted
          domains.
    spec:
      severity: high
      match:
        target: # {"$ref":"#/definitions/io.k8s.cli.setters.target"}
        - "organizations/**"
      parameters:
        domains:
        - gserviceaccount.com
    

    Observe o ícone gserviceaccount.com na parte inferior. Ela especifica que apenas membros do domínio gserviceaccount.com podem estar presentes em uma política do IAM.

  4. Para verificar se a política funciona conforme o esperado, crie o seguinte arquivo main.tf do Terraform no diretório atual. Você pode usar o nano, o vim ou o editor do Cloud Shell para criar policy-library/main.tf.

    terraform {
      required_providers {
        google = {
          source = "hashicorp/google"
          version = "~> 3.84"
        }
      }
    }
    
    resource "google_project_iam_binding" "sample_iam_binding" {
      project = "PROJECT_ID"
      role    = "roles/viewer"
    
      members = [
        "user:EMAIL_ADDRESS"
      ]
    }
    

    Substitua:

    • PROJECT_ID: o ID do projeto.
    • EMAIL_ADDRESS: um endereço de e-mail de amostra. Pode ser qualquer endereço de e-mail válido. Por exemplo, user@example.com.
  5. Inicialize o Terraform e gere um plano usando:

    terraform init
    
  6. Exporte o plano do Terraform, se solicitado, e clique em Autorizar:

    terraform plan -out=test.tfplan
    
  7. Converta o plano do Terraform em JSON:

    terraform show -json ./test.tfplan > ./tfplan.json
    
  8. Instale o componente terraform-tools:

    sudo apt-get install google-cloud-sdk-terraform-tools
    
  9. Digite o comando a seguir para verificar se o plano do Terraform está em conformidade com as suas políticas:

    gcloud beta terraform vet tfplan.json --policy-library=. --format=json
    

    Como o endereço de e-mail fornecido na vinculação da política do IAM não pertence a uma conta de serviço, o plano viola a restrição configurada.

    [
    {
      "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:user@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:user@example.com",
          "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID"
        }
      },
      "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID",
      "severity": "high"
    }
    ]
    
  10. Para permitir outro domínio (seu e-mail), edite policy-library/policies/constraints/iam_service_accounts_only.yaml e anexe seu domínio de e-mail à lista de permissões de domínios. No exemplo a seguir, adicionamos example.com, mas você deve inserir o domínio do seu próprio endereço de e-mail:

    apiVersion: constraints.gatekeeper.sh/v1alpha1
    kind: GCPIAMAllowedPolicyMemberDomainsConstraintV1
    metadata:
      name: service_accounts_only
    spec:
      severity: high
      match:
        target: ["organizations/**"]
      parameters:
        domains:
          - gserviceaccount.com
          - example.com
    
  11. Agora valide seu plano do Terraform novamente e ele não deve encontrar violações:

    gcloud beta terraform vet tfplan.json --policy-library=. --format=json
    

    Saída esperada:

    []
    

Solução de problemas

Se você receber o seguinte erro, "Error 403: The caller does not have permission, forbidden", significa que não substituiu PROJECT_ID em policy-library/main.tf pelo nome do seu projeto ou que não tem as permissões necessárias no projeto especificado.

Depois de editar o nome e/ou as permissões do projeto (resourcemanager.projects.getIamPolicy e resourcemanager.projects.get), volte e exporte o plano do Terraform novamente. Em seguida, converta-o em JSON.