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
Aceda ao Cloud Shell e clone a biblioteca de políticas.
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
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íniogserviceaccount.com
podem estar presentes numa política do IAM.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 criarpolicy-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
.
Inicialize o Terraform e gere um plano do Terraform com o seguinte:
terraform init
Exporte o plano do Terraform. Se lhe for pedido, clique em Autorizar quando lhe for solicitado:
terraform plan -out=test.tfplan
Converta o plano do Terraform em JSON:
terraform show -json ./test.tfplan > ./tfplan.json
Instale o componente terraform-tools:
sudo apt-get install google-cloud-sdk-terraform-tools
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" } ]
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ámosexample.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
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.