La dette IAM se réaccumule après un nettoyage initial : des rôles Editor accordés temporairement et jamais révoqués, de nouveaux workloads qui réutilisent des comptes de service existants, des permissions issues de projets terminés qui ne sont jamais supprimées. Trois signaux permettent de détecter la dérive de permissions : IAM Recommender pour le sur-provisionnement, BigQuery INFORMATION_SCHEMA pour les patterns d’accès inattendus, et les logs d’audit pour les modifications IAM elles-mêmes.
IAM Recommender
Le service IAM Recommender de GCP analyse 90 jours de données d’utilisation réelle pour identifier les principals disposant de plus de permissions qu’ils n’en utilisent :
gcloud recommender recommendations list \ --project=YOUR_PROJECT_ID \ --location=global \ --recommender=google.iam.policy.RecommenderLe recommender peut faire remonter des constats tels que :
- Un compte de service avec
bigquery.dataEditorn’a effectué que des opérations de lecture pendant 90 jours — réduire àbigquery.dataViewer - Un utilisateur avec
bigquery.adminn’a jamais modifié les paramètres BigQuery — réduire àbigquery.jobUser - Un principal dispose de
roles/editormais n’utilise que des permissions spécifiques à BigQuery — remplacer par des rôles BigQuery prédéfinis
Chaque recommandation inclut un score de confiance et les actions spécifiques à effectuer. Les recommandations à haute confiance peuvent être appliquées sans investigation. Celles à confiance moyenne méritent de vérifier si le pattern d’utilisation est représentatif — un data engineer qui n’a fait que de la lecture pendant 90 jours est peut-être simplement en phase intensive de lecture.
Exécutez cette commande mensuellement et traitez les recommandations. Le recommender fait l’analyse ; c’est vous qui prenez les décisions.
BigQuery INFORMATION_SCHEMA pour les accès inattendus
Les policies IAM indiquent quel accès les principals pourraient utiliser. INFORMATION_SCHEMA.JOBS indique ce qu’ils font réellement :
SELECT user_email, DATE(creation_time) AS query_date, COUNT(*) AS query_count, SUM(total_bytes_billed) / POW(10, 12) AS tb_billedFROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECTWHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)GROUP BY 1, 2ORDER BY tb_billed DESCExaminez ces données hebdomadairement ou mensuellement en vous posant deux questions :
Des identités inattendues apparaissent-elles ? Si un compte de service que vous n’avez jamais vu commence à exécuter des requêtes, quelque chose a changé — un nouveau déploiement, une credential mal utilisée, ou un ancien compte de service censé être désactivé qui tourne encore. Recherchez immédiatement les identités inattendues.
Le pattern d’accès correspond-il aux attentes ? Un compte de service qui exécutait 50 requêtes le trimestre dernier et en exécute maintenant 5 000 mérite une investigation. Un utilisateur qui lance normalement des requêtes d’analyste et qui soudainement effectue de grands scans de tables à 3h du matin mérite une conversation.
La version attribution des coûts de cette requête ajoute les octets traités à l’analyse — utile pour détecter les requêtes incontrôlées résultant de permissions larges donnant accès à des tables volumineuses et non partitionnées.
Logs d’audit pour les modifications IAM
BigQuery INFORMATION_SCHEMA couvre ce qui se passe à l’intérieur de BigQuery. Cloud Audit Logs couvre les modifications IAM sur l’ensemble de GCP. Exportez les logs d’audit vers BigQuery et interrogez-les pour suivre qui accorde des permissions et quand :
SELECT timestamp, protoPayload.authenticationInfo.principalEmail AS grantor, protoPayload.serviceData.policyDelta.bindingDeltasFROM `your_audit_dataset.cloudaudit_googleapis_com_activity`WHERE protoPayload.methodName = 'SetIamPolicy' AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)ORDER BY timestamp DESCCette requête fait remonter chaque modification de policy IAM au cours des 30 derniers jours. Ce que vous recherchez :
- Des rôles Editor ou Owner qui sont accordés (cela ne devrait presque jamais arriver)
- Des modifications IAM effectuées en dehors des heures de bureau (peut indiquer une compromission)
- Des modifications effectuées par des principals inattendus (qui a la permission de modifier IAM ?)
- Des pics de modifications (les grants en masse indiquent parfois une automatisation défaillante)
Pour configurer le sink de logs :
gcloud logging sinks create iam-audit-sink \ bigquery.googleapis.com/projects/YOUR_PROJECT_ID/datasets/audit_logs \ --log-filter='protoPayload.methodName="SetIamPolicy"' \ --project=YOUR_PROJECT_IDLe sink capture les nouvelles modifications IAM à partir de maintenant. Il ne rétroplante pas les événements historiques, donc configurez-le avant d’en avoir besoin.
Un processus de revue trimestrielle
Les signaux de surveillance sont plus utiles comme entrées d’une cadence de revue régulière que pour une investigation ponctuelle. Une revue IAM trimestrielle empêche la dérive de s’accumuler :
Mois 1 : Exécutez les requêtes d’audit complètes — rôles Editor/Owner, comptes de service avec des clés, comptes partagés. Traitez les résultats de la sortie du recommender du trimestre précédent.
Mois 2 : Examinez les patterns de jobs INFORMATION_SCHEMA. Identifiez les comptes de service avec des patterns d’accès inhabituels. Vérifiez que tous les comptes de service actifs suivent la convention de nommage (qui vous indique en un coup d’œil si quelque chose d’non autorisé a été créé).
Mois 3 : Examinez les modifications IAM dans les logs d’audit. Vérifiez que les modifications IAM se font par les mécanismes attendus (PRs Terraform, demandes d’accès approuvées) plutôt que de manière ad-hoc via la console ou la CLI.
La première revue après une période de négligence est la plus chronophage. Les revues trimestrielles suivantes sont plus courtes, car elles préviennent l’accumulation plutôt que de traiter des backlogs.
Le lien avec les coûts
Un IAM sur-provisionné n’est pas seulement un problème de sécurité. Lorsque les analystes ont accès à des tables dont ils n’ont pas besoin, ils exécutent accidentellement des requêtes coûteuses dessus. Lorsque des comptes de service disposent de rôles Editor au lieu d’un accès de dataset ciblé, ils peuvent lire et scanner n’importe quelle table du projet.
Les requêtes de coût INFORMATION_SCHEMA et les requêtes IAM INFORMATION_SCHEMA s’appuient sur les mêmes données. Les équipes qui surveillent les deux ensemble constatent que le nettoyage IAM produit souvent des réductions de 20 à 30 % des coûts de requêtes BigQuery — non pas parce qu’elles ont optimisé les requêtes, mais parce qu’elles ont supprimé les accès qui rendaient possible les plus coûteuses.