En esta guía de inicio rápido se muestra cómo aplicar una restricción que imponga una restricción de dominio. Probarás esa restricción y provocarás un error intencionadamente. Después, modificará la restricción para que su dominio cumpla los requisitos.
Antes de empezar
- Necesitas un Google Cloud proyecto.
Necesitas los siguientes permisos de gestión de identidades y accesos (IAM) para ese proyecto:
resourcemanager.projects.getIamPolicy
: este permiso se puede conceder con el rol de revisor de seguridad de la organización.resourcemanager.projects.get
: este permiso se puede conceder con el rol Lector de proyectos de la organización.
Para que puedas empezar rápidamente, estas instrucciones usan un Cloud Shell que tiene Terraform preinstalado y un repositorio de Policy Library clonado. En estas instrucciones se presupone 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 gestión de identidades y accesos de ejemplo en el directorio
policies/constraints
.cp samples/iam_service_accounts_only.yaml policies/constraints
Examina la restricción que has copiado imprimiéndola en la terminal.
cat policies/constraints/iam_service_accounts_only.yaml
La salida tiene este aspecto:
# 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
Fíjate en
gserviceaccount.com
en la parte inferior. Esto especifica que solo los miembros del dominiogserviceaccount.com
pueden estar presentes en una política de gestión de identidades y accesos.Para verificar que la política funciona como se espera, cree el siguiente archivo Terraform
main.tf
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" ] }
Haz los cambios siguientes:
PROJECT_ID
: tu ID de proyecto.EMAIL_ADDRESS
: una dirección de correo de ejemplo. Puede ser cualquier dirección de correo 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 pide, haz clic en Autorizar:
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
Introduce el siguiente comando para validar que tu plan de Terraform cumple tus políticas:
gcloud beta terraform vet tfplan.json --policy-library=. --format=json
Como la dirección de correo que has proporcionado en el enlace de la política de gestión de identidades y accesos no pertenece a una cuenta de servicio, el plan infringe la restricción que has configurado.
[ { "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 añade tu dominio de correo a la lista de permitidos de dominios. En el siguiente ejemplo, hemos añadidoexample.com
, pero tú deberías introducir el dominio de tu dirección de correo: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, vuelve a validar tu plan de Terraform. No debería haber ninguna infracción:
gcloud beta terraform vet tfplan.json --policy-library=. --format=json
Resultado esperado:
[]
Solución de problemas
Si recibes el siguiente error, "Error 403: The caller does not have permission, forbidden"
, significa que no has sustituido PROJECT_ID
en policy-library/main.tf
por el nombre de tu proyecto o que no tienes los permisos necesarios en el proyecto que has especificado.
Después de editar el nombre del proyecto o los permisos (resourcemanager.projects.getIamPolicy
y resourcemanager.projects.get
), vuelve y exporta el plan de Terraform de nuevo. A continuación, convierte el plan de Terraform a JSON.