Aller au contenu

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.