Niveau 10 — Conformité | Automatisation | CIS Benchmark | Annexes
Conformité RGPD article par article, NIS2, CIS Benchmark Google Workspace. Framework d'automatisation Python, structure du rapport, matrice de priorisation et annexes techniques complètes.
13. Niveau 10 — Conformité Réglementaire
13.1 Conformité RGPD
Le RGPD impose des obligations précises sur la gestion des données personnelles. Un audit Google Workspace doit évaluer la conformité article par article.
Articles RGPD directement impactés par la configuration Workspace :| Article | Principe | Ce qu'on vérifie |
|---|---|---|
| Art. 5(1)(e) | Limitation de la conservation | Fichiers anciens > 3 ans sans politique de purge |
| Art. 5(1)(f) | Intégrité et confidentialité | Fichiers publics, partages non contrôlés |
| Art. 9 & 32 | Données sensibles | Bulletins de paie, données médicales, RH dans Drive non chiffré |
| Art. 17 | Droit à l'effacement | Procédure offboarding documentée |
| Art. 25 | Privacy by design | Paramètres de partage par défaut restrictifs |
| Art. 28 | Sous-traitants | DPA avec Google, Zendesk, Ivalua et autres SaaS |
| Art. 32 | Sécurité du traitement | 2FA, chiffrement, transferts email |
| Art. 33 & 34 | Notification de violation | Procédure de réponse aux incidents documentée |
| Art. 35 | DPIA | Traitements à risque élevé identifiés |
| Art. 44-49 | Transferts internationaux | SaaS US — Privacy Shield remplacé, clauses contractuelles |
def calculate_gdpr_score(findings):
"""Calcule un score de conformité RGPD basé sur les findings."""
score = 100
violations = []
# Art. 5(1)(e) — Vieux fichiers
old_ratio = findings.get("drive", {}).get("old_files_ratio", 0)
if old_ratio > 0.3:
score -= 10
violations.append(("Art. 5(1)(e)", "MOYEN", f"{old_ratio:.0%} de fichiers > 3 ans"))
# Art. 5(1)(f) — Fichiers publics
public_files = findings.get("drive", {}).get("public_files_count", 0)
if public_files > 0:
score -= 15
violations.append(("Art. 5(1)(f)", "ÉLEVÉ", f"{public_files} fichiers publics"))
# Art. 32 — Transfert email
if findings.get("gmail", {}).get("has_forwarding"):
score -= 20
violations.append(("Art. 32", "CRITIQUE", "Transfert automatique email vers tiers"))
# Art. 9 & 32 — Données RH
sensitive_files = findings.get("drive", {}).get("sensitive_files_count", 0)
if sensitive_files > 100:
score -= 20
violations.append(("Art. 9 & 32", "CRITIQUE", f"{sensitive_files} fichiers sensibles non chiffrés"))
return max(0, score), violations
13.2 Conformité NIS2
La directive NIS2 s'applique aux entités importantes et essentielles, notamment les ESN/prestataires IT. Les obligations clés à auditer :
| Obligation NIS2 | Vérification Workspace | Outil d'audit |
|---|---|---|
| Politique de sécurité des SI | PSSI documentée et appliquée | Revue documentaire |
| Gestion des incidents (72h) | Alert Center + procédure d'escalade | Alert Center API |
| Continuité d'activité | PCA/PRA documenté | Revue documentaire |
| Sécurité chaîne d'approvisionnement | Apps OAuth validées, sous-traitants DPA | OAuth audit |
| Contrôle d'accès MFA résistant phishing | FIDO2 pour admins | Directory API |
| Chiffrement | Données sensibles isolées et chiffrées | Drive API |
| Journalisation et surveillance | SIEM + rétention logs | Reports API |
13.3 CIS Benchmark Google Workspace
Le Center for Internet Security publie un benchmark de sécurité spécifique à Google Workspace. Voir la Section 16 pour le détail complet.
Score CIS = nombre de contrôles conformes / total des contrôles évaluésUn score < 50% indique une posture de sécurité insuffisante.
---
14. Automatisation et Outillage
14.1 Architecture du framework d'audit
audit-workspace/
├── config.py # Configuration centralisée
├── auth.py # Authentification Service Account
├── main.py # Orchestrateur principal
├── run_full_audit.py # Exécution de tous les modules
│
├── audit_users.py # Niveau 1 — IAM
├── audit_gmail.py # Niveau 2 — Gmail
├── audit_drive.py # Niveau 3 — Drive (partages)
├── audit_drive_files.py # Niveau 3 — Drive (fichiers)
├── audit_dns.py # Niveau 4 — DNS
├── audit_oauth_apps.py # Niveau 5 — OAuth
├── audit_less_secure.py # Niveau 1 — Tokens + Recovery
├── audit_devices.py # Niveau 6 — MDM
├── audit_groups.py # Niveau 7 — Groupes
├── audit_alerts.py # Niveau 8 — Alert Center
├── audit_admin_logs.py # Niveau 8 — Logs admin
├── audit_login.py # Niveau 8 — Logs connexion
├── audit_calendar.py # Niveau 2 — Calendar
├── audit_recon.py # Niveau 9 — Recon passive
├── audit_hibp.py # Niveau 9 — HIBP
├── audit_darkweb.py # Niveau 9 — Dark web
├── audit_compliance.py # Niveau 10 — RGPD/NIS2
│
└── reports/
├── AUDIT_SECURITE_YYYYMMDD.md
├── extra_modules.json
├── levels_1_4.json
├── login_audit.json
├── calendar_audit.json
└── drive_files_analysis.json
14.2 Orchestrateur principal
# run_full_audit.py
import os, sys, json
os.environ["PYTHONUTF8"] = "1"
from auth import get_directory_service, get_reports_service
from audit_users import audit_all_users
from audit_gmail import audit_gmail_all_users
from audit_drive import audit_drive_shares
from audit_drive_files import audit_drive_files_deep
from audit_dns import check_all_dns
from audit_oauth_apps import audit_oauth_apps
from audit_less_secure import audit_user_security_settings, audit_user_recovery_info
from audit_devices import audit_mobile_devices
from audit_groups import audit_groups
from audit_alerts import audit_alert_center
from audit_admin_logs import audit_admin_logs
from audit_login import audit_login_activity
from audit_calendar import audit_all_calendars
from audit_recon import check_certificate_transparency, check_mx_blacklists
from audit_compliance import assess_rgpd_compliance, assess_nis2_compliance
def run_full_audit():
"""Exécute l'audit complet en lecture seule."""
print("[*] Démarrage de l'audit Google Workspace...")
service = get_directory_service()
reports_service = get_reports_service()
# Récupération de la liste des utilisateurs
users = get_all_users(service)
emails = [u["primaryEmail"] for u in users]
print(f"[*] {len(emails)} utilisateurs trouvés")
results = {}
# Niveaux 1-8 : APIs Google
results["users"] = audit_all_users(service)
results["gmail"] = audit_gmail_all_users(emails)
results["drive"] = audit_drive_shares(emails)
results["drive_files"] = audit_drive_files_deep(emails[:10]) # Limiter pour les premiers
results["dns"] = check_all_dns(DOMAIN)
results["oauth"] = audit_oauth_apps()
results["security"] = audit_user_security_settings(emails)
results["recovery"] = audit_user_recovery_info(emails)
results["devices"] = audit_mobile_devices(service)
results["groups"] = audit_groups(service)
results["alerts"] = audit_alert_center(alert_service)
results["admin_logs"] = audit_admin_logs(reports_service)
results["logins"] = audit_login_activity(reports_service)
results["calendar"] = audit_all_calendars(emails)
# Niveau 9 : Recon et Threat Intel
results["recon"] = {
"crt": check_certificate_transparency(DOMAIN),
"blacklists": check_mx_blacklists(DOMAIN),
}
# Niveau 10 : Conformité
results["rgpd"] = assess_rgpd_compliance(results)
results["nis2"] = assess_nis2_compliance()
# Sauvegarde
with open(f"reports/audit_{DOMAIN}_{datetime.now().strftime('%Y%m%d')}.json", "w") as f:
json.dump(results, f, ensure_ascii=False, indent=2, default=str)
print("[+] Audit terminé.")
return results
14.3 Gestion des erreurs courantes
| Erreur | Cause | Solution |
|---|---|---|
invalid_grant | Horloge désynchronisée | Resynchroniser NTP |
unauthorized_client | Scope absent de la délégation | Ajouter le scope dans admin.google.com |
insufficientPermissions | API non activée dans GCP | Activer l'API dans Cloud Console |
notACalendarUser | Utilisateur sans Calendar | Ignorer — pas une erreur de sécurité |
UnicodeEncodeError | Terminal Windows cp1252 | Utiliser python -X utf8 ou PYTHONUTF8=1 |
403 Forbidden | Service Account sans impersonation | Vérifier la Domain-Wide Delegation |
15. Rapport et Feuille de Route
15.1 Structure du rapport
Un rapport d'audit Google Workspace complet doit contenir :
1. Synthèse Exécutive (1 page)
- Score global de sécurité
- Top 5 risques immédiats
- Métriques clés
2. Findings par niveau de sévérité
- CRITIQUE : action sous 48h
- ÉLEVÉ : action sous 7 jours
- MOYEN : action sous 30 jours
- INFORMATIF : à planifier
3. Audits détaillés par domaine
- IAM, Gmail, Drive, DNS, OAuth, MDM, Groupes, Logs
4. Conformité
- RGPD (score + violations par article)
- NIS2 (matrice d'obligations)
- CIS Benchmark (score détaillé)
5. Chemins d'attaque (Kill Chains)
- Scénarios réalistes basés sur les findings
6. Feuille de route de sécurisation
- Matrice priorité / effort / impact
- Planning par semaine/mois
7. Annexes
- Données brutes
- Méthodologie
- Outils utilisés
15.2 Scoring de sécurité
def calculate_security_score(findings):
"""Calcule un score de sécurité global de 0 à 100."""
score = 100
deductions = {
"no_2fa_users": (-5, "par utilisateur sans 2FA"),
"public_files": (-10, "par fichier public"),
"active_forwarding": (-20, "transfert email actif"),
"external_sa_writer": (-15, "service account externe WRITER"),
"super_admin_external_recovery": (-10, "par Super Admin avec récup externe"),
"php_eol_server": (-8, "serveur PHP EOL exposé"),
}
# ... calcul basé sur les findings
return max(0, score)
Grille d'interprétation du score :
| Score | Niveau | Signification |
|---|---|---|
| 90-100 | ✅ Excellent | Posture mature, risques résiduels mineurs |
| 75-89 | 🟡 Bon | Bonne base, quelques gaps à combler |
| 60-74 | 🟠 Acceptable | Risques notables — roadmap requise |
| 40-59 | 🔴 Insuffisant | Vulnérabilités significatives — actions urgentes |
| < 40 | 🔴 Critique | Posture dangereuse — intervention immédiate |
15.3 Matrice de priorisation
Priorité = f(Impact, Probabilité, Effort de correction)
P1 (Immédiat) : Impact CRITIQUE + Probabilité HAUTE + Effort FAIBLE
P2 (J+7) : Impact ÉLEVÉ + Probabilité MOYENNE + Effort MOYEN
P3 (J+30) : Impact MOYEN + Probabilité BASSE + Effort ÉLEVÉ
P4 (J+90) : Gouvernance, processus, formation
15.4 Chemins d'attaque types
Kill Chain 1 — Exfiltration via forwarding GmailPhishing ou insider malveillant
→ Activation d'un transfert automatique Gmail
→ Copie en temps réel de tous les emails vers un tiers
→ Fuite continue de données confidentielles
→ Impact : RGPD, concurrentiel, contractuel
Kill Chain 2 — Account Takeover via email de récupération
Email de récupération présent dans un stealer log
→ Attaquant accède au compte Gmail/Yahoo de récupération
→ Procédure "mot de passe oublié" sur le compte Workspace
→ Bypass de la 2FA via le code envoyé sur l'email compromis
→ Accès complet au compte (emails, Drive, calendrier)
→ Escalade si compte Super Admin
Kill Chain 3 — OAuth Consent Phishing
Email malveillant : "Autorisez cette app pour accéder à votre planning"
→ Utilisateur clique et autorise l'app OAuth
→ L'app obtient les scopes accordés (Gmail, Drive)
→ Exfiltration silencieuse continue
→ Aucune trace dans les logs Gmail standards
→ Persiste même après changement de mot de passe
Kill Chain 4 — Compromission via service account externe
Clé de service account externe volée ou fuitée
→ Accès aux fichiers Drive partagés avec ce SA
→ Lecture de données confidentielles
→ Injection de code malveillant dans des scripts partagés
→ Exécution par un employé → RCE sur son poste
→ Pivot vers le réseau interne
---
16. Référentiel CIS Benchmark Google Workspace
Le CIS Benchmark for Google Workspace définit 40+ contrôles de sécurité. Voici les contrôles les plus critiques avec leur méthode de vérification :
Section 1 — Gestion des Identités et des Accès
| CIS ID | Contrôle | Méthode de vérification | Criticité |
|---|---|---|---|
| 1.1.1 | ≤ 4 Super Admins | users.list + filtre isAdmin=true | Haute |
| 1.1.2 | Comptes admin dédiés | Vérifier si les admins ont des emails dédiés non-quotidiens | Haute |
| 1.1.3 | 2FA obligatoire (enforced) | Attribut isEnforcedIn2Sv sur tous les comptes | Haute |
| 1.1.4 | Clés FIDO2 pour Super Admins | Absence de clé hardware = non conforme | Haute |
| 1.1.5 | Email récupération interne | recoveryEmail doit se terminer par @domaine.com | Haute |
| 1.1.6 | Politique mot de passe min. 12 car. | admin.google.com → Sécurité → Mots de passe | Moyenne |
| 1.1.7 | Expiration mots de passe désactivée si MFA fort | Dépend de la politique de mot de passe | Faible |
| 1.2.1 | Context-Aware Access pour admins | admin.google.com → Sécurité → Context-Aware Access | Haute |
Section 2 — Google Drive
| CIS ID | Contrôle | Méthode de vérification | Criticité |
|---|---|---|---|
| 2.1 | Restreindre partage hors domaine | Paramètres Drive dans admin.google.com | Haute |
| 2.2 | Désactiver "Anyone with link" | API Drive, permissions type=anyone | Haute |
| 2.3 | Avertissement avant partage externe | Paramètre admin.google.com | Moyenne |
| 2.4 | Expiration automatique des liens | Paramètre global Drive | Moyenne |
| 2.5 | Audit Drive régulier documenté | Processus organisationnel | Faible |
| 2.6 | DLP sur données sensibles | Google DLP ou solution tierce | Haute |
Section 3 — Gmail
| CIS ID | Contrôle | Méthode de vérification | Criticité |
|---|---|---|---|
| 3.1 | Désactiver transfert automatique | API Gmail, getAutoForwarding() | Critique |
| 3.2 | Désactiver délégation de boîte | API Gmail, delegates().list() | Haute |
| 3.3 | Anti-spam/phishing renforcé | Paramètres Gmail avancés | Haute |
| 3.4 | SMTP relay authentifié | admin.google.com → Gmail → Routing | Moyenne |
| 3.5 | Désactiver Less Secure Apps | API, asps().list() | Haute |
Section 4 — Sécurité Email DNS
| CIS ID | Contrôle | Méthode | Criticité |
|---|---|---|---|
| 4.1 | SPF -all (hard fail) | dns.resolver.resolve(domain, "TXT") | Haute |
| 4.2 | DKIM configuré (2048 bits) | dns.resolver.resolve("google._domainkey.domain", "TXT") | Haute |
| 4.3 | DMARC p=reject | dns.resolver.resolve("_dmarc.domain", "TXT") | Critique |
| 4.4 | DMARC reporting (rua) | Présence rua= dans l'enregistrement | Moyenne |
| 4.5 | MX uniquement Google | Vérifier qu'aucun MX parasite n'existe | Haute |
Section 5 — Applications Tierces
| CIS ID | Contrôle | Méthode | Criticité |
|---|---|---|---|
| 5.1 | Liste blanche d'applications | admin.google.com → Sécurité → API Controls | Haute |
| 5.2 | Bloquer apps non vérifiées | Paramètre admin.google.com | Haute |
| 5.3 | Revue trimestrielle des OAuth | Processus organisationnel | Moyenne |
| 5.4 | Alertes nouvelles autorisations OAuth | Alert Center config | Haute |
Section 6 — Appareils Mobiles
| CIS ID | Contrôle | Méthode | Criticité |
|---|---|---|---|
| 6.1 | MDM activé et enforced | mobiledevices().list() | Haute |
| 6.2 | Chiffrement obligatoire | Attribut deviceCompromisedStatus | Haute |
| 6.3 | PIN biométrique obligatoire | Politique MDM | Haute |
| 6.4 | Remote wipe disponible | Fonctionnalité MDM Workspace | Moyenne |
Section 7 — Groupes
| CIS ID | Contrôle | Méthode | Criticité |
|---|---|---|---|
| 7.1 | Pas de membres externes non justifiés | members().list() par groupe | Haute |
| 7.2 | Chaque groupe a un owner | Vérifier role=OWNER dans membres | Moyenne |
| 7.3 | Restriction création groupes aux admins | Paramètre admin.google.com | Faible |
Section 8 — Journalisation
| CIS ID | Contrôle | Méthode | Criticité |
|---|---|---|---|
| 8.1 | Logs d'audit activés | Reports API accessible | Haute |
| 8.2 | Rétention ≥ 1 an | Google Vault ou export SIEM | Haute |
| 8.3 | Alertes sur événements critiques | Alert Center configuration | Haute |
| 8.4 | Export logs vers SIEM | BigQuery, Chronicle, Splunk | Haute |
| 8.5 | Procédure réponse incidents | Processus organisationnel documenté | Haute |
17. Annexes Techniques
Annexe A — Scopes OAuth par module d'audit
| Module | Scopes requis |
|---|---|
| Utilisateurs & IAM | admin.directory.user.readonly, admin.directory.rolemanagement.readonly |
| Gmail forwarding/delegation | gmail.settings.basic (par utilisateur impersonifié) |
| Google Drive | drive.readonly |
| Tokens OAuth | admin.directory.user.security |
| Appareils MDM | admin.directory.device.mobile.readonly |
| Groupes | admin.directory.group.readonly, apps.groups.settings |
| Logs admin/connexion | admin.reports.audit.readonly |
| Alert Center | apps.alerts |
| Calendriers | calendar.readonly (par utilisateur impersonifié) |
Annexe B — Commandes de référence rapide
# Lancer l'audit complet
python -X utf8 run_full_audit.py
# Lancer un module spécifique
python -X utf8 -c "from audit_users import *; print(audit_all_users())"
# Synchroniser l'horloge (Windows)
w32tm /resync /force
# Vérifier DNS manuellement
python -c "import dns.resolver; print(dns.resolver.resolve('cyrias.com','TXT'))"
# Lister les fichiers publics Drive d'un utilisateur
python -X utf8 -c "
from audit_drive import audit_public_files
from auth import get_drive_service
service = get_drive_service('user@domain.com')
print(audit_public_files(service, 'user@domain.com'))
"
Annexe C — Checklist d'audit condensée
Avant l'audit :- [ ] Service Account créé et clé JSON générée
- [ ] APIs GCP activées (Admin SDK, Gmail, Drive, Calendar, Alert Center)
- [ ] Domain-Wide Delegation configurée sans espaces dans les scopes
- [ ] Horloge système synchronisée
- [ ] Environnement Python configuré (PYTHONUTF8=1)
- [ ] Nombre de Super Admins (≤ 4 recommandé)
- [ ] 2FA enrollée et enforced sur tous les comptes
- [ ] Emails de récupération internes ou absents
- [ ] Comptes inactifs > 90 jours identifiés
- [ ] Comptes suspendus avec offboarding documenté
- [ ] Aucun transfert automatique actif
- [ ] Aucune délégation externe
- [ ] Aucun App Password actif
- [ ] Filtres Gmail avec actions de redirection revus
- [ ] Fichiers publics ("anyone with link") inventoriés
- [ ] Partages externes documentés et justifiés
- [ ] Service accounts tiers avec accès Drive identifiés
- [ ] Fichiers sensibles inventoriés (RH, paie, BDD)
- [ ] SPF
-all(hard fail) - [ ] DKIM actif (2048 bits recommandé)
- [ ] DMARC
p=rejectavec reporting - [ ] IP MX non listées sur blacklists
- [ ] Volume de tokens par utilisateur
- [ ] Scopes accordés (Gmail complet, Drive complet = CRITIQUE)
- [ ] Applications AI avec accès données d'entreprise
- [ ] Sous-domaines via crt.sh
- [ ] Serveurs exposés (Shodan)
- [ ] Emails compromis (HIBP)
- [ ] Emails de récupération dans stealer logs
- [ ] Clé Service Account révoquée
- [ ] Délégation domain-wide retirée
- [ ] Rapport livré et discuté
- [ ] Roadmap validée avec le client
Annexe D — Audit Google Chat et Meet
Google Chat est souvent négligé dans les audits alors qu'il constitue un canal de communication sensible et un vecteur de partage de données non maîtrisé.
D.1 Risques spécifiques à Google Chat
| Risque | Description | Gravité |
|---|---|---|
| Espaces publics | Un espace Google Chat ouvert à tous les utilisateurs peut contenir des informations sensibles | 🟠 ÉLEVÉ |
| Bots non autorisés | Des bots OAuth peuvent accéder aux messages et répondre automatiquement | 🔴 CRITIQUE |
| Partage de fichiers hors DLP | Les pièces jointes partagées dans Chat contournent les règles DLP Drive | 🟠 ÉLEVÉ |
| Historique non maîtrisé | Par défaut, l'historique des messages est conservé indéfiniment | 🟡 MOYEN |
| Espaces avec membres externes | Des espaces peuvent être partagés avec des utilisateurs hors domaine | 🟠 ÉLEVÉ |
D.2 Vérifications Chat via admin.google.com
Admin Console → Apps → Google Workspace → Chat
→ Paramètres Chat :
- Autoriser les utilisateurs externes dans les espaces : À restreindre
- Historique par défaut : Configurer la rétention
- Bots : Vérifier la liste des bots autorisés
- Imports de fichiers : Vérifier les types autorisés
D.3 Audit Google Meet
| Contrôle | Paramètre | Risque si non configuré |
|---|---|---|
| Réunions externes | Qui peut rejoindre sans authentification | Participants non autorisés |
| Enregistrement | Où sont stockés les enregistrements | Fuites de réunions confidentielles |
| Transcriptions | Qui peut activer les transcriptions | Données sensibles transcrites et stockées |
| Partage d'écran | Restrictions | Données affichées par erreur enregistrées |
| Lobby (salle d'attente) | Activé ou non | Accès direct sans validation hôte |
---
Annexe E — Intégration SIEM et Monitoring Continu
Un audit ponctuel fournit une photographie de la posture de sécurité à un instant T. Pour une protection continue, il est essentiel d'exporter les logs Google Workspace vers un SIEM.
E.1 Options d'export des logs
| Solution | Mécanisme | Avantages | Inconvénients |
|---|---|---|---|
| Google Chronicle | Export natif Workspace | Intégration native, UEBA inclus | Coût Chronicle |
| BigQuery | Export via Cloud Logging | Flexible, SQL | Pas d'alertes natives |
| Splunk | App Google Workspace for Splunk | Écosystème Splunk | Complexité configuration |
| Microsoft Sentinel | Connecteur Google Workspace | Unifié si hybrid | Latence |
| Elastic SIEM | Logstash Google Workspace | Open source | Maintenance |
| Script Python custom | Reports API en polling | Gratuit, flexible | Pas temps réel |
E.2 Logs prioritaires à collecter
# Applications prioritaires dans l'API Reports
LOG_APPLICATIONS = [
"login", # Connexions : succès, échecs, suspicions
"admin", # Actions admin : droits, configurations
"drive", # Accès fichiers : téléchargements, partages
"gmail", # Actions Gmail : forwarding, délégation
"token", # Autorisations OAuth
"groups_enterprise", # Modifications de groupes
"meet", # Réunions enregistrées, participants externes
"chat", # Messages (si activé)
"calendar", # Partages calendriers, événements sensibles
]
E.3 Règles de détection recommandées
# Exemples de règles SIEM pour Google Workspace
Rule: Super Admin Login Outside Business Hours
Source: login logs
Condition: actor.isAdmin = true AND hour(timestamp) NOT IN (8..20)
Severity: HIGH
Rule: New OAuth Grant with Sensitive Scope
Source: token logs
Condition: scope CONTAINS "mail.google.com" OR scope CONTAINS "auth/drive"
Severity: HIGH
Rule: Gmail Forwarding Activation
Source: admin logs
Condition: eventName = "CHANGE_MAIL_FORWARDING_SETTING"
Severity: CRITICAL
Rule: Multiple Failed Logins
Source: login logs
Condition: eventName = "login_failure" AND COUNT > 5 WITHIN 1 hour
Severity: MEDIUM
Rule: File Shared Publicly
Source: drive logs
Condition: eventName = "change_user_access" AND visibility = "people_with_link"
Severity: HIGH
Rule: Super Admin Role Grant
Source: admin logs
Condition: eventName = "ASSIGN_ROLE" AND role = "SUPER_ADMIN"
Severity: CRITICAL
Rule: Login from New Country
Source: login logs
Condition: country NOT IN user_historical_countries AND eventName = "login_success"
Severity: MEDIUM
E.4 Métriques de maturité SOC pour Workspace
| Maturité | Capacités | Indicateurs |
|---|---|---|
| Niveau 0 | Aucune surveillance | Pas de SIEM, alertes manuelles |
| Niveau 1 | Logs collectés | Rétention > 1 an, accès ponctuel |
| Niveau 2 | Alertes basiques | Alert Center + quelques règles SIEM |
| Niveau 3 | Détection active | Règles UEBA, corrélation inter-sources |
| Niveau 4 | SOC mature | SOAR, réponse automatisée, Threat Hunting |
Annexe F — Politique de Mots de Passe et Authentification Avancée
F.1 Vérification de la politique de mots de passe
La politique de mots de passe Workspace se configure dans admin.google.com → Sécurité → Authentification → Politique de mots de passe. Elle n'est pas accessible via API, mais les paramètres à vérifier manuellement sont :
| Paramètre | Valeur recommandée | CIS |
|---|---|---|
| Longueur minimale | 12 caractères | CIS 1.1.6 |
| Complexité | Activée (majuscule, chiffre, symbole) | Bonne pratique |
| Réutilisation | Bloquer les 10 derniers | Bonne pratique |
| Expiration | Désactivée si MFA fort en place | CIS 1.1.7 |
| Force du mot de passe | Indicateur activé | Informationnel |
MotDePasse2025! → MotDePasse2026!). Avec un MFA résistant au phishing (FIDO2), la résilience vient du second facteur, pas de la rotation du premier.
F.2 Context-Aware Access
Context-Aware Access permet de conditionner l'accès aux services Google à des critères contextuels (localisation géographique, appareil géré, plage horaire).
Cas d'usage recommandés :Politique 1 : Accès admin depuis appareils gérés uniquement
Condition : isAdminUser = true
Exigence : deviceManagementLevel = MANAGED
Action si non conforme : Bloquer
Politique 2 : Restriction géographique
Condition : ALL users
Exigence : country IN [FR, BE, LU, CH, ...pays_autorisés]
Action si non conforme : Bloquer ou MFA supplémentaire
Politique 3 : Accès données sensibles depuis IP de confiance
Condition : Access to Vault or Admin Console
Exigence : ipRange IN [IP_bureau, IP_VPN]
Action si non conforme : Bloquer
Politique 4 : Horaires de bureau pour accès admin
Condition : isAdminUser = true
Exigence : time IN [08:00-20:00 CET] AND dayOfWeek IN [MON-FRI]
Action : MFA supplémentaire hors plage
F.3 Passkeys et FIDO2
Les passkeys remplacent le mot de passe par une paire de clés cryptographiques stockées sur l'appareil. Elles sont résistantes au phishing car liées au domaine lors de la création.
Déploiement progressif recommandé :Phase 1 : Déployer les clés physiques FIDO2 (YubiKey 5 NFC) pour les Super Admins
→ Blocage complet de toute connexion sans clé physique
Phase 2 : Activer les passkeys pour les utilisateurs à haut risque
→ Dirigeants, équipes financières, équipes IT
Phase 3 : Déployer les passkeys à l'ensemble des utilisateurs
→ Migration progressive, support utilisateurs
→ Conserver SMS OTP comme fallback temporaire uniquement
Phase 4 : Désactiver SMS OTP et backup codes comme facteurs principaux
→ Uniquement FIDO2, TOTP app, ou passkey
---
Annexe G — Gestion des Incidents liés à Workspace
G.1 Procédure d'urgence — Compte compromis
DÉTECTION
└── Alerte Google, signalement utilisateur, ou détection SOC
↓
CONFINEMENT IMMÉDIAT (< 15 minutes)
└── 1. Révoquer toutes les sessions actives
Admin Console → Utilisateurs → [compte] → Réinitialiser l'authentification
2. Désactiver le compte temporairement
3. Révoquer tous les tokens OAuth du compte
4. Si Super Admin : retirer les privilèges admin temporairement
↓
INVESTIGATION (< 2 heures)
└── 1. Analyser les logs Login sur 30 jours
2. Identifier les IPs, heures, pays de connexion
3. Vérifier si un forwarding a été activé
4. Vérifier les nouveaux partages Drive créés
5. Vérifier les OAuth grants créés
6. Identifier le vecteur initial (phishing ? credential stuffing ?)
↓
REMEDIATION
└── 1. Réinitialiser le mot de passe via canal sécurisé hors-bande
2. Forcer la reconfiguration de la 2FA
3. Révoquer définitivement les tokens OAuth suspects
4. Supprimer les forwardings créés
5. Vérifier et corriger les partages Drive créés pendant l'incident
↓
NOTIFICATION (si violation RGPD avérée)
└── 1. Évaluer si des données personnelles ont été compromises
2. Si oui : notification CNIL dans les 72h (Art. 33 RGPD)
3. Si risque élevé pour les personnes : notification individuelle (Art. 34)
4. Documenter : nature, volume, catégories de données affectées
↓
RETOUR D'EXPÉRIENCE
└── 1. Rapport post-incident
2. Identification de la cause racine
3. Mesures préventives pour éviter la récurrence
4. Mise à jour de la politique de sécurité
G.2 Indicateurs de Compromission (IoC) spécifiques Workspace
| IoC | Signal | Priorité |
|---|---|---|
| Forwarding Gmail activé vers domaine externe | Log admin CHANGE_MAIL_FORWARDING_SETTING | 🔴 Critique |
| Connexion depuis pays jamais vu | Log login + geoloc | 🔴 Critique |
| Token OAuth accordé à app inconnue | Log token avec clientId inconnu | 🔴 Critique |
| Téléchargement massif Drive | Logs Drive > N fichiers en < 1h | 🔴 Critique |
| Nouveau Super Admin ajouté sans ticket | Log admin ASSIGN_ROLE | 🔴 Critique |
| Réinitialisation 2FA sur compte admin | Alert Center + log admin | 🟠 Élevé |
| Partage "anyone" sur fichier sensible | Log Drive permission change | 🟠 Élevé |
| Service account ajouté au Drive | Permissions Drive type=serviceAccount | 🟠 Élevé |
| Connexion depuis IP Tor ou VPN connu | Log login + threat intel | 🟠 Élevé |
| Volume anormal d'emails envoyés | Reports usage API | 🟡 Moyen |
G.3 Commandes d'urgence — Réponse rapide
# Révoquer toutes les sessions d'un utilisateur (lecture + écriture requise)
def revoke_all_sessions(service, user_email):
"""ATTENTION : Action d'écriture — à utiliser en cas d'incident confirmé."""
service.users().signOut(userKey=user_email).execute()
# Lister les tokens actifs d'un utilisateur (lecture seule)
def list_active_tokens(security_service, user_email):
tokens = security_service.tokens().list(userKey=user_email).execute()
return tokens.get("items", [])
# Vérifier le forwarding actif (lecture seule)
def check_active_forwarding(gmail_service, user_email):
result = gmail_service.users().settings().getAutoForwarding(
userId=user_email
).execute()
return result if result.get("enabled") else None
---
Annexe H — Scoring et Benchmarking
H.1 Grille de scoring détaillée
La pondération ci-dessous reflète l'impact réel des contrôles sur la posture de sécurité :
| Contrôle | Poids | Raison |
|---|---|---|
| 2FA enforced sur tous les comptes | 15 pts | Prévention account takeover massive |
| Aucun transfert Gmail actif | 15 pts | Exfiltration en temps réel |
| Emails récup Super Admins internes | 12 pts | Vecteur takeover compte le plus élevé |
| DMARC p=reject | 10 pts | Protection usurpation identité email |
| Aucun fichier public ("anyone") | 10 pts | Données exposées sans contrôle |
| Gouvernance OAuth (whitelist) | 8 pts | Consent phishing |
| SPF hard fail (-all) | 7 pts | Complémentaire DMARC |
| DKIM 2048 bits | 5 pts | Intégrité emails |
| Groupes sans membres externes | 5 pts | Fuite d'information via groupes |
| Logs 1 an + SIEM | 5 pts | Forensics et détection |
| MDM actif et enforced | 4 pts | Appareils non gérés |
| Context-Aware Access | 4 pts | Contrôle contextuel |
H.2 Comparaison sectorielle
| Secteur | Score moyen observé | Maturité typique |
|---|---|---|
| Finance / Banque | 72/100 | Élevée — régulation stricte |
| Santé | 58/100 | Moyenne — effort RGPD récent |
| ESN / IT | 61/100 | Variable — souvent focalisé technique mais pas gouvernance |
| Industrie | 49/100 | Faible — Workspace outil récent |
| Associations / ONG | 35/100 | Très faible — ressources limitées |
| Startups (< 50 pers.) | 42/100 | Faible — croissance rapide, sécurité en retard |
H.3 Évolution et suivi dans le temps
Un audit unique n'a que peu de valeur sans suivi. Les indicateurs à suivre trimestriellement :
Tableau de bord trimestriel Google Workspace
┌─────────────────────────────────────────────┐
│ Score global de sécurité : [ /100] │
│ Conformité CIS Benchmark : [ % ] │
│ Emails compromis HIBP (domaine) : [ /55 ] │
│ Tokens OAuth non revus (> 90j) : [ # ] │
│ Partages externes actifs : [ # ] │
│ Utilisateurs sans 2FA : [ # ] │
│ Super Admins : [ # ] │
│ Alertes Alert Center (30j) : [ # ] │
│ Fichiers publics ("anyone") : [ # ] │
└─────────────────────────────────────────────┘
Annexe D — Ressources et Références
| Ressource | URL | Usage |
|---|---|---|
| CIS Benchmark Google Workspace | cisecurity.org | Référentiel de contrôles |
| MITRE ATT&CK for Enterprise | attack.mitre.org | Techniques d'attaque |
| Google Admin SDK Docs | developers.google.com | Documentation API |
| HIBP API | haveibeenpwned.com/API | Vérification breaches |
| Have I Been Pwned Domain | haveibeenpwned.com/DomainSearch | Vérification par domaine |
| crt.sh | crt.sh | Certificate Transparency |
| Shodan InternetDB | internetdb.shodan.io | Exposition Internet (gratuit) |
| IntelligenceX | intelx.io | Darknet/leaks |
| ANSSI — Guide sécurité GSuite | ssi.gouv.fr | Recommandations françaises |
| Google Workspace Security Checklist | workspace.google.com/security | Checklist officielle Google |
Annexe E — Modèle de feuille de route
| ID | Action | Priorité | Effort | Impact | Responsable | Délai |
|---|---|---|---|---|---|---|
| R-01 | Désactiver transfert Gmail actif | 🔴 P1 | Faible | Critique | Admin IT | J+0 |
| R-02 | Retirer emails récup externes (stealer logs) | 🔴 P1 | Faible | Critique | Admin IT | J+0 |
| R-03 | Révoquer service accounts Drive externes | 🔴 P1 | Moyen | Critique | DSI | J+2 |
| R-04 | Supprimer fichiers publics | 🔴 P1 | Faible | Élevé | Admin IT | J+3 |
| R-05 | Désactiver forwarding Gmail globalement | 🔴 P1 | Faible | Critique | Admin IT | J+3 |
| R-06 | Réduire Super Admins à 3 max | 🟠 P2 | Moyen | Élevé | RSSI + DSI | J+7 |
| R-07 | SPF -all (hard fail) | 🟠 P2 | Faible | Élevé | Admin IT | J+7 |
| R-08 | Créer comptes admin dédiés | 🟠 P2 | Moyen | Élevé | DSI | J+14 |
| R-09 | Activer approbation OAuth | 🟠 P2 | Moyen | Élevé | Admin IT | J+14 |
| R-10 | Révoquer tokens AI sur comptes sensibles | 🟠 P2 | Faible | Élevé | Admin IT | J+7 |
| R-11 | Assigner owners aux groupes orphelins | 🟡 P3 | Faible | Moyen | Admin IT | J+14 |
| R-12 | Procédure offboarding documentée | 🟡 P3 | Moyen | Moyen | RH + DSI | J+30 |
| R-13 | Déployer YubiKeys pour Super Admins | 🟡 P3 | Élevé | Critique | RSSI | J+45 |
| R-14 | Context-Aware Access (restriction géo) | 🟡 P3 | Élevé | Élevé | Admin IT | J+45 |
| R-15 | Activer Google Vault | 🔵 P4 | Élevé | Moyen | DSI | J+60 |
| R-16 | Configurer export logs SIEM | 🔵 P4 | Élevé | Élevé | SOC | J+90 |
| R-17 | Règles DLP sur données sensibles | 🔵 P4 | Élevé | Élevé | RSSI | J+90 |
| R-18 | Formation sécurité utilisateurs | 🔵 P4 | Moyen | Élevé | RSSI + RH | J+60 |
| R-19 | Revue trimestrielle OAuth | 🔵 P4 | Faible | Moyen | Admin IT | Récurrent |
| R-20 | Audit Drive annuel documenté | 🔵 P4 | Moyen | Moyen | DSI | Récurrent |
---
Conclusion — Vers une Sécurité Google Workspace Durable
L'audit Google Workspace n'est pas une fin en soi : c'est le point de départ d'un programme de sécurité continu. Les organisations qui traitent cet exercice comme une vérification annuelle ponctuelle resteront exposées entre deux audits. Celles qui intègrent les contrôles automatisés, le monitoring continu et la culture de sécurité dans leur ADN réduiront durablement leur surface d'attaque.
Les cinq leviers de la maturité Workspace
1. L'identité comme périmètre de sécurité Dans un monde où les données résident dans le cloud, le périmètre réseau traditionnel n'existe plus. L'identité — et sa protection via 2FA résistant au phishing, Context-Aware Access, et gestion rigoureuse des comptes — est le nouveau périmètre. Investir prioritairement sur l'IAM est le levier à plus fort retour sur investissement. 2. La gouvernance des données avant la technologie Les technologies de protection (DLP, CASB, SIEM) sont efficaces uniquement si la gouvernance des données est en place : qui a accès à quoi, pour quels usages, pour quelle durée. Un Drive mal gouverné avec 200 000 fichiers partagés ne sera pas sécurisé par un outil — il faut d'abord définir et appliquer des politiques. 3. La détection comme complément à la prévention Aucun contrôle préventif n'est infaillible. La capacité à détecter rapidement une compromission — via des logs centralisés, des alertes bien configurées, et des procédures de réponse testées — réduit considérablement l'impact d'un incident. Le délai moyen de détection d'une compromission est encore de plusieurs semaines dans la majorité des organisations. 4. La sensibilisation des utilisateurs La grande majorité des incidents Workspace commence par une action humaine : cliquer sur un lien de phishing, autoriser une app OAuth malveillante, partager un document par erreur. Les contrôles techniques réduisent la surface d'attaque, mais la sensibilisation régulière des utilisateurs — notamment aux simulations de phishing, aux bonnes pratiques de partage Drive et à la reconnaissance des apps OAuth suspectes — reste indispensable. 5. La continuité de l'amélioration La sécurité n'est pas un état stable : le tenant évolue, de nouveaux utilisateurs arrivent, de nouvelles apps sont autorisées, de nouvelles vulnérabilités sont découvertes. Un audit annuel minimum, un monitoring continu des indicateurs clés, et une revue trimestrielle des accès (OAuth, partages Drive, Super Admins) constituent le rythme minimal d'un programme de sécurité Workspace sérieux.Priorités universelles — Quel que soit le tenant
Quelle que soit la taille de l'organisation ou son niveau de maturité initial, trois actions produisent le plus grand effet de protection en un minimum de temps :
1. Enforcer la 2FA sur tous les comptes, sans exception
→ Réduit de 99% le risque d'account takeover par credential stuffing
2. Supprimer ou remplacer par des emails internes
tous les emails de récupération externes sur les comptes admins
→ Élimine le bypass 2FA via récupération de compte
3. Désactiver le transfert automatique de messagerie
et activer une alerte sur toute future activation
→ Stoppe l'exfiltration silencieuse en temps réel
Ces trois contrôles, appliqués en moins d'une heure par un Super Admin, ferment les trois vecteurs d'attaque les plus fréquents et les plus dommageables sur Google Workspace.
---
Guide d'Audit Google Workspace — Version 1.0 — Mars 2026 Rédigé pour les équipes Sécurité et GRC — Reproduction autorisée à des fins internes