gcloud beta terraform vet quickstart

Este início rápido mostra como aplicar uma restrição que impõe uma restrição de domínio. Vai testar essa restrição e gerar intencionalmente um erro. Em seguida, modifica a restrição para que o seu domínio seja aprovado.

Antes de começar

  • Precisa de um Google Cloud projeto.
  • Precisa das seguintes autorizações de gestão de identidade e de acesso (IAM) para esse projeto:

    • resourcemanager.projects.getIamPolicy – Esta autorização pode ser concedida com a função de revisor de segurança para a organização.
    • resourcemanager.projects.get: esta autorização pode ser concedida com a função de leitor de projetos para a organização.

Para começar rapidamente, estas instruções usam um Cloud Shell pré-instalado com o Terraform e com um repositório da biblioteca de políticas clonado. As instruções pressupõem que já tem uma conta do Google Cloud .

Início rápido

  1. Aceda ao Cloud Shell e clone a biblioteca de políticas.

    Clone a biblioteca de políticas

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

    cp samples/iam_service_accounts_only.yaml policies/constraints
    
  3. Examine a restrição que copiou imprimindo-a no terminal.

    cat policies/constraints/iam_service_accounts_only.yaml
    

    O resultado tem o seguinte aspeto:

    # 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
    

    Repare em gserviceaccount.com na parte inferior. Isto especifica que apenas os membros do domínio gserviceaccount.com podem estar presentes numa política do IAM.

  4. Para verificar se a política funciona como esperado, crie o seguinte ficheiro Terraform main.tf no diretório atual. 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 o seguinte:

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

    terraform init
    
  6. Exporte o plano do Terraform. Se lhe for pedido, clique em Autorizar quando lhe for solicitado:

    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. Introduza o seguinte comando para validar se o seu plano do Terraform está em conformidade com as suas políticas:

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

    Uma vez que o endereço de email que indicou na associação da política de IAM não pertence a uma conta de serviço, o plano viola a restrição que configurou.

    [
    {
      "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 (o seu email), edite policy-library/policies/constraints/iam_service_accounts_only.yaml e anexe o domínio do seu email à lista de autorizações de domínios. No exemplo seguinte, adicionámos example.com, mas introduziria o domínio do seu próprio endereço de email:

    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 novamente o seu plano do Terraform e não devem ser encontradas violações:

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

    Resultado esperado:

    []

Resolução de problemas

Se 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 não tem as autorizações necessárias no projeto que especificou.

Depois de editar o nome do projeto e/ou as autorizações (resourcemanager.projects.getIamPolicy e resourcemanager.projects.get), volte atrás, exporte novamente o plano do Terraform e, em seguida, converta o plano do Terraform em JSON.