Pour qui : équipe sécurité / SOC (au quotidien), plateforme (correctifs), PM (indicateurs). But : savoir chaque matin, en 10 minutes, si quelque chose d'anormal s'est passé ; savoir où trouver chaque journal ; savoir quoi faire quand une alerte sonne.
1. La routine
| Quand | Quoi | Outil | Durée |
|---|---|---|---|
| Chaque jour | Lire le journal quotidien ; traiter chaque ligne au-dessus du seuil | scripts/daily_report.sh | 10 min |
| Chaque jour | Traiter les alertes reçues (e-mail / SIEM) | Monitoring → Alerting | selon alertes |
| Chaque semaine | Faux positifs Model Armor (demandes légitimes bloquées) ; nouveaux agents dans le registre | Log Analytics (§4), Agent Registry | 30 min |
| Chaque mois | Conformité + inventaire Shadow AI, archivés | verify_controls.sh, shadow_ai_inventory.sh | 1 h |
| Chaque trimestre | Revue des groupes, de la liste blanche de sortie, des durées de conservation, des exceptions | Console IAM, terraform.tfvars | 2 h |
Le journal quotidien
./scripts/daily_report.sh > rapports/$(date +%F).md # dernières 24 h
SINCE=7d ./scripts/daily_report.sh # la semaineIl produit un tableau Markdown :
| Indicateur | Seuil d'action |
|---|---|
| Modifications de garde-fous (Model Armor, clés, IAM, assistant) | > 0 sans PR correspondante = incident |
| Blocages Model Armor | pic ×3 par rapport à la moyenne = attaque possible ou faux positif massif |
| Réponses bloquées par la politique (journaux d'usage) | idem |
| Signaux Shadow AI (agent créé, outil enregistré) | > 0 sans PR = enquête |
Accès refusés (PERMISSION_DENIED) | pic = tentative d'accès |
| Violations VPC-SC | avant enforcement : à analyser une par une |
| Requêtes utilisateurs | tendance d'adoption (pour le PM) |
Plus : qui a modifié la configuration, filtres les plus déclenchés, méthodes refusées.
Automatiser : exécuter le script chaque matin depuis la CI (tâche planifiée) avec un compte qui a
roles/logging.viewAccessor sur les vues des buckets, et poster le rapport dans le canal de l'équipe sécurité.
2. Où se trouve chaque journal
| Journal | Contenu | Où le lire | Conservation |
|---|---|---|---|
| Audit admin (toujours actif) | Création/modification de ressources, droits | Bucket ge-security (et _Required) | 365 j (400 j dans _Required) |
| Audit accès aux données | Qui a lu / interrogé quoi (GE, Agent Platform, Model Armor, Secret Manager, Agent Registry) | ge-security | 365 j |
| Verdicts Model Armor | Filtre déclenché, (option) contenu analysé | ge-security | 365 j |
Usage Gemini Enterprise (gemini_enterprise_user_activity) | Question, sources, motif de blocage. Contient des questions | ge-usage (sécurité seulement) | 90 j |
Texte complet questions/réponses (gen_ai.*, option) | Contenu intégral | ge-usage | 90 j |
| Access Transparency | Accès d'un ingénieur Google | _Required / ge-security | 400 j |
| VPC-SC (dry-run ou appliqué) | Requête qui serait/est bloquée par le périmètre | ge-security | 365 j |
| Journaux de l'agent (Agent Runtime) | Exécution, erreurs, confirmations | _Default, ressource aiplatform.googleapis.com/ReasoningEngine | 30 j |
| SIEM | Copie temps réel de ge-security | Pub/Sub → outil du SOC | selon SOC |
Ouvrir un bucket : 🔎 « Logs Explorer » → Affiner la portée → Stockage → cocher ge-security ou ge-usage.
SQL : 🔎 « Log Analytics » → choisir la vue ge-security._AllLogs.
3. Requêtes Logs Explorer prêtes à l'emploi
Qui a modifié un garde-fou
logName:"cloudaudit.googleapis.com%2Factivity"
protoPayload.serviceName=("modelarmor.googleapis.com" OR "cloudkms.googleapis.com" OR "discoveryengine.googleapis.com")
protoPayload.methodName=~"(Update|Delete|SetIamPolicy|Destroy)"
Ce que Model Armor a bloqué (ou aurait bloqué, en inspection)
jsonPayload.@type="type.googleapis.com/google.cloud.modelarmor.logging.v1.SanitizeOperationLogEntry"
jsonPayload.sanitizationResult.filterMatchState="MATCH_FOUND"
Réponses de l'app bloquées par la politique
logName:"gemini_enterprise_user_activity"
"CUSTOMER_POLICY_VIOLATION"
Shadow AI : agents créés, services rendus publics
logName:"cloudaudit.googleapis.com%2Factivity"
(protoPayload.methodName=~"ReasoningEngineService.CreateReasoningEngine"
OR (protoPayload.serviceName="run.googleapis.com" AND protoPayload.methodName=~"SetIamPolicy"))
VPC-SC
protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
Ajouter protoPayload.metadata.dryRun=true pour ne voir que le mode observation. Le champ
protoPayload.metadata.violationReason indique pourquoi.
Accès de Google (Access Transparency)
logName:"cloudaudit.googleapis.com%2Faccess_transparency"
4. Requêtes Log Analytics (SQL) pour les tableaux de bord
Remplacer PROJET par l'ID du projet.
-- Blocages Model Armor par jour et par filtre (30 jours)
SELECT DATE(timestamp) AS jour,
JSON_VALUE(json_payload, '$.sanitizationResult.filterMatchState') AS verdict,
COUNT(*) AS n
FROM `PROJET.eu.ge-security._AllLogs`
WHERE JSON_VALUE(json_payload, '$."@type"') LIKE '%SanitizeOperationLogEntry'
AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY jour, verdict ORDER BY jour;-- Qui change la configuration de sécurité (90 jours)
SELECT proto_payload.audit_log.authentication_info.principal_email AS qui,
proto_payload.audit_log.method_name AS action,
COUNT(*) AS n
FROM `PROJET.eu.ge-security._AllLogs`
WHERE log_name LIKE '%cloudaudit.googleapis.com%2Factivity'
AND proto_payload.audit_log.service_name IN ('modelarmor.googleapis.com','cloudkms.googleapis.com','discoveryengine.googleapis.com')
AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
GROUP BY qui, action ORDER BY n DESC;-- Adoption : utilisateurs actifs par jour (pour le PM ; pas de contenu)
SELECT DATE(timestamp) AS jour,
COUNT(DISTINCT JSON_VALUE(json_payload, '$.userPseudoId')) AS utilisateurs
FROM `PROJET.eu.ge-usage._AllLogs`
WHERE log_name LIKE '%gemini_enterprise_user_activity'
GROUP BY jour ORDER BY jour;Les noms exacts des champs JSON des journaux d'usage sont à confirmer sur les premiers journaux réels (Logs Explorer → déplier une entrée). Ajuster les chemins
$.…en conséquence.
Tableau de bord : avec link_logs_to_bigquery = true, ces requêtes alimentent Looker Studio sans copie de données.
5. Que faire quand une alerte sonne
A. « Modification d'un garde-fou de sécurité »
- Ouvrir l'alerte → Voir les journaux : qui (
principalEmail), quoi (methodName), quand. - Une PR Terraform correspond ? (compte de la CI, heure du
apply). Oui → clore. - Non → incident : annuler en relançant
terraform apply(le code remet la configuration validée), retirer les droits de l'auteur si nécessaire, prévenir le RSSI.
B. « Pic de requêtes bloquées »
- Log Analytics : quel filtre, quel(s) utilisateur(s) ?
- Un seul utilisateur, injections répétées → tentative d'abus : prévenir le manager et le RSSI selon la charte.
- Beaucoup d'utilisateurs, filtre SDP ou RAI → faux positif probable (ex. nouveau format de document) : ajuster le template par PR, jamais en console.
C. « Service public, agent ou outil créé / modifié » (Shadow AI)
- Identifier la ressource et son auteur dans le journal.
- PR et inscription dans Agent Registry ? Oui → clore.
- Non → contacter l'auteur. Selon le risque : retirer
allUsers, arrêter le service, ou régulariser (identité dédiée, Model Armor, Agent Registry, déploiement par la CI). Inscrire au rapport mensuel.
D. Demande Access Approval reçue
- Lire la justification de Google (numéro de ticket support).
- Vérifier avec l'équipe qui a ouvert le ticket. Approuver pour la durée minimale, ou refuser.
- L'accès apparaît ensuite dans Access Transparency : le rapprocher de la demande.
E. Fuite de données suspectée (incident majeur)
- Retirer les utilisateurs concernés du groupe, ou suspendre l'app (désactiver le groupe utilisateurs).
- Si nécessaire, désactiver la version de clé KMS (données illisibles en ≤ 15 min, réversible 30 jours).
- Exporter les journaux
ge-securityetge-usagede la période (preuve) ; prévenir le DPO (délai CNIL de 72 h si des données personnelles sont concernées).
6. Indicateurs mensuels (pour le comité)
| Indicateur | Source | Cible |
|---|---|---|
Contrôles verify_controls.sh au vert | Script | 100 % |
| Changements de garde-fous sans PR | Journal quotidien | 0 |
| Ressources IA hors Agent Registry | shadow_ai_inventory.sh | 0 (ou exception écrite) |
| Ressources ouvertes à Internet | idem | 0 |
| Taux de faux positifs Model Armor | Revue hebdomadaire | < 1 % des requêtes |
| Délai de traitement d'une alerte | Alerting | < 4 h ouvrées |
| Utilisateurs actifs | Log Analytics | suivi d'adoption |