En esta guía de inicio rápido, se muestra cómo aplicar una restricción que aplique una restricción de dominio. Probarás esa restricción y arrojarás un error de forma intencional. Luego, modificarás la restricción para que tu dominio pase.
Antes de comenzar
- Necesitas un Google Cloud proyecto.
Necesitas los siguientes permisos de administración de identidades y accesos (IAM) para ese proyecto:
resourcemanager.projects.getIamPolicy: Este permiso se puede otorgar con el rol Security Reviewer en la organización.resourcemanager.projects.get: Este permiso se puede otorgar con la función de visualizador de proyectos en la organización.
Para comenzar con rapidez, en estas instrucciones se usa un Cloud Shell preinstalado con Terraform y un repositorio de bibliotecas de políticas clonadas. En las instrucciones, se supone que ya tienes una cuenta de Google Cloud .
Guía de inicio rápido
Ve a Cloud Shell y clona la biblioteca de políticas.
Copia la restricción de dominio de IAM de muestra en el directorio
policies/constraints.cp samples/iam_service_accounts_only.yaml policies/constraintsPara examinar la restricción que copiaste, puedes imprimirla en la terminal.
cat policies/constraints/iam_service_accounts_only.yamlEl resultado se verá así:
# 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.comObserva
gserviceaccount.comen la parte inferior. Esto especifica que solo los miembros del dominiogserviceaccount.compueden estar presentes en una política de IAM.Para verificar que la política funcione como se espera, crea el siguiente archivo
main.tfde Terraform en el directorio actual. Puedes usar nano, vim o el editor de Cloud Shell para crearpolicy-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" ] }Reemplaza lo siguiente:
PROJECT_ID: el ID de tu proyectoEMAIL_ADDRESS: una dirección de correo electrónico de muestra Puede ser cualquier dirección de correo electrónico válida. Por ejemplo,user@example.com
Inicializa Terraform y genera un plan de Terraform con lo siguiente:
terraform initExporta el plan de Terraform, si se te solicita, haz clic en Autorizar cuando se te solicite:
terraform plan -out=test.tfplanConvierte el plan de Terraform a JSON:
terraform show -json ./test.tfplan > ./tfplan.jsonInstala el componente terraform-tools:
sudo apt-get install google-cloud-sdk-terraform-toolsIngrese el siguiente comando para validar que su plan de Terraform cumpla con sus políticas:
gcloud beta terraform vet tfplan.json --policy-library=. --format=jsonDebido a que la dirección de correo electrónico que proporcionaste en la vinculación de la política de IAM no pertenece a una cuenta de servicio, el plan infringe la restricción que configuraste.
[ { "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 otro dominio (tu correo electrónico), edita
policy-library/policies/constraints/iam_service_accounts_only.yamly agrega tu dominio de correo electrónico a la lista de dominios permitidos. En el siguiente ejemplo, agregamosexample.com, pero deberías ingresar el dominio para tu propia dirección de correo electrónico:apiVersion: constraints.gatekeeper.sh/v1alpha1 kind: GCPIAMAllowedPolicyMemberDomainsConstraintV1 metadata: name: service_accounts_only spec: severity: high match: target: ["organizations/**"] parameters: domains: - gserviceaccount.com - example.comAhora, vuelva a validar su plan de Terraform. Esto no debería generar incumplimientos:
gcloud beta terraform vet tfplan.json --policy-library=. --format=jsonResultado esperado:
[]
Soluciona problemas
Si recibes el siguiente error, "Error 403: The caller does not have permission, forbidden", entonces no reemplazaste PROJECT_ID en policy-library/main.tf con el nombre de tu proyecto o no tienes los permisos necesarios en el proyecto que especificaste.
Después de editar el nombre o los permisos del proyecto (resourcemanager.projects.getIamPolicy y resourcemanager.projects.get), regresa y exporta el plan de Terraform otra vez y, luego, convierte el plan de Terraform a JSON.