Audit des permissions IAM GCP
Quand l'utiliser
- Lors d'évaluations de sécurité des configurations IAM d'une organisation ou d'un projet GCP
- Lors de l'identification de comptes de service disposant d'autorisations excessives ou d'accès inutilisés
- Lorsque des exigences de conformité imposent une révision des contrôles d'accès et des attributions de rôles
- Lors de l'investigation de mouvements latéraux potentiels via des erreurs de configuration IAM
- Pour réduire le rayon d'explosion des identifiants compromis en limitant les permissions
Ne pas utiliser pour l'audit des règles de pare-feu VPC (utiliser des outils de sécurité réseau), pour l'audit RBAC GKE (utiliser des outils RBAC spécifiques à Kubernetes), ou pour la détection de menaces en temps réel sur les actions IAM (utiliser SCC Event Threat Detection).
Prérequis
- Organisation ou projet GCP avec les rôles
roles/iam.securityRevieweretroles/cloudAsset.viewer - gcloud CLI authentifié avec les permissions appropriées
- API Cloud Asset activée (
gcloud services enable cloudasset.googleapis.com) - API IAM Recommender activée (
gcloud services enable recommender.googleapis.com) - API Policy Analyzer activée (
gcloud services enable policyanalyzer.googleapis.com)
Flux de travail
Étape 1 : Énumérer les liaisons IAM dans toute l'organisation
Listez toutes les liaisons IAM au niveau de l'organisation, du dossier et du projet pour comprendre l'ensemble du paysage des accès.
# Liaisons IAM au niveau de l'organisation
gcloud organizations get-iam-policy ORG_ID \
--format=json > org-iam-policy.json
# Rechercher toutes les politiques IAM dans l'organisation
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--format="table(resource, policy.bindings.role, policy.bindings.members)" \
--limit=500
# Trouver tous les utilisateurs et comptes de service avec le rôle Owner
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--query="policy:roles/owner" \
--format="table(resource, policy.bindings.members)"
# Trouver toutes les liaisons utilisant des rôles primitifs (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}')
"
Étape 2 : Auditer les comptes de service et leurs clés
Identifiez les comptes de service avec des autorisations excessives, des clés gérées par l'utilisateur et des comptes inutilisés.
# Lister tous les comptes de service dans un projet
gcloud iam service-accounts list \
--project=PROJECT_ID \
--format="table(email, displayName, disabled)"
# Vérifier les clés gérées par l'utilisateur (à minimiser)
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
# Trouver les comptes de service avec des rôles admin dans tous les projets
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)"
# Vérifier les politiques IAM des comptes de service (qui peut les emprunter)
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
Étape 3 : Utiliser IAM Recommender pour identifier les permissions excessives
Exploitez IAM Recommender de GCP pour trouver les rôles qui accordent plus d'accès que réellement utilisé.
# Lister les recommandations de rôles IAM pour un projet
gcloud recommender recommendations list \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--format="table(name, description, priority, stateInfo.state)"
# Obtenir une recommandation détaillée
gcloud recommender recommendations describe RECOMMENDATION_ID \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--format=json
# Lister les insights sur l'utilisation IAM
gcloud recommender insights list \
--project=PROJECT_ID \
--insight-type=google.iam.policy.Insight \
--location=global \
--format="table(name, description, severity, category)"
# Appliquer une recommandation (après révision)
gcloud recommender recommendations mark-claimed RECOMMENDATION_ID \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--etag=ETAG
Étape 4 : Analyser les permissions effectives avec Policy Analyzer
Utilisez Policy Analyzer pour déterminer l'accès effectif pour des principaux ou ressources spécifiques.
# Vérifier qui a accès à une ressource spécifique
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)"
# Vérifier à quelles ressources un utilisateur spécifique peut accéder
gcloud asset analyze-iam-policy \
--organization=ORG_ID \
--identity="user:[email protected]" \
--format="table(accessControlLists.resources.fullResourceName, accessControlLists.accesses.role)"
# Vérifier qui peut effectuer une action spécifique
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)"
# Trouver tous les principaux avec accès 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)"
Étape 5 : Vérifier les risques de délégation à l'échelle du domaine et d'emprunt
Identifiez les comptes de service avec délégation à l'échelle du domaine et capacités d'emprunt.
# Vérifier les comptes de service avec délégation à l'échelle du domaine
# (Nécessite l'accès à l'API Admin SDK pour lister les comptes délégués)
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', '')
# Vérifier si le compte de service a la délégation à l'échelle du domaine activée
# Nécessite l'accès à l'API Admin SDK
print(f'CS: {email} - Vérifier admin.google.com pour le statut de délégation')
"
# Trouver les comptes de service que d'autres identités peuvent emprunter
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 "=== Risque d'emprunt : $sa ==="
fi
done
Étape 6 : Générer un rapport d'audit et appliquer les corrections
Compilez les résultats et mettez en œuvre les réductions de permissions recommandées.
# Supprimer un rôle primitif et le remplacer par un rôle prédéfini
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"
# Supprimer les clés de compte de service inutilisées
gcloud iam service-accounts keys delete KEY_ID \
--iam-account=SA_EMAIL
# Désactiver les comptes de service inutilisés
gcloud iam service-accounts disable SA_EMAIL --project=PROJECT_ID
Concepts clés
| Terme | Définition |
|---|---|
| Rôle primitif | Rôles GCP hérités (Owner, Editor, Viewer) qui accordent des permissions larges sur tous les services, déconseillés en production |
| Rôle prédéfini | Rôle géré par GCP, limité à des services et actions spécifiques, offrant un accès plus granulaire que les rôles primitifs |
| IAM Recommender | Service ML de GCP qui analyse l'utilisation réelle des permissions et suggère des réductions de rôles pour atteindre le moindre privilège |
| Policy Analyzer | Outil d'analyse de l'accès IAM effectif dans la hiérarchie de l'organisation, répondant aux questions qui-peut-accéder-à-quoi |
| Clé de compte de service | Identifiant géré par l'utilisateur pour l'authentification des comptes de service, un risque de sécurité car les clés peuvent être exportées et n'expirent pas automatiquement |
| Délégation à l'échelle du domaine | Accorde à un compte de service la capacité d'emprunter l'identité de n'importe quel utilisateur du domaine Google Workspace, un risque d'escalade de privilèges significatif |
Outils et systèmes
- gcloud CLI: Outil principal pour interroger et gérer les politiques IAM GCP, les comptes de service et les liaisons de rôles
- IAM Recommender: Moteur de recommandation basé sur le ML pour réduire les permissions excessives en fonction de l'utilisation réelle
- Policy Analyzer: Outil d'analyse de l'accès effectif à l'échelle de l'organisation pour comprendre qui peut accéder à quoi
- Cloud Asset Inventory: Recherche inter-projets pour les politiques IAM et les métadonnées de ressources
- ScoutSuite: Outil d'audit multi-cloud avec des vérifications IAM GCP spécifiques pour les attributions de rôles et les comptes de service
Scénarios courants
Scénario : Réduction de l'utilisation des rôles primitifs dans une organisation GCP
Contexte : Un audit révèle que 60 % des liaisons IAM dans l'organisation utilisent des rôles primitifs (Owner/Editor). L'équipe de sécurité doit migrer vers des rôles prédéfinis sans perturber les workflows des développeurs.
Approche :
- Exécuter
gcloud asset search-all-iam-policiespour inventorier toutes les liaisons avec des rôles primitifs - Utiliser IAM Recommender pour obtenir des suggestions basées sur le ML pour le remplacement par des rôles prédéfinis
- Pour chaque liaison, utiliser Policy Analyzer pour comprendre à quoi le principal accède réellement
- Créer un document de correspondance : rôle primitif -> rôles prédéfinis spécifiques nécessaires
- Appliquer les rôles prédéfinis en parallèle des rôles primitifs pendant une période de test
- Surveiller les erreurs d'accès refusé à l'aide des journaux Cloud Audit
- Supprimer les rôles primitifs après avoir confirmé l'absence de problèmes d'accès pendant 2 semaines
Pièges : Les rôles primitifs incluent des permissions sur tous les services GCP, leur remplacement nécessite donc plusieurs rôles prédéfinis. Le moteur de recommandation peut suggérer des rôles trop restrictifs si la période d'observation ne capture pas tous les cas d'utilisation. Les rôles personnalisés peuvent combler les lacunes là où aucun rôle prédéfini ne correspond exactement à l'ensemble des permissions nécessaires.
Format de sortie
Rapport d'audit des permissions IAM GCP
=========================================
Organisation : acme-org (ORG_ID : 123456789)
Projets audités : 25
Date de l'audit : 2026-02-23
RÉSUMÉ DES LIAISONS IAM :
Total des liaisons : 342
Utilisation de rôles primitifs : 205 (60%)
Utilisation de rôles prédéfinis : 112 (33%)
Utilisation de rôles personnalisés : 25 (7%)
RÉSULTATS CRITIQUES :
[IAM-001] Compte de service avec rôle Owner
CS : [email protected]
Rôle : roles/owner sur le projet prod-project
Clés gérées par l'utilisateur : 3 (la plus ancienne : 14 mois)
Correction : Remplacer par des rôles prédéfinis spécifiques, supprimer les anciennes clés
[IAM-002] Liaison allAuthenticatedUsers
Ressource : gs://public-data-bucket
Rôle : roles/storage.objectViewer
Risque : Tout titulaire d'un compte Google peut lire le contenu du bucket
Correction : Restreindre à des groupes d'utilisateurs ou comptes de service spécifiques
SANTÉ DES COMPTES DE SERVICE :
Total des comptes de service : 67
Avec clés gérées par l'utilisateur : 23
Clés de plus de 90 jours : 18
Comptes inutilisés (90+ jours) : 12
Avec délégation à l'échelle du domaine : 2
SUGGESTIONS DU RECOMMENDER :
Total des recommandations : 45
Priorité HAUTE : 12
Permissions estimées réduites : 2 847 permissions individuelles