Confidentialite¶
Le service documentaire de l'organisation heberge des contenus de sensibilite variable : procedures publiques, guides internes, spécifications confidentielles, informations restreintes. Ce chapitre applique le modèle de classification a la documentation en s'appuyant sur le mécanisme d'isolation par build — chaque niveau de confiance produit un site statique autonome ne contenant physiquement que les pages autorisees.
Rappel du modèle de classification¶
Le modèle distingue quatre niveaux de classification, chacun associe a des exigences spécifiques d'accès et de protection.
| Niveau | Description | Accès | Exemples |
|---|---|---|---|
public | Contenu diffusable sans restriction | Anonyme | Documentation produit, CGU, aide en ligne |
interne | Contenu a usage interne uniquement | Collaborateurs authentifies | Procedures RH, guides operationnels |
confidentiel | Contenu sensible a diffusion restreinte | Groupes nommes, MFA obligatoire | Spécifications techniques, données clients |
restreint | Contenu hautement sensible, besoin d'en connaître | Rôles dédiés, approbation formelle | Plans strategiques, données financieres |
Pour le detail complet du modèle et des zones de confiance associees, voir :
Principe d'isolation par build¶
Un build par niveau¶
Chaque build est un site statique complet et autonome. Il ne contient que les pages correspondant a son niveau de classification et aux niveaux inférieurs. Il n'existe aucun mécanisme de masquage CSS, de contenu cache ou de filtrage a la volee : si une page n'est pas dans le build, son fichier HTML n'existe tout simplement pas sur disque.
| Build servi | Contenu present |
|---|---|
public | Pages public uniquement |
interne | Pages public + pages interne |
confidentiel | Pages public + pages interne + pages confidentiel |
restreint | Toutes les pages (tous niveaux confondus) |
Conséquence de sécurité¶
Cette architecture garantit que même en cas de compromission du serveur, seul le contenu du niveau de build correspondant est expose. Un attaquant qui obtiendrait un accès shell a la machine hebergeant le build interne n'y trouverait aucun fichier issu des pages confidentiel ou restreint.
La separation physique des builds s'applique aussi bien aux fichiers HTML qu'aux assets derives (images, fichiers PDF exportes, fragments de contenu). Le processus de build filtre l'ensemble des ressources selon la valeur du champ classification du front matter de chaque page.
Configuration du filtre de build¶
Dans mkdocs.yml, le plugin de classification lit le front matter de chaque fichier source et exclut les pages dont le niveau depasse celui du build cible :
# mkdocs.yml — exemple pour le build "interne"
plugins:
- classification-filter:
build_level: interne
allowed_levels:
- public
- interne
fail_on_unknown: true # rejet strict des valeurs inconnues
Le parametre fail_on_unknown: true garantit un comportement fail-fast : toute valeur de classification non reconnue provoque l'echec du build avant la génération des fichiers de sortie.
Protection contre les erreurs de marquage¶
Validation stricte des valeurs¶
Le plugin de classification rejette toute valeur classification inconnue au moment du build. Cela empeche des erreurs typographiques silencieuses (par exemple confidentel au lieu de confidentiel) de provoquer une inclusion ou une exclusion non souhaitee d'une page.
Si une page comporte un front matter invalide, le build échoue avec un message explicite :
ERROR - Page 'docs/secrets/plan-strategique.md': unknown classification value 'confidentel'.
Allowed values: public, interne, confidentiel, restreint.
Build aborted.
Valeur par defaut et alerte CI¶
Comportement par defaut
Toute page depourvue de champ classification dans son front matter est considérée comme public. Verifiez systematiquement que ce comportement est intentionnel pour les nouvelles pages.
Pour détecter les pages non marquées, un script de validation peut etre integre a la pipeline CI en complement du build :
#!/bin/bash
# scripts/check-classification.sh
# Liste toutes les pages sans champ 'classification' dans le front matter.
set -euo pipefail
DOCS_DIR="${1:-docs}"
MISSING=0
while IFS= read -r -d '' file; do
if ! grep -q '^classification:' "${file}"; then
echo "WARN: pas de classification dans ${file}"
MISSING=$((MISSING + 1))
fi
done < <(find "${DOCS_DIR}" -name '*.md' -print0)
if [ "${MISSING}" -gt 0 ]; then
echo ""
echo "${MISSING} page(s) sans classification explicite (traitees comme 'public')."
exit 1
fi
echo "Toutes les pages ont une classification explicite."
Ce script peut etre execute en mode informatif (sortie non bloquante) ou en mode strict (exit 1) selon la politique de l'organisation.
Protection du routage¶
Responsabilité du reverse proxy¶
Le routage vers le bon build est une decision serveur, jamais une decision client. Le reverse proxy (Caddy, dans l'architecture décrite en installation) inspecte le token JWT de l'utilisateur, extrait le claim de clearance et achemine la requête vers le répertoire de build correspondant.
Aucune logique de filtrage ne s'effectue côté navigateur. Le client reçoit uniquement les pages du build auquel il est autorise a accéder.
Absence de listing de répertoires¶
Les répertoires de builds sont configures sans listing. Un utilisateur qui tenterait d'accéder à la racine d'un build pour en énumérer les fichiers obtiendra une réponse 403 ou une page d'erreur personnalisee, jamais un index de fichiers.
# Caddyfile — desactiver le listing (valeur par defaut dans Caddy)
file_server {
browse # NE PAS inclure cette directive
}
Protection contre le path traversal¶
Les builds sont heberges dans des répertoires séparés et isoles. Aucun lien symbolique ni chemin relatif ne permet à un utilisateur du build interne d'accéder au contenu de ../confidentiel/ ou ../restreint/. Le reverse proxy normalise les chemins et bloque toute tentative de remontee d'arborescence avant de transmettre la requête au serveur de fichiers.
En-têtes de sécurité¶
Les en-têtes de sécurité HTTP sont appliques a l'ensemble des réponses, quel que soit le build servi. Leur configuration est centralisee dans le Caddyfile décrit en installation :
Content-Security-Policy: limitation des sources de scripts et de stylesX-Frame-Options: DENY: prevention du clickjackingStrict-Transport-Security: imposition du HTTPSX-Content-Type-Options: nosniff: prevention du MIME sniffingReferrer-Policy: no-referrer: protection des informations de navigation
Journalisation des accès¶
Structure d'un événement de log¶
Chaque accès au service documentaire est enregistre avec les informations suivantes :
| Champ | Description |
|---|---|
timestamp | Date et heure ISO 8601 de la requête |
user_id | Identifiant unique de l'utilisateur (claim sub) |
clearance | Niveau de clearance du token JWT |
method | Méthode HTTP (GET, HEAD) |
path | Chemin de la page demandee |
status | Code HTTP retourne |
source_ip | Adresse IP source apres normalisation par le proxy |
user_agent | Chaîne User-Agent (tronquee) |
request_id | Identifiant unique de la requête pour correlation |
Format JSON pour integration SIEM¶
Les logs sont emis en JSON structurée pour faciliter l'ingestion dans un SIEM (ELK, Loki, Splunk, Wazuh) :
{
"timestamp": "2026-04-17T09:14:32.847Z",
"request_id": "a3f2c1d8-7e56-4b90-a123-e4f5d6c7b8a9",
"user_id": "u-8f3a2c1d",
"clearance": "confidentiel",
"method": "GET",
"path": "/architecture/decisions/adr-0042.html",
"status": 200,
"source_ip": "10.10.5.22",
"user_agent": "Mozilla/5.0 (X11; Linux x86_64)",
"response_time_ms": 18
}
Les accès refuses (403) et les tentatives d'accès a des ressources inexistantes (404) sont traces avec le même format, en ajoutant un champ deny_reason lorsque la decision de refus est explicite.
Pour la politique de retention et les procedures d'audit, voir Audit et traçabilité.
Revocation d'accès¶
Procedure de revocation¶
La revocation d'un accès s'effectue dans Keycloak en retirant l'utilisateur du groupe ou en supprimant le claim de clearance correspondant :
- Ouvrir la console d'administration Keycloak
- Naviguer vers Users > selectionner l'utilisateur cible
- Onglet Groups : retirer le groupe correspondant au niveau a revoquer
- Onglet Attributes : supprimer ou modifier le claim
doc_clearancesi applicable - Optionnel : forcer la deconnexion de toutes les sessions actives via Sessions > Logout all sessions
La modification prend effet sur le prochain renouvellement de token JWT. Avec une duree de session courte (voir ci-dessous), l'impact d'un accès residuel est borne dans le temps.
Duree de session recommandee¶
| Niveau | Duree de session recommandee | Duree max absolue |
|---|---|---|
public | Non applicable (accès anonyme) | — |
interne | 60 minutes | 8 heures |
confidentiel | 30 minutes | 2 heures |
restreint | 15 minutes | 1 heure |
Ces valeurs sont configurees dans Keycloak au niveau du realm (parametre SSO Session Max) et peuvent etre affinees par client OIDC.
Validation systematique des tokens¶
Le reverse proxy ne met pas les tokens JWT en cache. Chaque requête fait l'objet d'une validation du token aupres du endpoint d'introspection Keycloak (ou par vérification locale de la signature et des claims si le proxy supporte les JWKS). Cela garantit que la revocation est prise en compte au prochain accès apres expiration du token courant, sans delai supplémentaire lie a un cache proxy.
Modèle de menaces¶
Le tableau suivant recense les menaces principales et les mitigations correspondantes dans l'architecture documentaire.
| Menace | Mitigation |
|---|---|
| Accès non autorise a du contenu | Contenu absent du build servi (isolation physique) |
| Bypass du reverse proxy | Aucun contenu confidentiel dans le build expose, même en accès direct |
| Typo dans le front matter | Build échoue en fail-fast (valeur inconnue rejetee) |
| Page oubliee sans marquage | Defaut public + alerte CI optionnelle via script de validation |
| Token vole ou session detournee | Expiration courte (15-30 min) + journalisation SIEM + revocation rapide |
| Path traversal | Builds isoles dans des répertoires séparés, chemins normalises |
| Compromission du serveur | Seul le contenu du niveau du build est present sur disque |
| Listing de répertoires | Directory browsing desactive, réponse 403 |
| Injection dans les logs | Serialisation JSON stricte, pas d'interpolation de chaînes |
| Exfiltration via copier-coller | Hors perimetre technique — traite par politique d'usage acceptable |
Defense en profondeur
L'isolation par build est la mesure primaire de confidentialite du service documentaire. Elle garantit que le contenu ne peut pas etre expose par une erreur de configuration du proxy, un bug d'autorisation ou une compromission de la couche applicative, puisque les fichiers n'existent tout simplement pas dans les builds de niveau inférieur.
Les autres mesures — validation des tokens, journalisation, en-têtes de sécurité, protection du routage — sont complementaires. Elles reduisent la surface d'attaque, permettent la detection d'incidents et accelerent la revocation, mais elles ne remplacent pas l'isolation physique des contenus.