O que Auditoria de Permissões IAM do GCP faz?
Quando Usar
- Ao realizar avaliações de segurança de configurações IAM de organizações ou projetos GCP
- Ao identificar contas de serviço com permissões excessivas ou acesso não utilizado
- Quando requisitos de conformidade exigem revisão de controles de acesso e atribuições de papéis
- Ao investigar possíveis movimentações laterais através de configurações incorretas de IAM
- Ao reduzir o raio de explosão de credenciais comprometidas limitando permissões
Não use para auditoria de regras de firewall de VPC (use ferramentas de segurança de rede), para auditoria RBAC do GKE (use ferramentas RBAC específicas do Kubernetes) ou para detecção de ameaças em tempo real em ações do IAM (use SCC Event Threat Detection).
Pré-requisitos
- Organização ou projeto GCP com
roles/iam.securityReviewereroles/cloudAsset.viewer - gcloud CLI autenticada com permissões apropriadas
- Cloud Asset API ativada (
gcloud services enable cloudasset.googleapis.com) - IAM Recommender API ativada (
gcloud services enable recommender.googleapis.com) - Policy Analyzer API ativada (
gcloud services enable policyanalyzer.googleapis.com)
Fluxo de Trabalho
Passo 1: Enumeração de Bindings IAM na Organização
Listar todos os bindings IAM nos níveis de organização, pasta e projeto para entender o panorama completo de acesso.
# Bindings IAM no nível da organização
gcloud organizations get-iam-policy ORG_ID \
--format=json > org-iam-policy.json
# Buscar todas as políticas IAM na organização
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--format="table(resource, policy.bindings.role, policy.bindings.members)" \
--limit=500
# Encontrar todos os usuários e contas de serviço com papel Owner
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--query="policy:roles/owner" \
--format="table(resource, policy.bindings.members)"
# Encontrar todos os bindings usando papéis primitivos (Owner, Editor, Viewer)
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--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}')
"
Passo 2: Auditoria de Contas de Serviço e Suas Chaves
Identificar contas de serviço com permissões excessivas, chaves gerenciadas por usuários e contas não utilizadas.
# Listar todas as contas de serviço em um projeto
gcloud iam service-accounts list \
--project=PROJECT_ID \
--format="table(email, displayName, disabled)"
# Verificar chaves gerenciadas por usuário (devem ser minimizadas)
for sa in $(gcloud iam service-accounts list --project=PROJECT_ID --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 contas de serviço com papéis de administrador em todos os projetos
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--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 contas de serviço (quem pode personificar)
for sa in $(gcloud iam service-accounts list --project=PROJECT_ID --format="value(email)"); do
echo "=== $sa ==="
gcloud iam service-accounts get-iam-policy "$sa" --format=json 2>/dev/null
done
Passo 3: Usar o IAM Recommender para Identificar Permissões Excessivas
Aproveitar o IAM Recommender do GCP para encontrar papéis que concedem mais acesso do que realmente usado.
# Listar recomendações de papéis IAM para um projeto
gcloud recommender recommendations list \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--format="table(name, description, priority, stateInfo.state)"
# Obter recomendação detalhada
gcloud recommender recommendations describe RECOMMENDATION_ID \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--format=json
# Listar insights sobre uso de IAM
gcloud recommender insights list \
--project=PROJECT_ID \
--insight-type=google.iam.policy.Insight \
--location=global \
--format="table(name, description, severity, category)"
# Aplicar uma recomendação (após revisão)
gcloud recommender recommendations mark-claimed RECOMMENDATION_ID \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--etag=ETAG
Passo 4: Analisar Permissões Efetivas com o Policy Analyzer
Usar o Policy Analyzer para determinar o acesso efetivo para entidades ou recursos específicos.
# Verificar quem tem acesso a um recurso específico
gcloud asset analyze-iam-policy \
--organization=ORG_ID \
--full-resource-name="//storage.googleapis.com/projects/_/buckets/sensitive-data-bucket" \
--format="table(identityList.identities, accessControlLists.accesses.role)"
# Verificar quais recursos um usuário específico pode acessar
gcloud asset analyze-iam-policy \
--organization=ORG_ID \
--identity="user:[email protected]" \
--format="table(accessControlLists.resources.fullResourceName, accessControlLists.accesses.role)"
# Verificar quem pode realizar uma ação específica
gcloud asset analyze-iam-policy \
--organization=ORG_ID \
--full-resource-name="//cloudresourcemanager.googleapis.com/projects/PROJECT_ID" \
--permissions="iam.serviceAccounts.actAs,iam.serviceAccountKeys.create" \
--format="table(identityList.identities, accessControlLists.accesses.permission)"
# Encontrar todas as entidades com acesso allUsers ou allAuthenticatedUsers
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--query="policy:allUsers OR policy:allAuthenticatedUsers" \
--format="table(resource, policy.bindings.role, policy.bindings.members)"
Passo 5: Verificar Riscos de Delegação em Todo o Domínio e Personificação
Identificar contas de serviço com delegação em todo o domínio e capacidades de personificação.
# Verificar contas de serviço com delegação em todo o domínio
# (Requer acesso ao Admin SDK para listar contas delegadas)
gcloud iam service-accounts list --project=PROJECT_ID --format=json | python3 -c "
import json, sys
accounts = json.load(sys.stdin)
for sa in accounts:
email = sa.get('email', '')
# Verificar se a SA tem delegação em todo o domínio ativada
# Isso requer acesso à API Admin SDK
print(f'SA: {email} - Verifique admin.google.com para status de delegação')
"
# Encontrar contas de serviço que outras identidades podem personificar
for sa in $(gcloud iam service-accounts list --project=PROJECT_ID --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 "=== Risco de personificação: $sa ==="
fi
done
Passo 6: Gerar Relatório de Auditoria e Aplicar Remediação
Compilar descobertas e implementar reduções de permissão recomendadas.
# Remover papel primitivo e substituir por papel predefinido
gcloud projects remove-iam-policy-binding PROJECT_ID \
--member="user:[email protected]" \
--role="roles/editor"
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="user:[email protected]" \
--role="roles/compute.viewer"
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="user:[email protected]" \
--role="roles/storage.objectViewer"
# Excluir chave de conta de serviço não utilizada
gcloud iam service-accounts keys delete KEY_ID \
--iam-account=SA_EMAIL
# Desabilitar conta de serviço não utilizada
gcloud iam service-accounts disable SA_EMAIL --project=PROJECT_ID
Conceitos-chave
| Termo | Definição |
|---|---|
| Papel Primitivo | Papéis GCP legados (Owner, Editor, Viewer) que concedem permissões amplas em todos os serviços, não recomendados para produção |
| Papel Predefinido | Papel gerenciado pelo GCP com escopo em serviços e ações específicos, fornecendo acesso mais granular que papéis primitivos |
| IAM Recommender | Serviço baseado em ML do GCP que analisa o uso real de permissões e sugere reduções de papéis para alcançar o menor privilégio |
| Policy Analyzer | Ferramenta para analisar o acesso IAM efetivo na hierarquia da organização, respondendo a consultas de quem-pode-acessar-o-quê |
| Chave de Conta de Serviço | Credencial gerenciada por usuário para autenticação de conta de serviço, um risco de segurança pois chaves podem ser exportadas e não expiram automaticamente |
| Delegação em Todo o Domínio | Concede a uma conta de serviço a capacidade de personificar qualquer usuário no domínio Google Workspace, um risco significativo de elevação de privilégio |
Ferramentas e Sistemas
- gcloud CLI: Ferramenta principal para consultar e gerenciar políticas IAM do GCP, contas de serviço e bindings de papéis
- IAM Recommender: Mecanismo de recomendação baseado em ML para reduzir permissões excessivas com base no uso real
- Policy Analyzer: Ferramenta de análise de acesso efetivo em toda a organização para entender quem pode acessar o quê
- Cloud Asset Inventory: Pesquisa entre projetos de políticas IAM e metadados de recursos
- ScoutSuite: Ferramenta de auditoria multi-nuvem com verificações específicas de IAM do GCP para atribuições de papéis e contas de serviço
Cenários Comuns
Cenário: Reduzindo o Uso de Papéis Primitivos em uma Organização GCP
Contexto: Uma auditoria revela que 60% dos bindings IAM na organização usam papéis primitivos (Owner/Editor). A equipe de segurança precisa migrar para papéis predefinidos sem interromper os fluxos de trabalho dos desenvolvedores.
Abordagem:
- Executar
gcloud asset search-all-iam-policiespara inventariar todos os bindings de papéis primitivos - Usar o IAM Recommender para obter sugestões baseadas em ML de papéis predefinidos substitutos
- Para cada binding, usar o Policy Analyzer para entender o que a entidade realmente acessa
- Criar um documento de mapeamento: papel primitivo -> papéis predefinidos específicos necessários
- Aplicar papéis predefinidos juntamente com papéis primitivos por um período de teste
- Monitorar erros de acesso negado usando Cloud Audit Logs
- Remover papéis primitivos após confirmar que não há problemas de acesso por 2 semanas
Armadilhas: Papéis primitivos incluem permissões em todos os serviços GCP, portanto substituí-los requer múltiplos papéis predefinidos. O Recommender pode sugerir papéis excessivamente restritivos se o período de observação não capturar todos os casos de uso. Papéis personalizados podem preencher lacunas onde nenhum papel predefinido corresponde ao conjunto exato de permissões necessário.
Formato de Saída
Relatório de Auditoria de Permissões IAM do GCP
===================================
Organização: acme-org (ORG_ID: 123456789)
Projetos Auditados: 25
Data da Auditoria: 2026-02-23
RESUMO DOS BINDINGS IAM:
Total de bindings: 342
Usando papéis primitivos: 205 (60%)
Usando papéis predefinidos: 112 (33%)
Usando papéis personalizados: 25 (7%)
DESCOBERTAS CRÍTICAS:
[IAM-001] Conta de Serviço com Papel Owner
SA: [email protected]
Papel: roles/owner no projeto prod-project
Chaves Gerenciadas por Usuário: 3 (mais antiga: 14 meses)
Remediação: Substituir por papéis predefinidos específicos, excluir chaves antigas
[IAM-002] Binding allAuthenticatedUsers
Recurso: gs://public-data-bucket
Papel: roles/storage.objectViewer
Risco: Qualquer titular de conta Google pode ler o conteúdo do bucket
Remediação: Restringir a grupos de usuários ou contas de serviço específicos
SAÚDE DAS CONTAS DE SERVIÇO:
Total de contas de serviço: 67
Com chaves gerenciadas por usuário: 23
Chaves com mais de 90 dias: 18
Contas não utilizadas (90+ dias): 12
Com delegação em todo o domínio: 2
SUGESTÕES DO RECOMMENDER:
Total de recomendações: 45
Prioridade ALTA: 12
Permissões estimadas reduzidas: 2.847 permissões individuais