Secrets en Kubernetes
| Secret | Par fichier | Par variable d’environnement |
|---|---|---|
| configuration entiere | config.toml monte dans /config | - |
| utilisateurs, roles | users_file, roles_file | - |
| cles d’hote SSH | host_keys | - |
| paire TLS admin | [admin.tls] cert_file, key_file | CRAFT_FILE_GATE_ADMIN_TLS_CERT, CRAFT_FILE_GATE_ADMIN_TLS_KEY |
| secret JWT | CRAFT_FILE_GATE_JWT_SECRET_FILE | CRAFT_FILE_GATE_JWT_SECRET |
jeton d’administration (secours ; interdit par allow_static_token = false, que le chart pose) | CRAFT_FILE_GATE_ADMIN_BEARER_TOKEN_FILE | CRAFT_FILE_GATE_ADMIN_BEARER_TOKEN |
| cles S3 | credentials = { type = "static", ... } | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY avec type = "iam_role" |
| cle des sessions de la console | [admin.session] key_file | CRAFT_FILE_GATE_ADMIN_SESSION_SECRET_NAME : le Secret partage, rempli par les pods (ci-dessous) |
- Un Secret monte en volume est mis a jour par Kubernetes, qui repointe le
lien
..data: configuration, utilisateurs, roles et paire TLS sont recharges a chaud. Voir Rechargement. - Un Secret monte avec
subPathn’est jamais mis a jour : evitezsubPath. - Montez Secrets et ConfigMaps
readOnly: true, comme le chart, jamais sur unemptyDirou unhostPathinscriptible (Fichiers de confiance et TLS). - Un Secret passe par
envFrom(extraEnvFrom) n’est lu qu’au demarrage :kubectl rollout restartpour une nouvelle valeur. - Le serveur ne lit pas les Secrets par l’API Kubernetes : montez-les. Seule exception, le Secret partage des pods (ci-dessous).
Un fichier plutot qu’une variable
Montez le Secret en fichier par les valeurs du chart, et nommez-le par la
variable _FILE (le jeton d’administration de meme, avec
config.allowStaticToken: true) :
extraVolumes:
- name: jwt
secret: { secretName: sftp-jwt, defaultMode: 0440 }
extraVolumeMounts:
- { name: jwt, mountPath: /secrets/jwt, readOnly: true }
extraEnv:
- { name: CRAFT_FILE_GATE_JWT_SECRET_FILE, value: /secrets/jwt/jwt-secret }
Le fichier est lu une fois, au demarrage ; /proc/<pid>/environ ne montre
qu’un chemin. Voir Variables d’environnement.
users.toml se monte de meme, nomme par users_file : voir
Kubernetes.
Le Secret partage des pods
Les pods d’une meme release partagent la cle qui signe les sessions de la
console, pour qu’un pod accepte le jeton qu’un autre a emis. Le chart cree un
Secret vide et donne aux pods get et update sur ce seul nom ;
le premier pod qui n’y trouve pas l’entree admin-session.key la genere et
l’ecrit, les autres la lisent. Chaque entree a sa propre vie : le certificat
du canal entre pods y vit aussi (tls.crt, tls.key).
| Valeur du chart | Effet |
|---|---|
clusterSecret.enabled | true par defaut, avec [admin] ou le canal entre pods : le Secret, le Role (get, update sur ce nom), le jeton du compte de service ; avec [admin], CRAFT_FILE_GATE_ADMIN_SESSION_SECRET_NAME |
clusterSecret.name | <release>-cluster par defaut |
adminRevocations.backend | vide par defaut : configmap avec le Secret partage, memory sinon ; configmap cree la ConfigMap d’acces, ou vivent les revocations, son Role (get, update, patch sur ce nom), et pose CRAFT_FILE_GATE_ADMIN_SESSION_BACKEND, CRAFT_FILE_GATE_ADMIN_SESSION_REVOCATION_CONFIGMAP_NAME |
adminGrants.backend | vide par defaut : configmap avec [admin] et le Secret partage ou plusieurs replicas, memory sinon ; les acces temporaires dans la meme ConfigMap, CRAFT_FILE_GATE_ADMIN_GRANTS_BACKEND, CRAFT_FILE_GATE_ADMIN_GRANTS_GRANT_CONFIGMAP_NAME ; memory, ou file sans persist_file sous [admin.grants], avec plusieurs replicas fait echouer le rendu |
access.configmapName | la ConfigMap d’acces, <release>-access par defaut |
Avec replicaCount au-dela de 1, clusterSecret.enabled: false demande un
key_file sous [admin.session] dans config.inline, et une cle partagee
demande des revocations partagees (adminRevocations.backend: configmap, ou
persist_file sous [admin.session]).
Pour changer la cle : supprimer l’entree (kubectl patch secret ... --type=json -p '[{"op":"remove","path":"/data/admin-session.key"}]') puis redemarrer les
pods ; les sessions ouvertes sont perdues.
Cle d’hote SSH
Creez la cle une fois, gardez-la dans un Secret, montez-la. Ne laissez pas le
serveur la generer (generate_host_key) dans un pod : chaque pod, ou chaque
redemarrage sans volume, aurait sa cle, et les clients verraient « host key
changed ».
ssh-keygen -t ed25519 -f host_ed25519 -N ""
ssh-keygen -l -f host_ed25519.pub # l'empreinte a donner aux clients
kubectl create secret generic sftp-host-keys --from-file=host_ed25519
hostKeys.existingSecret: sftp-host-keys la monte dans /keys (Le chart),
la configuration pointe dessus : host_keys = ["/keys/host_ed25519"].
L’empreinte du demarrage (loaded host key, champ fingerprint) et de
GET /admin/config est celle de ssh-keygen -l.