Aller au contenu

Chiffrement au repos — runbook

AKKO supporte le chiffrement au repos sur trois couches, chacune activable via un seul flag chart values. Les trois sont off par défaut pour garder la box démo simple.

Couche 1 — PostgreSQL niveau-colonne (Sprint 46 A2)

pgcrypto est embarqué + initialisé sur l'instance postgresql-data. Les colonnes PII de la démo banking (customers.tax_id, customers.dob, customers.email) sont stockées chiffrées avec une clé symétrique par-ligne dérivée du secret AKKO.

Activé par défaut — aucune action opérateur sur installation fresh. Les colonnes existantes peuplées sont migrées au premier read.

Vérifier :

kubectl -n akko exec deploy/akko-postgresql-data -- \
  psql -U akko -d analytics -c \
  "SELECT data_type FROM information_schema.columns
   WHERE table_name='customers' AND column_name='tax_id';"
# Attendu : bytea (chiffré) — pas text

Couche 2 — SeaweedFS niveau-volume (Sprint 52 P1)

Quand akko-storage.seaweedfs.encryptionAtRest=true, le serveur volume est lancé avec -volume.encrypted=true. Chaque needle (blob fichier) reçoit une clé AES-GCM aléatoire par-fichier chiffrée avec la clé maître cluster.

Activation sur installation fresh

helm install akko helm/akko -n akko --create-namespace \
  -f helm/examples/values-domain.yaml \
  -f helm/examples/values-dev-secrets.yaml \
  --set akko-storage.seaweedfs.encryptionAtRest=true

Fini. Chaque read+write Spark/Trino/MLflow/RAG est chiffré serveur-side dès le premier octet.

Activation sur cluster peuplé existant (migration)

Le flag ne chiffre PAS rétroactivement les fichiers déjà sur disque quand le chiffrement était off. Pattern :

  1. Arrêter les writers : kubectl scale deploy -l app.kubernetes.io/component=writer --replicas=0 -n akko. Spark, Airflow DAGs, MLflow logging — tous mis en pause.
  2. Provisionner un second PVC SeaweedFS dans le chart avec encryptionAtRest=true et un serviceName différent (temporaire, par ex. akko-seaweedfs-s3-encrypted).
  3. Synchroniser les données avec le Job rclone qu'on livre à tests/integration/seaweedfs-encrypted-migrate.yaml (TODO Sprint 53).
  4. Mettre à jour le Secret akko-s3 pour pointer le nouvel endpoint.
  5. Redémarrer les consommateurs pour prendre le nouvel endpoint.
  6. Désactiver l'ancien volume PVC après 7 jours de quarantaine.

Vérifier que le chiffrement est actif

# Vérifier les flags CLI weed server
kubectl -n akko exec statefulset/akko-seaweedfs -- \
  cat /proc/1/cmdline | tr '\0' '\n' | grep volume.encrypted
# Attendu : -volume.encrypted=true

# Vérifier que les octets bruts sur disque ne sont pas lisibles
kubectl -n akko exec statefulset/akko-seaweedfs -- \
  hexdump -C /data/topology.toml | head -3
# Les needles chiffrés apparaissent comme octets aléatoires, pas signatures protobuf

Couche 3 — Chiffrement Secrets Kubernetes (côté opérateur)

Hors scope chart AKKO — géré au niveau cluster via la EncryptionConfiguration passée au kube-apiserver. La plupart des services k8s gérés (EKS / GKE / AKS) l'activent par défaut. k3s/k3d non — voir https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/.

Pour les clusters auto-gérés, l'opérateur doit configurer --encryption-provider-config avec au minimum le provider aescbc pour que le backend etcd stocke les Secrets AKKO chiffrés.

Couche 4 — Iceberg metadata + Parquet au repos (Sprint 53 candidat)

Actuellement le chiffrement SeaweedFS niveau-volume (Couche 2) couvre les fichiers Iceberg de façon transparente — chaque bloc Parquet vit à l'intérieur d'un needle SeaweedFS qui est désormais chiffré sur disque. Le chiffrement natif Iceberg niveau-colonne (Spec Apache v2) est un sujet séparé et plus complexe reporté à Sprint 53+ (infrastructure de gestion de clés + intégration catalogue + changement breaking sur les tables existantes).

Mapping conformité

Contrôle Surface AKKO
SOC2 CC6.1 (chiffrement au repos) Couche 2 (SeaweedFS) + Couche 1 (Postgres pgcrypto)
ISO27001 A.10.1.1 Couches 1 + 2 + 3 (opérateur)
PCI-DSS Req. 3.4 (chiffrement PAN) Couche 1 pgcrypto sur colonnes banking
RGPD Art. 32 1(a) Couches 1 + 2
HIPAA §164.312(a)(2)(iv) Couches 1 + 2 + 3

À combiner avec docs/admin/mtls.md (données en transit) pour la couverture complète du contrôle SOC2 6.1.

Référence

  • helm/akko/charts/akko-storage/values.yaml — flag encryptionAtRest
  • helm/akko/charts/akko-postgres/templates/init-pgcrypto.yaml — init Sprint 46 A2
  • ADR-037 — mTLS (document jumeau pour les données en transit)
  • ADR-032 — signature d'image + SBOM (chaîne d'approvisionnement)