Tu passes tes soirées à cocher des cases dans un tableur, à ouvrir 15 onglets de la console admin pour vérifier un par un les 86 réglages du benchmark CIS ? Cet outil automatise l'évaluation en quelques minutes, pointe avec précision les failles de configuration et te fournit un plan de remédiation prêt à l'emploi.
Outil d'audit automatisé et interactif qui vérifie la configuration d'un tenant Google Workspace contre les 86 recommandations du CIS Google Workspace Foundations Benchmark v1.4, et génère un rapport détaillé (Google Sheets & WebApp) avec statut, explication du risque, chemin de remédiation et registre des dérogations.
- Fonctionnalités
- Architecture
- Prérequis
- Installation
- Utilisation
- Configuration
- Statuts de contrôle
- Limites connues
- Licence
- Auteur
- 87 contrôles audités : 86 recommandations CIS v1.4 (profils L1 et L2) + 1 contrôle bonus (politique de nommage des comptes super admin).
- Deux modes d'exécution :
- WebApp progressive (Material Design 3) : restitution contrôle par contrôle en temps réel, chronomètre, journal d'exécution et indicateurs dynamiques.
- Mode batch : exécution directe et génération immédiate du classeur Google Sheets de synthèse.
- Résilience & Haute performance : traitement par lots parallèles, backoff exponentiel avec disjoncteur, protection anti-veille navigateur et gestion intelligente des quotas API (HTTP 429).
- Plan d'actions & Gestion des risques : registre des dérogations (acceptation formelle d'écarts avec recalcule du score résiduel) et explications contextuelles des risques.
- Restitution multi-canal : export Sheets structuré et envoi du rapport de synthèse par e-mail.
Apps Script partage une portée globale entre les fichiers et remonte les déclarations de fonction, mais pas les constantes de premier niveau. La numérotation fixe donc l'ordre de chargement, que clasp push respecte en poussant par ordre alphabétique.
| Fichier | Rôle |
|---|---|
00_Config.gs |
CONFIG, STATUT |
01_I18n.gs |
Traductions serveur et référentiel des risques (FR/EN côte à côte) |
02_Securite.gs |
Contrôle d'accès super admin, verrou, journal d'audit |
03_Cache.gs |
Persistance de session : contexte et résultats |
04_Policy.gs |
Lecture et évaluation des politiques, périmètre par périmètre |
05_Dns.gs |
SPF / DKIM / DMARC via DNS-over-HTTPS |
06_Derogations.gs |
Registre d'acceptation formelle des écarts |
07_Controles.gs |
Définition des 87 contrôles |
08_Collecte.gs |
Collecte du contexte, par étapes |
09_WebApp.gs |
Points d'entrée : application web progressive et mode batch |
10_Rapport.gs |
Génération du classeur Google Sheets |
11_Email.gs |
Envoi de la synthèse par e-mail |
Index.html |
Interface de l'application web |
tests/ |
Harnais Node sans dépendance — npm test |
L'outil interroge 4 sources de données complémentaires pour auditer le tenant :
| Source | Usage |
|---|---|
| Cloud Identity Policy API | Lecture des politiques de sécurité de la console admin (Drive, Gmail, Agenda, Chat, Marketplace, 2SV, sessions…). |
| Admin SDK Directory API | Analyse des super administrateurs, déploiement du 2SV par utilisateur, domaines, jetons OAuth tiers et unités organisationnelles (libellés des périmètres évalués). |
| Groups Settings API | Analyse des règles de confidentialité et permissions de partage des groupes de discussion. |
| DNS public (dns.google) | Vérification en direct des enregistrements SPF, DKIM et DMARC de chaque domaine du tenant. |
- Compte Super Administrateur Google Workspace (obligatoire pour interroger la Policy API).
- Projet Google Cloud Platform (GCP) standard associé au script Apps Script, avec les API suivantes activées :
- Cloud Identity API
- Admin SDK API
- Groups Settings API
- Services avancés Google Apps Script activés dans l'éditeur :
AdminDirectoryGroupsSettings
- Manifeste
appsscript.jsonconfiguré avec les scopes OAuth stricts nécessaires.
⚠️ Mise à jour depuis une version antérieure à 5.2.0 : le scopeadmin.directory.orgunit.readonlya été ajouté pour nommer les unités organisationnelles dans les constats. Après le déploiement, la première ouverture de l'application demandera une nouvelle autorisation.
- Connectez-vous à script.google.com avec votre compte super administrateur.
- Créez un nouveau projet (ex:
Audit CIS Google Workspace). - Copiez chacun des fichiers
.gsdu dépôt dans un fichier du même nom (sans l'extension) :00_Config,01_I18n,02_Securite,03_Cache,04_Policy,05_Dns,06_Derogations,07_Controles,08_Collecte,09_WebApp,10_Rapport,11_Email. - Créez un fichier HTML nommé
Index.htmlet collez-y le contenu deIndex.html.
💡 Plus simple avec clasp :
clasp clone <scriptId>puisclasp push— la numérotation des fichiers fixe l'ordre de chargement, que clasp respecte en poussant par ordre alphabétique.
- Dans l'éditeur Apps Script, ouvrez les Paramètres du projet (⚙️).
- Dans la section Projet Google Cloud Platform (GCP), cliquez sur Modifier le projet et indiquez le numéro de votre projet GCP standard.
- Dans la console Google Cloud de ce projet, activez les API :
Cloud Identity APIAdmin SDK APIGroups Settings API
- Dans l'éditeur Apps Script, cliquez sur le + à côté de Services.
- Activez Admin SDK API (identifiant :
AdminDirectory). - Activez Groups Settings API (identifiant :
GroupsSettings).
- Cliquez sur Déployer > Nouveau déploiement.
- Type : Application Web.
- Exécuter en tant que : Utilisateur accédant à l'application web.
- Qui a accès : Tous les utilisateurs du domaine (ou restreindre aux administrateurs).
- Cliquez sur Déployer et conservez l'URL générée.
- Ouvrez l'URL de déploiement dans votre navigateur.
- (Optionnel) Cochez l'option « Groupes détaillés » pour interroger individuellement la Groups Settings API sur chaque groupe.
- Cliquez sur Lancer l'audit.
- Suivez l'avancement en direct jusqu'à l'ouverture automatique du rapport Google Sheets créé dans votre Google Drive.
Exécutez directement la fonction lancerAuditCIS() depuis l'éditeur de script Apps Script. Le rapport Sheets complet sera créé sans passer par l'interface WebApp.
Les paramètres d'exécution peuvent être ajustés dans l'objet CONFIG au début de Code.gs :
| Clé | Valeur par défaut | Description |
|---|---|---|
VERSION |
5.8.1 |
Version de l'application (affichée dans l'UI et le rapport). |
DOMAINES_DESTINATAIRES |
[] |
Domaines autorisés en plus de ceux du tenant pour l'envoi du rapport par e-mail. Vide = diffusion interne uniquement. |
PAGES_PAR_APPEL |
4 |
Pages d'API lues au maximum par appel serveur (écarte la limite des 6 minutes). |
GROUPES_DETAILLES_BATCH |
false |
Mode batch : lire les réglages groupe par groupe. Désactivé par défaut — à 2 500 groupes la boucle dépasse les 6 minutes. |
BUDGET_GROUPES_MS |
180000 |
Budget de cette lecture détaillée quand elle est activée. Au-delà, arrêt propre et troncature signalée. |
DOMAINES_PAR_APPEL |
3 |
Domaines résolus par appel serveur lors de la pré-collecte DNS. |
NIVEAU_PROFIL |
'L2' |
'L1' pour les contrôles de base, 'L2' pour les profils renforcés L1 + L2. |
MAX_UTILISATEURS |
12000 |
Plafond d'utilisateurs audités pour les vérifications individuelles (2SV, tokens). |
MAX_GROUPES |
3000 |
Plafond de groupes audités via la Groups Settings API. |
GROUPES_PAR_APPEL |
40 |
Taille des lots pour la collecte asynchrone des groupes. |
POLITIQUES_CACHE_MIN |
60 |
Durée de mise en cache locale des politiques Cloud Identity (évite les quotas 429). |
SELECTEURS_DKIM |
['google', 'default', ...] |
Sélecteurs DKIM testés automatiquement sur chaque domaine. |
| Statut | Libellé | Signification |
|---|---|---|
| ✅ | CONFORME | Réglage strictement conforme à la recommandation CIS. |
| ❌ | NON CONFORME | Écart de sécurité détecté nécessitant remédiation. |
| 🔍 | À VÉRIFIER | Résultat partiel ou ambigu nécessitant une confirmation humaine. |
| 📋 | MANUEL | Contrôle non exposé par les API Google — procédure console documentée. |
| ERREUR | Incident technique lors de l'interrogation de l'API. | |
| ⏭️ | HORS PROFIL | Contrôle L2 ignoré lors d'un audit ciblé profil L1. |
| 🤝 | ÉCART ACCEPTÉ | Dérogation validée et tracée dans le registre des dérogations. |
npm test # 83 tests, aucune dépendance requise
npm run lint # ESLint (npm install au préalable)| Fichier | Couvre |
|---|---|
tests/perimetres.test.js |
Moteur d'évaluation par unité organisationnelle |
tests/i18n.test.js |
Cohérence bilingue FR/EN, détection des copier-collés de remédiation |
tests/controles.test.js |
Exécution des 87 contrôles, référence figée des verdicts |
tests/manifeste.test.js |
Scopes OAuth, services avancés, modèle de déploiement |
tests/contexte.test.js |
Persistance de session, recensement des super administrateurs |
tests/rapport.test.js |
Restitution Sheets : mise en forme, couverture, journal |
tests/collecte.test.js |
Pré-collecte DNS, garde-fous du mode batch, réessais sur quota |
Les tests chargent le code Apps Script dans Node en doublant les services Google : aucun appel réseau, aucune API Google sollicitée. Voir CONTRIBUTING.md pour l'ajout d'un contrôle et la checklist de publication, et SECURITY.md pour le modèle de sécurité.
Un outil de conformité vaut par la lucidité sur ce qu'il ne couvre pas. Les limites actuelles :
- Héritage des unités organisationnelles. Tous les périmètres où un réglage est explicitement défini sont évalués et le pire statut l'emporte — un réglage permissif sur une UO fille rend le contrôle
NON CONFORME, et l'UO est nommée dans le constat. Depuis la 5.5.0, lorsqu'aucune politique ne cible la racine, le défaut Google hérité par le reste du tenant est évalué comme un périmètre à part entière. Si la table des unités organisationnelles n'a pas pu être collectée, ce périmètre hérité resteÀ VÉRIFIERplutôt que tranché sur une hypothèse invérifiable. - Correspondance des champs de la Policy API. Les noms de champs sont résolus par une liste d'alias. Si Google fait évoluer le schéma, le contrôle remonte
À VÉRIFIERplutôt qu'un verdict erroné — mais il faut alors mettre l'outil à jour. - 16 contrôles sur 87 restent manuels, faute d'exposition par les API Google (règles d'alerte, quarantaines, etc.).
- Accès super administrateur obligatoire. Depuis la version 5.1.0, toutes les fonctions exposées le vérifient côté serveur.
- Le document PDF officiel du CIS fait foi pour toute interprétation d'une recommandation.
Ce projet est sous licence MIT.
- Développeur : Fabrice Faucheux — https://faucheux.bzh
- Référentiel de sécurité : Center for Internet Security® (CIS)
Outil indépendant d'aide à l'évaluation, non affilié officiellement au Center for Internet Security®. Le document PDF officiel fait foi pour toute interprétation des recommandations.
Tired of spending evenings checking boxes in spreadsheets and juggling 15 admin console tabs just to verify the 86 CIS benchmark settings? This tool automates the assessment in minutes, highlights exact misconfigurations, and provides an actionable remediation plan.
Automated and interactive audit tool that checks your Google Workspace tenant configuration against the 86 recommendations from the CIS Google Workspace Foundations Benchmark v1.4, generating a detailed report (Google Sheets & WebApp) with status, risk rationale, remediation steps, and deviation tracking.
- Features
- Architecture
- Prerequisites
- Installation
- Usage
- Configuration
- Control Statuses
- Known limitations
- License
- Author
- 87 controls audited: 86 CIS v1.4 recommendations (L1 and L2 levels) + 1 bonus check (super admin account naming convention).
- Dual execution mode:
- Progressive WebApp (Material Design 3): Real-time control-by-control feedback, timer, execution log, and dynamic progress bar.
- Batch mode: Direct server-side execution and immediate Google Sheets generation.
- Resilience & High performance: Parallel batch processing, exponential backoff with circuit breaker, browser anti-sleep lock, and API quota management (HTTP 429).
- Risk Management & Action Plan: Deviation register (formal risk acceptance with residual score calculation) and contextual risk explanations.
- Multi-channel reporting: Structured Sheets export and automated email summary.
Apps Script shares one global scope across files and hoists function declarations, but not top-level constants. The numeric prefixes therefore pin the load order, which clasp push honours by pushing alphabetically. See the French table above for the file-by-file breakdown; tests/ holds a dependency-free Node harness (node tests/perimetres.test.js, node tests/i18n.test.js).
The tool queries 4 complementary data sources:
| Source | Purpose |
|---|---|
| Cloud Identity Policy API | Read security policies across the Admin console (Drive, Gmail, Calendar, Chat, Marketplace, 2SV, sessions…). |
| Admin SDK Directory API | Super admin accounts, user-level 2SV enforcement, domain inventory, OAuth third-party tokens, and organizational units (labels for the evaluated scopes). |
| Groups Settings API | Group privacy configurations and sharing permissions. |
| Public DNS (dns.google) | Live validation of SPF, DKIM, and DMARC records for all verified domains. |
- Google Workspace Super Admin account (mandatory for Policy API access).
- Standard Google Cloud Platform (GCP) project linked to the Apps Script project with the following APIs enabled:
- Cloud Identity API
- Admin SDK API
- Groups Settings API
- Advanced Services enabled in the Apps Script project:
AdminDirectoryGroupsSettings
appsscript.jsonmanifest configured with minimal OAuth scopes.
⚠️ Upgrading from a version older than 5.2.0: theadmin.directory.orgunit.readonlyscope was added so findings can name organizational units. After deploying, the first launch will prompt for re-authorization.
- Log in to script.google.com with your Super Admin account.
- Create a new project (e.g.,
CIS Google Workspace Audit). - Copy each
.gsfile from the repository into a file of the same name (without the extension):00_Config,01_I18n,02_Securite,03_Cache,04_Policy,05_Dns,06_Derogations,07_Controles,08_Collecte,09_WebApp,10_Rapport,11_Email. - Create an HTML file named
Index.htmland paste the content fromIndex.html.
💡 Easier with clasp:
clasp clone <scriptId>thenclasp push— the numeric filename prefixes pin the load order, which clasp honours by pushing alphabetically.
- In the Apps Script editor, open Project Settings (⚙️).
- Under Google Cloud Platform (GCP) Project, click Change Project and enter your standard GCP project number.
- In the Google Cloud Console for that project, enable:
Cloud Identity APIAdmin SDK APIGroups Settings API
- In the Apps Script editor, click + next to Services.
- Enable Admin SDK API (Identifier:
AdminDirectory). - Enable Groups Settings API (Identifier:
GroupsSettings).
- Click Deploy > New deployment.
- Select type: Web app.
- Execute as: User accessing the web app.
- Who has access: Anyone within domain (or restrict to admins).
- Click Deploy and save the web app URL.
- Open the deployment URL in your browser.
- (Optional) Check "Detailed groups" to inspect each group's privacy settings via Groups Settings API.
- Click Start Audit.
- Monitor progress until the Google Sheets report automatically opens.
Execute lancerAuditCIS() directly from the Apps Script editor.
Key settings can be updated in CONFIG in Code.gs:
| Key | Default | Description |
|---|---|---|
VERSION |
5.8.1 |
Application version. |
DOMAINES_DESTINATAIRES |
[] |
Domains allowed in addition to the tenant's own for emailing the report. Empty = internal distribution only. |
PAGES_PAR_APPEL |
4 |
Maximum API pages read per server call (keeps each call clear of the 6-minute limit). |
NIVEAU_PROFIL |
'L2' |
'L1' for Level 1 only, 'L2' for full Level 1 + Level 2 audit. |
MAX_UTILISATEURS |
12000 |
Max users analyzed for per-user checks. |
MAX_GROUPES |
3000 |
Max groups audited via Groups Settings API. |
GROUPES_PAR_APPEL |
40 |
Batch chunk size for asynchronous group queries. |
POLITIQUES_CACHE_MIN |
60 |
Cloud Identity policy cache TTL in minutes. |
SELECTEURS_DKIM |
['google', 'default', ...] |
DKIM selectors checked per domain. |
| Status | Code | Meaning |
|---|---|---|
| ✅ | CONFORME | Compliant with CIS recommendation. |
| ❌ | NON CONFORME | Non-compliant — requires remediation. |
| 🔍 | À VÉRIFIER | Partial or ambiguous result — manual review advised. |
| 📋 | MANUEL | Non-API setting — manual review required. |
| ERREUR | Technical failure during check execution. | |
| ⏭️ | HORS PROFIL | Level 2 control skipped during Level 1 audit. |
| 🤝 | ÉCART ACCEPTÉ | Risk formally accepted in deviation register. |
A compliance tool is only as good as its honesty about what it does not cover. Current limitations:
- Organizational unit inheritance. Every scope where a setting is explicitly defined is evaluated and the worst status wins — a permissive setting on a child OU makes the control
NON CONFORME, and the OU is named in the finding. Since 5.5.0, when no policy targets the root, the Google default inherited by the rest of the tenant is evaluated as a scope in its own right. If the organizational-unit table could not be collected, that inherited scope staysÀ VÉRIFIERrather than being decided on an unverifiable assumption. - Policy API field mapping. Field names are resolved through an alias list. If Google changes the schema, the control reports
À VÉRIFIERrather than a wrong verdict — but the tool then needs updating. - 16 of the 87 controls remain manual, as they are not exposed by Google APIs (alert rules, quarantines, etc.).
- Super Admin access is mandatory. Since version 5.1.0 every exposed function enforces this server-side.
- The official CIS PDF is authoritative for interpreting any recommendation.
This project is licensed under the MIT License.
- Developer: Fabrice Faucheux — https://faucheux.bzh
- Security Benchmark: Center for Internet Security® (CIS)
Independent evaluation tool, not officially affiliated with the Center for Internet Security®. Official CIS documentation remains the authoritative reference.