Auditoría de Permisos IAM en GCP
Cuándo Usarlo
- Al realizar evaluaciones de seguridad de configuraciones IAM de organizaciones o proyectos de GCP
- Al identificar cuentas de servicio con permisos excesivos o acceso no utilizado
- Cuando los requisitos de cumplimiento exigen revisión de controles de acceso y asignaciones de roles
- Al investigar posibles movimientos laterales a través de configuraciones IAM incorrectas
- Al reducir el radio de explosión de credenciales comprometidas limitando permisos
No usar para auditoría de reglas de firewall de VPC (usar herramientas de seguridad de red), para auditoría de RBAC de GKE (usar herramientas específicas de RBAC de Kubernetes) o para detección de amenazas en tiempo real sobre acciones IAM (usar SCC Event Threat Detection).
Prerrequisitos
- Organización o proyecto de GCP con
roles/iam.securityRevieweryroles/cloudAsset.viewer - gcloud CLI autenticado con permisos apropiados
- Cloud Asset API habilitada (
gcloud services enable cloudasset.googleapis.com) - IAM Recommender API habilitada (
gcloud services enable recommender.googleapis.com) - Policy Analyzer API habilitada (
gcloud services enable policyanalyzer.googleapis.com)
Flujo de Trabajo
Paso 1: Enumerar Enlaces IAM en Toda la Organización
Listar todos los enlaces IAM a nivel de organización, carpeta y proyecto para comprender el panorama completo de acceso.
# Enlaces IAM a nivel de organización
gcloud organizations get-iam-policy ID_ORG \
--format=json > org-iam-policy.json
# Buscar todas las políticas IAM en toda la organización
gcloud asset search-all-iam-policies \
--scope=organizations/ID_ORG \
--format="table(resource, policy.bindings.role, policy.bindings.members)" \
--limit=500
# Encontrar todos los usuarios y cuentas de servicio con rol Owner
gcloud asset search-all-iam-policies \
--scope=organizations/ID_ORG \
--query="policy:roles/owner" \
--format="table(resource, policy.bindings.members)"
# Encontrar todos los enlaces que usan roles primitivos (Owner, Editor, Viewer)
gcloud asset search-all-iam-policies \
--scope=organizations/ID_ORG \
--query="policy:roles/owner OR policy:roles/editor" \
--format=json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for result in data:
resource = result.get('resource', '')
for binding in result.get('policy', {}).get('bindings', []):
role = binding.get('role', '')
if role in ['roles/owner', 'roles/editor']:
for member in binding.get('members', []):
print(f'{resource} | {role} | {member}')
"
Paso 2: Auditar Cuentas de Servicio y Sus Claves
Identificar cuentas de servicio con permisos excesivos, claves gestionadas por el usuario y cuentas no utilizadas.
# Listar todas las cuentas de servicio en un proyecto
gcloud iam service-accounts list \
--project=ID_PROYECTO \
--format="table(email, displayName, disabled)"
# Verificar claves gestionadas por el usuario (deben minimizarse)
for sa in $(gcloud iam service-accounts list --project=ID_PROYECTO --format="value(email)"); do
keys=$(gcloud iam service-accounts keys list \
--iam-account="$sa" \
--managed-by=user \
--format="table(name.basename(),validAfterTime,validBeforeTime)")
if [ -n "$keys" ]; then
echo "=== $sa ==="
echo "$keys"
fi
done
# Encontrar cuentas de servicio con roles de administrador en todos los proyectos
gcloud asset search-all-iam-policies \
--scope=organizations/ID_ORG \
--query="policy.bindings.members:serviceAccount AND (policy:roles/owner OR policy:roles/editor OR policy:admin)" \
--format="table(resource, policy.bindings.role, policy.bindings.members)"
# Verificar políticas IAM de cuentas de servicio (quiénes pueden suplantar)
for sa in $(gcloud iam service-accounts list --project=ID_PROYECTO --format="value(email)"); do
echo "=== $sa ==="
gcloud iam service-accounts get-iam-policy "$sa" --format=json 2>/dev/null
done
Paso 3: Usar el Recomendador de IAM para Identificar Permisos Excesivos
Aprovechar el Recomendador de IAM de GCP para encontrar roles que otorgan más acceso del realmente utilizado.
# Listar recomendaciones de roles IAM para un proyecto
gcloud recommender recommendations list \
--project=ID_PROYECTO \
--recommender=google.iam.policy.Recommender \
--location=global \
--format="table(name, description, priority, stateInfo.state)"
# Obtener recomendación detallada
gcloud recommender recommendations describe ID_RECOMENDACION \
--project=ID_PROYECTO \
--recommender=google.iam.policy.Recommender \
--location=global \
--format=json
# Listar información sobre uso de IAM
gcloud recommender insights list \
--project=ID_PROYECTO \
--insight-type=google.iam.policy.Insight \
--location=global \
--format="table(name, description, severity, category)"
# Aplicar una recomendación (después de revisarla)
gcloud recommender recommendations mark-claimed ID_RECOMENDACION \
--project=ID_PROYECTO \
--recommender=google.iam.policy.Recommender \
--location=global \
--etag=ETAG
Paso 4: Analizar Permisos Efectivos con el Analizador de Políticas
Usar el Analizador de Políticas para determinar el acceso efectivo para entidades o recursos específicos.
# Verificar quién tiene acceso a un recurso específico
gcloud asset analyze-iam-policy \
--organization=ID_ORG \
--full-resource-name="//storage.googleapis.com/projects/_/buckets/sensitive-data-bucket" \
--format="table(identityList.identities, accessControlLists.accesses.role)"
# Verificar a qué recursos puede acceder un usuario específico
gcloud asset analyze-iam-policy \
--organization=ID_ORG \
--identity="user:[email protected]" \
--format="table(accessControlLists.resources.fullResourceName, accessControlLists.accesses.role)"
# Verificar quién puede realizar una acción específica
gcloud asset analyze-iam-policy \
--organization=ID_ORG \
--full-resource-name="//cloudresourcemanager.googleapis.com/projects/ID_PROYECTO" \
--permissions="iam.serviceAccounts.actAs,iam.serviceAccountKeys.create" \
--format="table(identityList.identities, accessControlLists.accesses.permission)"
# Encontrar todas las entidades con acceso allUsers o allAuthenticatedUsers
gcloud asset search-all-iam-policies \
--scope=organizations/ID_ORG \
--query="policy:allUsers OR policy:allAuthenticatedUsers" \
--format="table(resource, policy.bindings.role, policy.bindings.members)"
Paso 5: Verificar Delegación en Todo el Dominio y Riesgos de Suplantación
Identificar cuentas de servicio con delegación en todo el dominio y capacidades de suplantación.
# Verificar cuentas de servicio con delegación en todo el dominio
# (Requiere acceso a Admin SDK para listar cuentas delegadas)
gcloud iam service-accounts list --project=ID_PROYECTO --format=json | python3 -c "
import json, sys
accounts = json.load(sys.stdin)
for sa in accounts:
email = sa.get('email', '')
# Verificar si la SA tiene habilitada la delegación en todo el dominio
# Esto requiere acceso a la API de Admin SDK
print(f'SA: {email} - Verificar admin.google.com para estado de delegación')
"
# Encontrar cuentas de servicio que otras identidades pueden suplantar
for sa in $(gcloud iam service-accounts list --project=ID_PROYECTO --format="value(email)"); do
policy=$(gcloud iam service-accounts get-iam-policy "$sa" --format=json 2>/dev/null)
if echo "$policy" | python3 -c "
import json, sys
p = json.load(sys.stdin)
for b in p.get('bindings', []):
if b['role'] in ['roles/iam.serviceAccountTokenCreator', 'roles/iam.serviceAccountUser']:
print(f' {b[\"role\"]}: {b[\"members\"]}')
" 2>/dev/null; then
echo "=== Riesgo de suplantación: $sa ==="
fi
done
Paso 6: Generar Informe de Auditoría y Aplicar Correcciones
Compilar hallazgos e implementar reducciones de permisos recomendadas.
# Eliminar rol primitivo y reemplazar con rol predefinido
gcloud projects remove-iam-policy-binding ID_PROYECTO \
--member="user:[email protected]" \
--role="roles/editor"
gcloud projects add-iam-policy-binding ID_PROYECTO \
--member="user:[email protected]" \
--role="roles/compute.viewer"
gcloud projects add-iam-policy-binding ID_PROYECTO \
--member="user:[email protected]" \
--role="roles/storage.objectViewer"
# Eliminar claves de cuenta de servicio no utilizadas
gcloud iam service-accounts keys delete ID_CLAVE \
--iam-account=CORREO_SA
# Deshabilitar cuentas de servicio no utilizadas
gcloud iam service-accounts disable CORREO_SA --project=ID_PROYECTO
Conceptos Clave
| Término | Definición |
|---|---|
| Rol Primitivo | Roles heredados de GCP (Owner, Editor, Viewer) que otorgan permisos amplios en todos los servicios, no recomendados para producción |
| Rol Predefinido | Rol gestionado por GCP limitado a servicios y acciones específicas, que proporciona un acceso más granular que los roles primitivos |
| Recomendador de IAM | Servicio de GCP basado en ML que analiza el uso real de permisos y sugiere reducciones de roles para lograr el mínimo privilegio |
| Analizador de Políticas | Herramienta para analizar el acceso IAM efectivo en la jerarquía de la organización, respondiendo consultas de quién-puede-acceder-a-qué |
| Clave de Cuenta de Servicio | Credencial gestionada por el usuario para autenticación de cuentas de servicio, un riesgo de seguridad ya que las claves pueden exportarse y no expiran automáticamente |
| Delegación en Todo el Dominio | Otorga a una cuenta de servicio la capacidad de suplantar a cualquier usuario en el dominio de Google Workspace, un riesgo significativo de escalada de privilegios |
Herramientas y Sistemas
- gcloud CLI: Herramienta principal para consultar y gestionar políticas IAM, cuentas de servicio y enlaces de roles de GCP
- Recomendador de IAM: Motor de recomendaciones basado en ML para reducir permisos excesivos según el uso real
- Analizador de Políticas: Herramienta de análisis de acceso efectivo a nivel de organización para comprender quién puede acceder a qué
- Cloud Asset Inventory: Búsqueda entre proyectos de políticas IAM y metadatos de recursos
- ScoutSuite: Herramienta de auditoría multinube con comprobaciones específicas de IAM de GCP para asignaciones de roles y cuentas de servicio
Escenarios Comunes
Escenario: Reducir el Uso de Roles Primitivos en Toda una Organización de GCP
Contexto: Una auditoría revela que el 60% de los enlaces IAM en toda la organización usan roles primitivos (Owner/Editor). El equipo de seguridad necesita migrar a roles predefinidos sin interrumpir los flujos de trabajo de los desarrolladores.
Enfoque:
- Ejecutar
gcloud asset search-all-iam-policiespara inventariar todos los enlaces de roles primitivos - Usar el Recomendador de IAM para obtener sugerencias basadas en ML de roles predefinidos de reemplazo
- Para cada enlace, usar el Analizador de Políticas para entender a qué accede realmente la entidad
- Crear un documento de mapeo: rol primitivo -> roles predefinidos específicos necesarios
- Aplicar roles predefinidos junto con roles primitivos durante un período de prueba
- Monitorear errores de acceso denegado usando Cloud Audit Logs
- Eliminar roles primitivos después de confirmar que no hay problemas de acceso durante 2 semanas
Errores comunes: Los roles primitivos incluyen permisos en todos los servicios de GCP, por lo que reemplazarlos requiere múltiples roles predefinidos. El Recomendador puede sugerir roles demasiado restrictivos si el período de observación no captura todos los casos de uso. Los roles personalizados pueden cubrir vacíos donde ningún rol predefinido coincide con el conjunto exacto de permisos necesario.
Formato de Salida
Informe de Auditoría de Permisos IAM de GCP
==============================================
Organización: acme-org (ID_ORG: 123456789)
Proyectos Auditados: 25
Fecha de Auditoría: 2026-02-23
RESUMEN DE ENLACES IAM:
Enlaces totales: 342
Usando roles primitivos: 205 (60%)
Usando roles predefinidos: 112 (33%)
Usando roles personalizados: 25 (7%)
HALLAZGOS CRÍTICOS:
[IAM-001] Cuenta de Servicio con Rol Owner
SA: [email protected]
Rol: roles/owner en proyecto prod-project
Claves Gestionadas por Usuario: 3 (más antigua: 14 meses)
Corrección: Reemplazar con roles predefinidos específicos, eliminar claves antiguas
[IAM-002] Enlace allAuthenticatedUsers
Recurso: gs://public-data-bucket
Rol: roles/storage.objectViewer
Riesgo: Cualquier titular de cuenta de Google puede leer el contenido del bucket
Corrección: Restringir a grupos de usuarios o cuentas de servicio específicos
SALUD DE CUENTAS DE SERVICIO:
Total de cuentas de servicio: 67
Con claves gestionadas por usuario: 23
Claves con más de 90 días: 18
Cuentas no utilizadas (90+ días): 12
Con delegación en todo el dominio: 2
SUGERENCIAS DEL RECOMENDADOR:
Recomendaciones totales: 45
Prioridad ALTA: 12
Permisos estimados reducidos: 2847 permisos individuales