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 :
- 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. - Provisionner un second PVC SeaweedFS dans le chart avec
encryptionAtRest=trueet unserviceNamedifférent (temporaire, par ex.akko-seaweedfs-s3-encrypted). - Synchroniser les données avec le Job rclone qu'on livre à
tests/integration/seaweedfs-encrypted-migrate.yaml(TODO Sprint 53). - Mettre à jour le Secret akko-s3 pour pointer le nouvel endpoint.
- Redémarrer les consommateurs pour prendre le nouvel endpoint.
- 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— flagencryptionAtResthelm/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)