Exemple d'utilisation de Presidio et tests.
Presidio est un framework open source personnalisable pour la détection et l'anonymisation des données personnelles.
Configurer des listes d'autorisation et de blocage.
Exemple rendu :
Sélectionnez la manipulation à appliquer au texte après l'identification des données personnelles.
Masquer : Supprimer complètement les données personnelles.Remplacer : Remplacer les données personnelles par une constante, par exemple <PERSON>.Synthétiser : Remplacer par des valeurs fictives (nécessite une clé OpenAI).Surligner : Afficher le texte original avec les données personnelles surlignées en couleur.Masquer : Remplacer un nombre de caractères par un astérisque (ou un autre caractère de masque).Hacher : Remplacer par le hachage des données personnelles.Chiffrer : Remplacer par un chiffrement AES des données personnelles, permettant ainsi une restauration.
Détails des textes dans les fenêtres ci-dessus :
Here are a few example sentences we currently support:
Hi, my name is David Johnson and I'm originally from Liverpool.My credit card number is 4095-2609-9393-4932 and my crypto wallet id is 16Yeky6GMjeNkAiNcBY7ZhrLoMSgg1BoyZ.On 11/10/2024 I visited www.microsoft.com and sent an email to test@presidio.site, from IP 192.168.0.1.My passport: 191280342 and my phone number: (212) 555-1234.This is a valid International Bank Account Number: IL150120690000003111111 . Can you please check the status on bank account 954567876544?Kate's social security number is 078-05-1126. Her driver license? it is 1234567A.
Here are a few example sentences we currently support:
Hi, my name is <PERSON> and I'm originally from <LOCATION>.My credit card number is <CREDIT_CARD> and my crypto wallet id is <CRYPTO>.On 11/10/2024 I visited www.microsoft.com and sent an email to <EMAIL_ADDRESS>, from IP <IP_ADDRESS>.My passport: 191280342 and my phone number: (212) 555-1234.This is a valid International Bank Account Number: <IBAN_CODE> . Can you please check the status on bank account 954567876544?<PERSON>'s social security number is 078-05-1126. Her driver license? it is 1234567A.
Source
Échantillons :
| Sujet | Type de données | Ressource | Exemple |
|---|
PII, PHI et Microsoft Presidio, un guide complet en français.
1. Vocabulaire fondamental : PII, PHI, PCI
Trois acronymes structurent la protection des données dans les systèmes d'IA :
PII (Personally Identifiable Information) — Données à caractère personnel au sens du RGPD. Toute information permettant d'identifier directement ou indirectement une personne physique : nom, prénom, adresse email, numéro de téléphone, adresse postale, numéro de sécurité sociale, numéro de passeport, adresse IP, données de localisation, etc.
PHI (Protected Health Information) — Sous-catégorie américaine (HIPAA) des données de santé protégées. En droit européen, ces données relèvent de l'article 9 du RGPD (données sensibles à protection renforcée) : diagnostic médical, antécédents, ordonnances, résultats d'analyses, numéro de patient, etc. Leur traitement exige une base légale spécifique et des garanties techniques renforcées.
PCI-DSS (Payment Card Industry Data Security Standard) — Données de cartes de paiement : numéros de carte, CVV, dates d'expiration. Soumises à un cadre de sécurité sectoriel strict.
Ces trois catégories forment le cœur de ce que Presidio détecte et anonymise dans vos pipelines IA.
2. Microsoft Presidio — Le framework de référence
Presidio est un framework open source Microsoft conçu pour détecter, anonymiser et pseudonymiser les données sensibles dans des textes, images et documents. Il s'intègre parfaitement dans une architecture UGAIA/souveraineté car il tourne 100% en local, sans envoi vers un cloud externe.
Architecture modulaire de Presidio
Presidio se compose de quatre services principaux :
presidio-analyzer (port 5002) — Moteur de détection : il identifie les entités sensibles via des règles regex, des modèles NLP (spaCy), du machine learning et des recognizers contextuels. Il retourne un score de confiance pour chaque entité détectée (entre 0 et 1).
presidio-anonymizer (port 5001) — Moteur de transformation : il applique les opérations de protection sur le texte brut selon les résultats de l'analyzer. Il supporte plusieurs modes : mask (***), redact (suppression), replace (substitution), hash (SHA256), encrypt (AES) et FPE (format-preserving encryption).
presidio-image-redactor — Caviardage d'images via OCR + Tesseract, utile pour les documents scannés et les captures d'écran contenant des PII.
presidio-ocr — Pipeline complet pour les PDF : extraction OCR puis passage dans l'analyzer/anonymizer.
Installation Docker (testée et validée)
# Téléchargement des images officiellesdocker pull mcr.microsoft.com/presidio-analyzerdocker pull mcr.microsoft.com/presidio-anonymizer# Lancement des conteneursdocker run -d -p 5002:3000 mcr.microsoft.com/presidio-analyzer:latestdocker run -d -p 5001:3000 mcr.microsoft.com/presidio-anonymizer:latest# Vérificationdocker pscurl http://localhost:5002/analyzecurl http://localhost:5001/anonymize
Pour un usage professionnel DSI/DPO/RSSI, la variante recommandée fixe les versions et isole le réseau :
docker network create presidio-netdocker run -d --name presidio-analyzer \--network presidio-net \-p 5002:3000 \mcr.microsoft.com/presidio-analyzer:1.0.0docker run -d --name presidio-anonymizer \--network presidio-net \-p 5001:3000 \mcr.microsoft.com/presidio-anonymizer:1.0.0
3. Intégration dans un pipeline Ollama + Presidio
L'architecture "Gouvernance augmentée" repose sur une séparation nette des rôles :
| Composant | Rôle | Caractéristique |
|---|---|---|
| Presidio | Détection et anonymisation PII/PHI/PCI | Déterministe, traçable, RGPD-compliant |
| Ollama (Phi-4/Mistral) | Analyse sémantique et gouvernance | Contextuel, non déterministe — à encadrer |
| PowerShell/Python | Orchestration et audit | Reproductible, scriptable |
Le flux en 5 étapes
Étape 1 — Ingestion : le document brut (TXT, DOCX, PDF après OCR) entre dans le pipeline.
Étape 2 — Détection Presidio : appel à l'API analyzer pour identifier toutes les entités PII/PHI/PCI avec leur position, type et score de confiance. Résultat : un JSON structuré.
Étape 3 — Anonymisation Presidio : appel à l'anonymizer avec le texte brut et les résultats de détection. Résultat : un texte propre où toutes les données sensibles sont masquées ou pseudonymisées.
Étape 4 — Analyse sémantique Ollama : le LLM local reçoit uniquement le texte anonymisé (jamais les données brutes) plus un résumé des entités détectées. Il produit une classification de sensibilité, une évaluation des risques et des recommandations de gouvernance pour DPO/RSSI/COMEX.
Étape 5 — Sortie : trois artefacts sont générés : le document anonymisé, l'audit JSON horodaté (hash SHA256, versions des modèles, entités détectées), et le rapport de gouvernance en Markdown.
Exemple d'appel Python
import requests# Appel Presidio Analyzeranalyze_response = requests.post("http://localhost:5002/analyze",json={"text": "Jean Dupont, IBAN FR76 1234 5678, tél. 06 12 34 56 78","language": "fr"})entities = analyze_response.json()# Appel Presidio Anonymizeranonymize_response = requests.post("http://localhost:5001/anonymize",json={"text": "Jean Dupont, IBAN FR76 1234 5678, tél. 06 12 34 56 78","analyzer_results": entities})clean_text = anonymize_response.json()["text"]# Résultat : "<PERSON>, IBAN <IBAN_CODE>, tél. <PHONE_NUMBER>"# Appel Ollama (Phi-4 ou Mistral)ollama_response = requests.post("http://localhost:11434/api/generate",json={"model": "phi4","prompt": f"Analyse de gouvernance du document suivant : {clean_text}\n"f"Entités détectées : {entities}\n"f"Fournis une classification de sensibilité et des recommandations RGPD.","stream": False})governance_report = ollama_response.json()["response"]
4. Matrice de criticité des entités (pour le scoring UGAIA)
| Entité | Criticité | Réglementation | Action Presidio |
|---|---|---|---|
| 1 | RGPD art. 4 | Mask | |
| Téléphone | 2 | RGPD art. 4 | Mask |
| Adresse | 2 | RGPD art. 4 | Redact |
| Nom complet | 3 | RGPD art. 4 | Pseudonymiser |
| NIR (sécu) | 4 | RGPD art. 9 | Hash/Encrypt |
| IBAN | 4 | PCI-DSS | Encrypt |
| Données santé | 5 | RGPD art. 9 | Encrypt + accès restreint |
| Carte bancaire | 5 | PCI-DSS | FPE |
Ce score de criticité alimentera directement le Score de Résilience UGAIA (composante Data Classification) dans votre framework de gouvernance.
5. Avantages pour UGAIA et la souveraineté numérique
Presidio + Ollama constitue une brique essentielle du pipeline de conformité UGAIA pour plusieurs raisons : aucune donnée ne sort du périmètre maîtrisé (déploiement on-premise Docker), la traçabilité est complète avec hash SHA256 et versionnage des modèles.
Le LLM n'accède jamais aux données brutes ce qui respecte le principe de minimisation du RGPD, et la solution est auditée et vérifiable par les DPO/RSSI sans dépendance à un fournisseur cloud externe.
C'est exactement le type d'architecture qui permet d'atteindre le niveau SOUVERAIN+ dans le scoring UGAIA (≥80 points), notamment sur les composantes "Traçabilité" et "Classification des données" (N1-N4).
Mon Blog documente une installation réussie avec détection de numéro de téléphone validée. L'étape suivante naturelle serait d'ajouter le modèle spaCy français (fr_core_news_lg) pour améliorer la détection des entités francophones, et d'intégrer des recognizers custom pour les identifiants spécifiques au contexte français (NIR, SIRET, numéros de permis).
Intégration de Grafana et Open WebUI dans l'architecture UGAIA + Presidio
Mon Architecture existante (Ollama + Presidio + Promtail + Loki) est déjà à 73/100 dans le scoring UGAIA. L'intégration correcte de Grafana et Open WebUI, avec les sécurisations nécessaires, vous permet d'atteindre ≥85/100 — niveau SOUVERAIN+, et donc l'éligibilité aux produits d'assurance UGAIA.
La règle fondamentale de cette architecture : Open WebUI est le seul point d'entrée des utilisateurs (port 3000), Grafana est réservé aux administrateurs (port 3001).
Tous les autres ports (Ollama 11434, Loki 3100, Presidio 5001/5002) restent strictement internes au réseau Docker.
1. Architecture cible — Vue d'ensemble.
2. docker-compose.yml complet et sécurisé.
version: '3.8'
networks:
ai_network:
driver: bridge
internal: false # Permet l'accès internet pour les mises à jour
ipam:
config:
- subnet: 172.20.0.0/16
volumes:
ollama_data:
loki_data:
driver: local
driver_opts:
type: none
device: /data/loki # Monter sur un volume chiffré LUKS
o: bind
open_webui_data:
grafana_data:
presidio_data:
services:
# ─── COUCHE L1 : INTERFACE UTILISATEUR ─────────────────────────────
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
networks: [ai_network]
ports:
- "3000:8080" # SEUL port exposé aux utilisateurs
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_AUTH=true # Authentification obligatoire
- WEBUI_SECRET_KEY=${SECRET_KEY} # À définir dans .env
- DEFAULT_USER_ROLE=user # RBAC : rôle minimal par défaut
- ENABLE_SIGNUP=false # Désactiver l'auto-inscription
- WEBUI_NAME=UGAIA IA Souveraine
# Intégration Presidio via pipeline
- PRESIDIO_ANALYZER_URL=http://presidio-analyzer:3000
volumes:
- open_webui_data:/app/backend/data
depends_on:
ollama:
condition: service_healthy
presidio-analyzer:
condition: service_started
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
# ─── COUCHE L2 : INFÉRENCE SOUVERAINE ──────────────────────────────
ollama:
image: ollama/ollama:latest
container_name: ollama
networks: [ai_network]
# CRITIQUE : PAS de port exposé vers l'hôte
volumes:
- ollama_data:/root/.ollama
environment:
- OLLAMA_KEEP_ALIVE=24h
- OLLAMA_NUM_PARALLEL=2
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
interval: 30s
timeout: 10s
retries: 5
restart: unless-stopped
# ─── COUCHE L3 : ANONYMISATION PII (Presidio) ───────────────────────
presidio-analyzer:
image: mcr.microsoft.com/presidio-analyzer:latest
container_name: presidio-analyzer
networks: [ai_network]
# PAS de port exposé — uniquement accessible depuis Open WebUI
restart: unless-stopped
presidio-anonymizer:
image: mcr.microsoft.com/presidio-anonymizer:latest
container_name: presidio-anonymizer
networks: [ai_network]
restart: unless-stopped
# ─── COUCHE L4 : COLLECTE LOGS + PII SCRUBBING ─────────────────────
promtail:
image: grafana/promtail:latest
container_name: promtail
networks: [ai_network]
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/docker:ro
- ./config/promtail-config.yaml:/etc/promtail/config.yaml:ro
depends_on: [loki]
restart: unless-stopped
loki:
image: grafana/loki:latest
container_name: loki
networks: [ai_network]
# CRITIQUE : PAS de port 3100 exposé vers l'hôte
volumes:
- loki_data:/loki
- ./config/loki-config.yaml:/etc/loki/local-config.yaml:ro
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3100/ready"]
interval: 30s
timeout: 10s
retries: 5
restart: unless-stopped
# ─── COUCHE L5 : MONITORING & DASHBOARD UGAIA ──────────────────────
grafana:
image: grafana/grafana:latest
container_name: grafana
networks: [ai_network]
ports:
- "3001:3000" # Accès ADMIN uniquement — restreindre par IP si possible
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
- GF_SECURITY_DISABLE_GRAVATAR=true
- GF_ANALYTICS_REPORTING_ENABLED=false # Pas de telemetrie externe
- GF_ANALYTICS_CHECK_FOR_UPDATES=false
- GF_SERVER_DOMAIN=localhost
- GF_AUTH_ANONYMOUS_ENABLED=false
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana_data:/var/lib/grafana
- ./config/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro
- ./config/grafana/datasources:/etc/grafana/provisioning/datasources:ro
depends_on:
loki:
condition: service_healthy
restart: unless-stopped
3. Configuration Promtail avec PII Scrubbing (RGPD Art. 25).
C'est la pièce maîtresse de conformité. Sans ce filtre, des données personnelles transitent vers Loki en clair. Fichier config/promtail-config.yaml :
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: ollama-containers
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: [__meta_docker_container_name]
target_label: container
- source_labels: [__meta_docker_container_image]
target_label: image
# ─── PIPELINE PII SCRUBBING ────────────────────────────────────
pipeline_stages:
# 1. Parser les logs JSON d'Ollama
- json:
expressions:
prompt: prompt
model: model
duration: total_duration
# 2. Masquer emails
- replace:
expression: '([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})'
replace: '[EMAIL_REDACTED]'
# 3. Masquer numéros de téléphone français
- replace:
expression: '(\+33|0)[1-9]([0-9]{8})'
replace: '[PHONE_REDACTED]'
# 4. Masquer IBAN
- replace:
expression: '[A-Z]{2}[0-9]{2}[A-Z0-9]{4}[0-9]{7}([A-Z0-9]?){0,16}'
replace: '[IBAN_REDACTED]'
# 5. Masquer NIR (numéro sécurité sociale)
- replace:
expression: '[12][0-9]{2}(0[1-9]|1[0-2])[0-9]{8}[0-9]{2}'
replace: '[NIR_REDACTED]'
# 6. Labels pour requêtes LogQL dans Grafana
- labels:
model:
container:
# 7. Timestamp
- timestamp:
source: time
format: RFC3339Nano
4. Configuration Loki avec rétention RGPD.
Fichier config/loki-config.yaml :
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
schema_config:
configs:
- from: 2024-01-01
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /loki/boltdb-shipper-active
cache_location: /loki/boltdb-shipper-cache
shared_store: filesystem
filesystem:
directory: /loki/chunks
# ─── RÉTENTION RGPD Art. 5e ─────────────────────────────────────────
limits_config:
retention_period: 720h # 30 jours maximum (adapter selon politique DPO)
ingestion_rate_mb: 4
max_query_series: 500
compactor:
working_directory: /loki/compactor
shared_store: filesystem
retention_enabled: true # Active la suppression automatique
retention_delete_delay: 2h
retention_delete_worker_count: 150
5. Datasource Grafana → Loki (auto-provisioning).
Fichier config/grafana/datasources/loki.yaml :
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
url: http://loki:3100
isDefault: true
jsonData:
maxLines: 1000
timeout: 60
6. Dashboard Grafana — 5 panneaux UGAIA essentiels.
Voici les requêtes LogQL à construire pour votre tableau de bord UGAIA Score en temps réel.
Panneau 1 — Volume de requêtes IA par heure
sum by (model) (
rate({container="ollama"}[1h])
)
Indicateur de charge et d'utilisation par modèle (Phi-4 vs Mistral).
Panneau 2 — Détections PII par Presidio (taux de conformité)
sum(
count_over_time({container="presidio-analyzer"} |= "entity_type" [1h])
) by (entity_type)
Affiche le volume et les types d'entités détectées : PERSON, EMAIL, PHONE, IBAN, NIR. Alerte si le volume dépasse un seuil (ex. >100 détections/heure = risque de fuite de données structurelle).
Panneau 3 — Latence P95 des inférences Ollama
quantile_over_time(0.95,
{container="ollama"} | json | unwrap total_duration [5m]
) by (model)
SLA de performance : alerte si P95 > 10 secondes.
Panneau 4 — Tentatives de prompt injection détectées
count_over_time(
{container="open-webui"} |= "injection" or |= "jailbreak" or |= "ignore previous" [1h]
)
Indicateur de sécurité critique pour le scoring UGAIA (composante "Protection contre les attaques adversariales").
Panneau 5 — Score de Résilience UGAIA (jauge 0-100)
Ce panneau central agrège les métriques en un score composite. Il se construit via un panneau de type "Stat" avec une expression qui calcule :
- Loki actif et ingérant : +15 pts
- Promtail PII scrubbing actif : +20 pts
- Presidio détections > 0 (preuve d'utilisation) : +15 pts
- Latence P95 < 10s : +10 pts
- Zéro erreur d'authentification Open WebUI : +10 pts
- Rétention Loki configurée ≤30j : +10 pts
- Alertes actives configurées : +10 pts
- Aucun port sensible exposé (Ollama/Loki) : +10 pts
7. Sécurisation Open WebUI — Configuration avancée.
Open WebUI joue un rôle clé au-delà d'une simple interface : c'est le point d'application de la politique de gouvernance pour les utilisateurs finaux.
Configuration du System Prompt de gouvernance (à définir dans Open WebUI > Settings > Models) :
Tu es un assistant IA souverain déployé par [Organisation] dans le cadre
du dispositif UGAIA. Tu opères dans un environnement conforme RGPD.
RÈGLES ABSOLUES :
- Ne jamais demander ni stocker de données personnelles (NIR, IBAN, données médicales).
- Ne jamais transmettre d'informations vers des systèmes externes.
- Si l'utilisateur semble partager des PII, l'informer que ces données
sont automatiquement anonymisées avant traitement.
- Toutes tes réponses sont journalisées à des fins d'audit UGAIA.
Classification des données autorisées : N1 (public) et N2 (interne).
Pour les données N3/N4, contacter le DPO.
Pop-up de consentement au premier login : configurer via Open WebUI > Admin > Banners un message imposant l'acceptation de la charte d'usage UGAIA avant accès. Cela constitue une preuve de consentement exploitable en audit.
RBAC recommandé dans Open WebUI :
| Rôle | Permissions | Modèles accessibles |
|---|---|---|
user |
Chat uniquement | Phi-4, Mistral (données N1/N2) |
power_user |
RAG + fichiers | + modèles spécialisés |
admin |
Gestion complète | Tous les modèles |
auditor (lecture seule) |
Historique conversations | Aucun |
8. Alertes Grafana — 3 alertes critiques UGAIA.
Alerte 1 — PII non scrubées détectées dans Loki
# Si des emails passent le scrubbing → défaillance critique
count_over_time(
{container="loki"} |~ "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}" [5m]
) > 0
Sévérité : CRITIQUE — notification immédiate DPO + RSSI.
Alerte 2 — Ollama injoignable depuis Open WebUI
absent(rate({container="ollama"}[5m])) == 1
Sévérité : HAUTE — indisponibilité de service.
Alerte 3 — Volume anormal de détections PII
sum(count_over_time({container="presidio-analyzer"} [1h])) > 500
Sévérité : MOYENNE — possible tentative de fuite de données massives.
9. Impact sur le Score UGAIA.
| Composant | Score avant | Score après intégration complète |
|---|---|---|
| Open WebUI (RBAC + SSO + System Prompt) | 14/20 | 18/20 |
| Grafana (Dashboard UGAIA + alertes) | 13/20 | 18/20 |
| Promtail (PII scrubbing actif) | 12/20 | 17/20 |
| Loki (rétention RGPD configurée) | 15/20 | 17/20 |
| Ollama (métriques exposées) | 16/20 | 17/20 |
| Docker (réseau isolé) | 13/20 | 16/20 |
| SCORE TOTAL | 73/100 | ≥ 85/100 ✅ SOUVERAIN+ |
10. Plan d'implémentation en 3 sprints.
Sprint 1 (Semaine 1-2) — Fondation sécurisée
Déployer le docker-compose.yml avec réseau isolé + activer PII scrubbing Promtail + configurer la rétention Loki 30j + activer RBAC Open WebUI. Gain : +12 pts → 85/100.
Sprint 2 (Semaine 3-4) — Dashboard et alertes
Construire les 5 panneaux Grafana UGAIA Score + configurer les 3 alertes critiques + ajouter le System Prompt de gouvernance Open WebUI + bannière consentement. Gain : observabilité complète, preuve d'audit ≤48h.
Sprint 3 (Semaine 5-6) — Corrélation et traçabilité EU AI Act
Intégrer Langfuse avec mlflow_run_id comme clé pivot + relier les traces Langfuse au dashboard Grafana + documenter la procédure Droit à l'effacement (Loki Delete API) pour le DPO. Gain : conformité EU AI Act Art. 12 complète.
Le résultat est une architecture où chaque interaction utilisateur via Open WebUI génère une trace complète et auditée dans Grafana, sans qu'aucune donnée personnelle ne soit exposée dans les logs, tout en maintenant une souveraineté totale sur l'ensemble de la pile.
Une version cible RSSI avec DMZ à double firewall et flux numérotés, structurée selon une logique périmétrique + Zero Trust, typiquement attendue pour un dossier d’homologation ou une revue ANSSI.
Matrice RSSI complète (30 contrôles) :
Pour votre architecture IA souveraine sur réseau Docker ai_network, structurée selon les domaines attendus en audit ISO 27001 / ANSSI / homologation interne.
1) Sécurité réseau (8 contrôles)
| N° | Contrôle | Exigence | Niveau cible |
|---|---|---|---|
| R1 | Segmentation réseau | Zones séparées : Internet / DMZ / Interne / Admin | Obligatoire |
| R2 | Double firewall | FW1 (périmètre) + FW2 (interne) | Obligatoire |
| R3 | Principe deny-all | Flux autorisés par liste blanche uniquement | Obligatoire |
| R4 | Isolation Docker | Réseau bridge isolé ai_network | Obligatoire |
| R5 | Non exposition des modèles | Port Ollama (11434) non accessible | Obligatoire |
| R6 | Filtrage egress | Sorties Internet conteneurs bloquées | Fortement recommandé |
| R7 | WAF en DMZ | Protection L7 WebUI | Recommandé |
| R8 | Journalisation firewall | Logs FW centralisés | Obligatoire |
2) Gestion des identités et des accès (IAM) (6 contrôles)
| N° | Contrôle | Exigence | Niveau cible |
|---|---|---|---|
| I1 | Authentification SSO | OIDC / SAML sur WebUI | Obligatoire |
| I2 | MFA administrateurs | Grafana, bastion, VPN | Obligatoire |
| I3 | RBAC applicatif | Rôles utilisateurs WebUI | Obligatoire |
| I4 | Accès admin via VPN | Aucun accès direct Internet | Obligatoire |
| I5 | Comptes nominatifs | Interdiction comptes partagés | Obligatoire |
| I6 | Journalisation des accès | Connexions utilisateurs tracées | Obligatoire |
3) Protection des données & chiffrement (6 contrôles)
| N° | Contrôle | Exigence | Niveau cible |
|---|---|---|---|
| D1 | TLS obligatoire | HTTPS 1.2+ (idéalement 1.3) | Obligatoire |
| D2 | Anonymisation amont | Presidio avant traitement IA | Obligatoire |
| D3 | Scrubbing logs | Suppression PII via Promtail | Obligatoire |
| D4 | Chiffrement stockage | Disques Loki / hôte chiffrés | Recommandé |
| D5 | Non conservation prompts bruts | Politique de minimisation | Obligatoire |
| D6 | Classification données | Niveau sensibilité défini | Obligatoire |
4) Journalisation, supervision et audit (5 contrôles)
| N° | Contrôle | Exigence | Niveau cible |
|---|---|---|---|
| A1 | Centralisation logs | Loki comme référentiel unique | Obligatoire |
| A2 | Tableaux de bord | Grafana (usage, erreurs, sécurité) | Obligatoire |
| A3 | Traçabilité des actions | Historique requêtes utilisateurs | Obligatoire |
| A4 | Rétention logs | 30 à 180 jours selon politique | Obligatoire |
| A5 | Alertes sécurité | Seuils anomalie / volumétrie | Recommandé |
5) Continuité d’activité & résilience (PRA/PCA) (3 contrôles)
| N° | Contrôle | Exigence | Niveau cible |
|---|---|---|---|
| C1 | Sauvegardes | Loki, Grafana, configurations Docker | Obligatoire |
| C2 | Procédure PRA | Reconstruction environnement automatisée | Obligatoire |
| C3 | Tests PRA | Test annuel documenté | Recommandé |
6) Sécurité des systèmes & DevSecOps (2 contrôles)
| N° | Contrôle | Exigence | Niveau cible |
|---|---|---|---|
| S1 | Scan vulnérabilités | Images Docker (Trivy, Grype…) | Obligatoire |
| S2 | Gestion des mises à jour | Patching OS, Docker, modèles | Obligatoire |
Synthèse de maturité (lecture RSSI)
Domaine Nombre contrôles Réseau 8 IAM 6 Données / chiffrement 6 Logs / audit 5 PRA 3 Systèmes 2 Total 30 contrôles
Score de conformité (modèle rapide) :
-
< 18 : Risque élevé
-
18–24 : Niveau acceptable (pré-production)
-
25–30 : Niveau production sécurisé
-
30/30 : Niveau IA de confiance (homologation interne)
Positionnement sécurité de l’architecture :
Cette matrice démontre :
-
Souveraineté (modèles locaux)
-
Privacy by Design (anonymisation systématique)
-
Défense en profondeur (double firewall + segmentation)
-
Observabilité complète
-
Conformité ISO 27001 / ANSSI (niveau standard entreprise)

Aucun commentaire:
Enregistrer un commentaire