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 :
becomeuniquement 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 #
# 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_passBonne Pratique : Convention : placez les variables chiffrées dansvault.ymlpréfixéesvault_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=60sSudo 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 %sEn 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 --diffDans 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_passPour 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éMon suivi
Connectez-vous pour suivre votre progression et prendre des notes. Se connecter
Articles recommandés
Linux vs Unix : Le Guide Complet des Commandes et Distributions
Comprenez les différences entre Linux et Unix, explorez les distributions (serveur, desktop, ligh...
Ansible : l'inventaire (statique, dynamique, groupes et variables)
Comprendre et maîtriser l'inventaire Ansible : fichiers INI et YAML, groupes, variables d'hôte et...
Ansible : les commandes Ad-Hoc
Exécuter des actions immédiates sur un parc de serveurs avec ansible : modules ping, command, she...
Ansible : structurer son code avec les rôles
Créer, organiser et réutiliser des rôles Ansible : arborescence, defaults, tasks, handlers, templ...
Ansible : générer des fichiers dynamiques avec Jinja2 et les facts
Créer des fichiers de configuration dynamiques : templates Jinja2, variables, facts, filtres, bou...
Ansible : gérer son infrastructure avec des playbooks (Infrastructure as Code)
Écrire des playbooks de production : structure d'un projet, plays, handlers, tags, strategy seria...
Ansible : piloter ses automatisations avec une interface graphique (AWX, Semaphore, AAP)
Comparer et installer les interfaces graphiques d'Ansible : AWX, Ansible Automation Platform, Sem...
Ansible : aller plus loin (tests, qualité, CI/CD et performance)
Industrialiser Ansible : ansible-lint, yamllint, Molecule, intégration continue, collections, exe...
Bonnes pratiques Vagrant : des environnements reproductibles et rapides
Bonnes pratiques Vagrant : Vagrantfile versionné, boxes épinglées, provisioning idempotent, multi...