Confidentialite¶
L'observabilité manipule des données classees Confidentiel. Les metriques, logs et traces peuvent contenir des informations sensibles (identifiants utilisateur, adresses IP, tokens, parametres de requêtes). Ce chapitre detaille les mesures de protection.
Risque principal
Les logs applicatifs sont la première source de fuite de données personnelles (PII). Un log mal filtre peut contenir des mots de passe, tokens d'authentification, numeros de carte bancaire ou données de sante.
Cartographie des données sensibles¶
| Source | Données potentiellement sensibles | Risque |
|---|---|---|
| Logs applicatifs | Identifiants utilisateur, tokens, parametres URL | Fuite de PII, credentials |
| Metriques a haute cardinalite | Labels contenant des user_id, email, IP | Profilage des utilisateurs |
| Traces distribuees | Headers HTTP (Authorization), parametres de requête | Fuite de credentials |
| Metriques Keycloak | Tentatives de connexion (identifiants) | Énumération de comptes |
| Logs d'audit | Actions utilisateur nominatives | Données personnelles (RGPD) |
Filtrage des PII dans les logs¶
Pipeline de filtrage Alloy¶
// Pipeline de nettoyage des PII avant envoi a Loki
loki.process "pii_filter" {
// Supprimer les tokens et credentials
stage.replace {
expression = "(Authorization|Bearer|token|password|secret|api_key)[:=]\\s*\\S+"
replace = "${1}=***REDACTED***"
}
// Masquer les adresses email
stage.replace {
expression = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"
replace = "***EMAIL_REDACTED***"
}
// Masquer les numeros de carte bancaire (pattern basique)
stage.replace {
expression = "\\b\\d{4}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b"
replace = "***CARD_REDACTED***"
}
// Masquer les numeros de securite sociale (format francais)
stage.replace {
expression = "\\b[12]\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}\\s?\\d{3}\\s?\\d{3}\\s?\\d{2}\\b"
replace = "***NIR_REDACTED***"
}
// Tronquer les adresses IP (garder les 2 premiers octets)
stage.replace {
expression = "(\\d{1,3}\\.\\d{1,3})\\.\\d{1,3}\\.\\d{1,3}"
replace = "${1}.xxx.xxx"
}
forward_to = [loki.write.default.receiver]
}
Labels Loki interdits¶
Certaines valeurs ne doivent jamais devenir des labels Loki :
| Interdit comme label | Raison | Alternative |
|---|---|---|
user_id | Haute cardinalite + PII | Filtrer dans le contenu du log |
email | PII directe | Ne pas logger, ou masquer |
ip_address | PII (RGPD) | Tronquer ou hasher |
session_id | Haute cardinalite | Filtrer dans le contenu du log |
request_id | Haute cardinalite | Utiliser trace_id pour la correlation |
Cardinalite et coût
Chaque combinaison unique de labels cree un nouveau flux dans Loki. Des labels a haute cardinalite explosent le nombre de flux et degradent les performances. Limiter a < 15 labels par flux.
RBAC Grafana¶
Permissions par datasource¶
Grafana permet de restreindre l'accès aux datasources par rôle :
| Rôle Grafana | Datasources accessibles | Justification |
|---|---|---|
viewer-infra | Prometheus (metriques infra) | Consulter les metriques système |
editor-app | Prometheus + Loki (logs app) | Debugger les applications |
admin-platform | Toutes (Prometheus, Loki, Tempo) | Administration complète |
security-auditor | Loki (logs d'audit) | Audit de sécurité |
# Provisioning des permissions datasource
apiVersion: 1
datasources:
- name: Loki
type: loki
url: http://loki:3100
jsonData:
maxLines: 1000
secureJsonData: {}
# Restreindre via Grafana RBAC
# (configure dans l'interface admin ou via API)
Permissions par dossier de dashboards¶
Grafana Folders/
├── Infrastructure/ → Acces: admin-platform, viewer-infra
├── Applications/ → Acces: admin-platform, editor-app
├── Securite et audit/ → Acces: admin-platform, security-auditor
└── Direction (SLO/SLA)/ → Acces: admin-platform, management
Configuration RBAC via API Grafana¶
# Creer un role personnalise
curl -X POST http://grafana:3000/api/access-control/roles \
-H "Authorization: Bearer ${GRAFANA_ADMIN_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "security-auditor",
"description": "Acces en lecture aux logs d audit",
"permissions": [
{"action": "datasources:query", "scope": "datasources:name:Loki-Audit"},
{"action": "dashboards:read", "scope": "folders:uid:security-audit"},
{"action": "folders:read", "scope": "folders:uid:security-audit"}
]
}'
Chiffrement du stockage¶
Chiffrement at-rest¶
Toutes les données d'observabilité sont stockees dans MinIO/S3, qui doit etre configure avec le chiffrement at-rest :
# MinIO — activer le chiffrement SSE-S3
mc admin config set local/ identity_openid \
--env MINIO_KMS_KES_ENDPOINT=https://kes:7373 \
--env MINIO_KMS_KES_KEY_NAME=observability-key
# Configuration MinIO pour le chiffrement automatique
# Toutes les donnees ecrites dans les buckets sont chiffrees
environment:
MINIO_KMS_AUTO_ENCRYPTION: "on"
Chiffrement in-transit¶
| Flux | Protocole | Configuration |
|---|---|---|
| Applications → Alloy | OTLP sur TLS | Certificats mTLS |
| Alloy → Loki/Mimir/Tempo | HTTP sur TLS | Certificats internes CA |
| Grafana → Backends | HTTP sur TLS | Datasource config TLS |
| Utilisateurs → Grafana | HTTPS | Reverse proxy + Let's Encrypt |
Retention differenciee par classification¶
Les données d'observabilité n'ont pas toutes la même duree de vie requise :
| Type de données | Classification | Retention | Justification |
|---|---|---|---|
| Metriques infrastructure | Confidentiel | 1 an | Analyse de tendances, capacity planning |
| Metriques applicatives | Confidentiel | 90 jours | Debug et performance |
| Logs applicatifs | Confidentiel | 90 jours | Troubleshooting |
| Logs d'audit (IAM, Vault) | Restreint | 5 ans | Conformite RGPD, ISO 27001 |
| Traces distribuees | Confidentiel | 30 jours | Debug uniquement |
| Logs de sécurité (Falco) | Confidentiel | 1 an | Forensics |
Implementation dans Loki¶
# loki-config.yaml — retention differenciee
limits_config:
retention_period: 90d # Defaut : 90 jours
per_tenant_override_config: /etc/loki/overrides.yaml
# overrides.yaml
overrides:
audit:
retention_period: 1825d # 5 ans pour les logs d'audit
security:
retention_period: 365d # 1 an pour les logs de securite
default:
retention_period: 90d # 90 jours par defaut
Multi-tenant Loki
Utiliser le mode multi-tenant de Loki pour séparer les flux par classification. Chaque tenant a sa propre politique de retention. Alloy injecte le header X-Scope-OrgID selon le service source.
Référence¶
Pour le cadre complet de classification et les regles de protection par niveau, voir la rubrique Classification et zones de confiance.