Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Secrets en Kubernetes

SecretPar fichierPar variable d’environnement
configuration entiereconfig.toml monte dans /config-
utilisateurs, rolesusers_file, roles_file-
cles d’hote SSHhost_keys-
paire TLS admin[admin.tls] cert_file, key_fileCRAFT_FILE_GATE_ADMIN_TLS_CERT, CRAFT_FILE_GATE_ADMIN_TLS_KEY
secret JWTCRAFT_FILE_GATE_JWT_SECRET_FILECRAFT_FILE_GATE_JWT_SECRET
jeton d’administration (secours ; interdit par allow_static_token = false, que le chart pose)CRAFT_FILE_GATE_ADMIN_BEARER_TOKEN_FILECRAFT_FILE_GATE_ADMIN_BEARER_TOKEN
cles S3credentials = { type = "static", ... }AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY avec type = "iam_role"
cle des sessions de la console[admin.session] key_fileCRAFT_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 subPath n’est jamais mis a jour : evitez subPath.
  • Montez Secrets et ConfigMaps readOnly: true, comme le chart, jamais sur un emptyDir ou un hostPath inscriptible (Fichiers de confiance et TLS).
  • Un Secret passe par envFrom (extraEnvFrom) n’est lu qu’au demarrage : kubectl rollout restart pour 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 chartEffet
clusterSecret.enabledtrue 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.backendvide 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.backendvide 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.configmapNamela 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.