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 proyecto de Google Cloud.
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 suponemos 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/constraints
Para examinar la restricción que copiaste, puedes imprimirla en la terminal.
cat policies/constraints/iam_service_accounts_only.yaml
El 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.com
Observa
gserviceaccount.com
en la parte inferior. Esto especifica que solo los miembros del dominiogserviceaccount.com
pueden estar presentes en una política de IAM.Para verificar que la política funcione como se espera, crea el siguiente archivo
main.tf
de 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 init
Exporta el plan de Terraform, si se te solicita, haz clic en Autorizar cuando se te solicite:
terraform plan -out=test.tfplan
Convierte el plan de Terraform a JSON:
terraform show -json ./test.tfplan > ./tfplan.json
Instala el componente terraform-tools:
sudo apt-get install google-cloud-sdk-terraform-tools
Ingrese el siguiente comando para validar que su plan de Terraform cumpla con sus políticas:
gcloud beta terraform vet tfplan.json --policy-library=. --format=json
Debido 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.yaml
y 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.com
Ahora, vuelva a validar su plan de Terraform. Esto no debería generar incumplimientos:
gcloud beta terraform vet tfplan.json --policy-library=. --format=json
Resultado 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.