RousselTMLEARNING

Automatisation

Ansible : gérer la sécurité (Vault, SSH, privilèges et secrets)

Sécuriser Ansible : Ansible Vault, authentification SSH par clés, become et sudo, no_log, durcissement du contrôleur et gestion des secrets en CI/CD.

1. Menaces et principes #

Où se situent les risques ?

Les points sensibles d'une chaîne Ansible #

Ansible a accès en administration à toute votre infrastructure : le nœud de contrôle est donc une cible de choix. Les risques classiques sont les secrets en clair dans Git, les clés SSH partagées, les mots de passe affichés dans les logs et les droits sudo trop larges.

  • Secrets : chiffrés au repos (Vault) et jamais affichés (no_log).
  • Authentification : clés SSH dédiées, protégées par passphrase ou agent, pas de mot de passe root.
  • Privilèges : become uniquement quand nécessaire, utilisateur sudo limité.
  • Contrôleur : accès restreint, journalisé, jamais exposé sur Internet.

2. Ansible Vault #

Chiffrer les variables et fichiers sensibles.

Les commandes essentielles #

Cycle de vie d'un secret avec Ansible Vault
Le mot de passe du vault n'est jamais versionné.
# Créer, éditer, afficher, chiffrer, déchiffrer
ansible-vault create group_vars/prod/vault.yml
ansible-vault edit   group_vars/prod/vault.yml
ansible-vault view   group_vars/prod/vault.yml
ansible-vault encrypt group_vars/prod/secrets.yml
ansible-vault decrypt group_vars/prod/secrets.yml
ansible-vault rekey   group_vars/prod/vault.yml       # changer le mot de passe

# Chiffrer une seule valeur (intégrable dans un fichier en clair)
ansible-vault encrypt_string 'S3cr3t!' --name 'db_password'
db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          61373030633036386239...

Utiliser le vault à l'exécution #

ansible-playbook site.yml --ask-vault-pass
ansible-playbook site.yml --vault-password-file ~/.vault_pass     # fichier hors dépôt, chmod 600
ansible-playbook site.yml --vault-id prod@prompt --vault-id dev@~/.vault_dev   # plusieurs vaults

# Dans ansible.cfg
[defaults]
vault_password_file = ~/.vault_pass
Bonne Pratique : Convention : placez les variables chiffrées dans vault.yml préfixées vault_ et référencez-les depuis un fichier clair (db_password: "{{ vault_db_password }}") : on voit les noms, pas les valeurs.
Erreur Courante : Ne versionnez jamais le fichier du mot de passe du vault. Ajoutez-le au .gitignore.

3. Authentification et privilèges #

SSH, sudo et become.

Clés SSH dédiées #

# Clé dédiée à Ansible, protégée par passphrase
ssh-keygen -t ed25519 -f ~/.ssh/ansible_ed25519 -C "ansible-controller"

# Diffuser la clé publique avec Ansible lui-même
ansible all -m authorized_key -a "user=deploy key='{{ lookup('file','~/.ssh/ansible_ed25519.pub') }}' state=present" -k

# Agent SSH pour éviter de retaper la passphrase
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/ansible_ed25519
# ansible.cfg
[defaults]
remote_user = deploy
private_key_file = ~/.ssh/ansible_ed25519
host_key_checking = True

[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=60s

Sudo limité côté cible #

# Autoriser l'utilisateur deploy à devenir root sans mot de passe
- name: Règle sudo pour deploy
  ansible.builtin.copy:
    dest: /etc/sudoers.d/deploy
    content: "deploy ALL=(ALL) NOPASSWD: ALL\n"
    mode: "0440"
    validate: visudo -cf %s

En environnement sensible, remplacez ALL par la liste des commandes réellement nécessaires.

4. Ne rien laisser fuiter #

no_log, logs et CI/CD.

no_log et diff #

- name: Créer l'utilisateur de base de données
  community.postgresql.postgresql_user:
    name: app
    password: "{{ vault_db_password }}"
  no_log: true                     # masque les arguments et résultats dans les logs

- name: Déployer le fichier de secrets
  ansible.builtin.template:
    src: secrets.env.j2
    dest: /etc/app/secrets.env
    mode: "0600"
  diff: false                      # ne pas afficher le contenu avec --diff

Dans un pipeline CI/CD #

# GitLab CI : le mot de passe du vault vient d'une variable masquée
deploy:
  script:
    - echo "$VAULT_PASSWORD" > .vault_pass && chmod 600 .vault_pass
    - ansible-playbook site.yml -i inventories/prod --vault-password-file .vault_pass
    - shred -u .vault_pass

Pour aller plus loin, déléguez les secrets à un coffre dédié (HashiCorp Vault, AWS Secrets Manager) via les lookups community.hashi_vault : le secret n'est alors jamais stocké dans le dépôt.

ansible-galaxy collection install community.hashi_vault
ansible-lint --profile production site.yml       # détecte les mauvaises pratiques de sécurité

Pour aller plus loin