Skip to content

Secrets et accès ​

Un secret, c'est une valeur qui donne un accès : un mot de passe, un jeton, une clé. Règle absolue : aucun secret en clair dans le dépôt.

Tous les secrets ​

SecretRangé dansUtilisé parDonne accès à
Clé SSH d'administrationla machine de l'opérateurAnsibleSSH avec sudo sur les deux VM
Mot de passe du vaultle gestionnaire de mots de passe de l'opérateurAnsibledéchiffrer prod.yml et tooling.yml
Jeton GitHub classique (repo, write:packages, autorisé SSO)tooling.yml, puis le .env de JenkinsJenkinslire le dépôt, pousser sur GHCR
Clé privée de déploiementtooling.yml, puis un secret Docker monté dans JenkinsJenkinsSSH en deploy sur tm-prod
Clé publique de déploiementall.yml, puis authorized_keys de deploytm-prodvérifier l'identité de Jenkins
Jeton GHCR en lecture seuleprod.yml, puis le docker login de deploytm-prodtélécharger les images, rien d'autre
Mot de passe PostgreSQLprod.yml, puis le .env de l'applicationback, dbla base de données
secret_key_baseprod.yml, puis le .env de l'applicationbacksigner les sessions et les jetons
Clé de l'API d'emails (Brevo)prod.yml, puis le .env de l'applicationbackenvoyer les emails
Mot de passe admin de Jenkinstooling.yml, puis le .env de Jenkinsl'opérateurl'interface web de Jenkins
Certificats TLSacme.json sur tm-prodTraefikHTTPS, renouvelés tout seuls par Let's Encrypt

Les principes ​

  • Aucun secret en clair dans le dépôt : les secrets sont soit dans un fichier Ansible Vault, soit générés sur les serveurs.
  • Un secret, un usage : Jenkins peut écrire des images, la production ne peut que les lire.
  • Des secrets en fichier quand c'est possible : la clé de déploiement est un secret Docker monté dans /run/secrets/deploy_key, pas une variable d'environnement.
  • Les .env sont générés par Ansible sur les serveurs, en mode 0600. Aucun .env n'est modifié à la main.

Le chemin d'un secret ​

  1. Les secrets sont chiffrés dans group_vars/prod.yml et group_vars/tooling.yml.
  2. Au lancement du playbook, Ansible demande le mot de passe du vault et les déchiffre en mémoire.
  3. Il les écrit sur les serveurs dans des fichiers lisibles par leur seul propriétaire (0600).
  4. no_log: true empêche qu'ils apparaissent dans la sortie d'Ansible.

Les secrets d'une machine ne vont que sur elle : tm-prod ne reçoit jamais ceux de Jenkins, tm-tooling jamais ceux de la base.

Ansible Vault au quotidien ​

Depuis timemanager-devops/ansible/ :

bash
# lire un fichier chiffré
ansible-vault view group_vars/prod.yml

# le modifier (ouvre l'éditeur, rechiffre à la fermeture)
ansible-vault edit group_vars/prod.yml

# changer le mot de passe du vault
ansible-vault rekey group_vars/prod.yml group_vars/tooling.yml

Toujours chiffré

Ne jamais commiter un fichier de vault déchiffré : vérifier qu'il commence par $ANSIBLE_VAULT;1.1;AES256. Le mot de passe du vault ne doit jamais être dans le dépôt : il se transmet de personne à personne.

Ajouter un secret ​

Exemple : une nouvelle clé ma_cle pour l'API.

  1. L'ajouter au vault :

    bash
    ansible-vault edit group_vars/prod.yml
    yaml
    ma_cle: valeur-secrete
  2. L'écrire dans le .env, dans roles/app/tasks/main.yml :

    yaml
    MA_CLE={{ ma_cle }}
  3. La passer au conteneur, dans app/docker-compose.yml :

    yaml
    back:
      environment:
        MA_CLE: ${MA_CLE}
  4. Appliquer :

    bash
    ansible-playbook playbook.yml --tags app --ask-vault-pass

En cas de fuite ​

Si un secret a été exposé (poussé en clair, copié dans un message) :

  1. Le révoquer à la source : nouveau jeton GitHub, nouveau mot de passe, nouvelle paire de clés SSH.
  2. Mettre la nouvelle valeur dans le vault.
  3. Relancer le rôle concerné.
  4. Le retirer de Git ne suffit pas : l'historique le garde. Seule la révocation compte.