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

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.