Aller au contenu
Infrastructure as Code medium

Sécurité Ansible : protéger vos playbooks et votre infrastructure

12 min de lecture

Un playbook Ansible mal sécurisé peut exposer des secrets à l’ensemble de votre équipe, propager une mauvaise configuration à des centaines de serveurs, ou ouvrir une porte dérobée via une collection compromise. Ansible amplifie tout : les bonnes pratiques comme les mauvaises.

Ce guide centralise les principes de sécurité à appliquer dans vos projets Ansible. Il complète les guides spécifiques comme Ansible Vault en offrant une vue d’ensemble.

Les playbooks manipulent des données sensibles : mots de passe, clés API, certificats, tokens. Ces secrets ne doivent jamais apparaître en clair.

Anti-patternRisqueSolution
Mot de passe en clair dans une variableExposition dans Git, logs, historiqueAnsible Vault
vault_password_file commitéTout le monde peut déchiffrer.gitignore + variable d’environnement
Secret affiché dans les logsVisibilité dans CI/CD, AWXno_log: true sur les tâches
Un seul mot de passe VaultCompromission totale si fuiteVault IDs par environnement
Credentials dans --extra-varsVisible dans ps auxFichier chiffré ou variable d’environnement
- name: Configurer la connexion base de données
ansible.builtin.template:
src: db.conf.j2
dest: /etc/app/db.conf
mode: "0600"
vars:
db_password: "{{ vault_db_password }}"
no_log: true # Masque les variables dans les logs

Intégration avec des gestionnaires de secrets externes

Section intitulée « Intégration avec des gestionnaires de secrets externes »

Pour les environnements critiques, Ansible Vault peut être complété par des solutions externes :

SolutionUsageLookup Ansible
HashiCorp VaultSecrets dynamiques, rotationcommunity.hashi_vault.vault_read
AWS Secrets ManagerEnvironnements AWSamazon.aws.secretsmanager_secret
Azure Key VaultEnvironnements Azureazure.azcollection.azure_keyvault_secret
CyberArkEntreprise, compliancecyberark.conjur.conjur_variable

Pour approfondir : Gestion des secrets

Le principe de moindre privilège s’applique à plusieurs niveaux avec Ansible.

L’utilisateur qui exécute Ansible n’a pas besoin d’être root :

Fenêtre de terminal
# Créer un utilisateur dédié
sudo useradd -m -s /bin/bash ansible
sudo mkdir -p /home/ansible/.ssh
sudo chown -R ansible:ansible /home/ansible

Protégez les fichiers sensibles :

Fenêtre de terminal
chmod 600 ~/.ansible/vault_password
chmod 600 inventory/group_vars/*/vault.yml
chmod 700 ~/.ssh

Limitez l’usage de become aux tâches qui en ont réellement besoin :

# ❌ Mauvais : become global
- hosts: webservers
become: true # Tout le playbook en root
tasks:
- name: Installer nginx
ansible.builtin.apt:
name: nginx
- name: Copier la config applicative
ansible.builtin.template:
src: app.conf.j2
dest: /home/appuser/app.conf
owner: appuser
# ✅ Mieux : become ciblé
- hosts: webservers
tasks:
- name: Installer nginx
ansible.builtin.apt:
name: nginx
become: true # Nécessaire pour apt
- name: Copier la config applicative
ansible.builtin.template:
src: app.conf.j2
dest: /home/appuser/app.conf
owner: appuser
# Pas de become si l'utilisateur Ansible a les droits

Séparez les credentials entre environnements :

inventory/
├── dev/
│ ├── hosts.yml
│ └── group_vars/
│ └── all/
│ └── vault.yml # Credentials dev
├── staging/
│ └── ...
└── prod/
└── group_vars/
└── all/
└── vault.yml # Credentials prod (accès restreint)

Les attaques supply chain concernent aussi Ansible. Une collection ou un rôle compromis peut exécuter du code arbitraire sur votre infrastructure.

Avant d’utiliser une collection ou un rôle tiers :

  1. Vérifiez le namespace : préférez les namespaces officiels (ansible.*, community.*, éditeurs connus)
  2. Consultez le code source : lisez au moins les tâches principales
  3. Vérifiez la maintenance : commits récents, issues traitées
  4. Utilisez OpenSSF Scorecard : évaluez la posture sécurité du dépôt

Ne laissez jamais Ansible installer la “dernière version” :

requirements.yml
collections:
- name: community.general
version: "8.1.0" # ✅ Version épinglée
- name: amazon.aws
version: ">=7.0.0,<8.0.0" # ✅ Plage contrôlée
roles:
- name: geerlingguy.docker
version: "6.2.0" # ✅ Version épinglée

Pour les environnements critiques, utilisez un miroir interne :

  • Automation Hub (Red Hat) : collections certifiées et validées
  • Dépôt Git interne : fork des collections utilisées
  • Proxy Artifactory ou Nexus : cache avec contrôle d’accès

Certains modules Ansible présentent des risques de sécurité accrus.

Ces modules exécutent des commandes shell. Si les variables ne sont pas validées, une injection est possible :

# ❌ Dangereux : injection possible
- name: Supprimer un fichier
ansible.builtin.shell: "rm -rf {{ user_input }}"
# Si user_input = "; rm -rf /" → catastrophe
# ✅ Préférer un module spécialisé
- name: Supprimer un fichier
ansible.builtin.file:
path: "{{ validated_path }}"
state: absent
SituationRecommandation
Tâche réalisable avec un moduleUtiliser le module (idempotent, sécurisé)
Script complexe existantCopier le script, exécuter avec script
Commande ponctuelle simplecommand avec validation des entrées
Pipes, redirections nécessairesshell avec no_log si données sensibles
- name: Valider le nom d'utilisateur
ansible.builtin.assert:
that:
- username is match('^[a-z][a-z0-9_-]{2,31}$')
fail_msg: "Nom d'utilisateur invalide : {{ username }}"
- name: Créer l'utilisateur (après validation)
ansible.builtin.user:
name: "{{ username }}"
state: present

Avant d’exécuter un playbook en production, validez-le.

OutilUsageCommande
Syntaxe YAMLErreurs de parsingansible-playbook --syntax-check
ansible-lintBonnes pratiques, sécuritéansible-lint playbook.yml
yamllintStyle YAML strictyamllint .
Dry-runVoir les changementsansible-playbook --check --diff
.gitlab-ci.yml
lint:
stage: test
script:
- pip install ansible-lint yamllint
- yamllint .
- ansible-lint playbook.yml
- ansible-playbook --syntax-check playbook.yml
test:
stage: test
script:
- pip install molecule molecule-docker
- molecule test

Molecule permet de tester vos rôles dans des conteneurs isolés :

Fenêtre de terminal
# Initialiser Molecule dans un rôle
molecule init scenario -d docker
# Exécuter les tests
molecule test
  • Utilisez des clés SSH, jamais de mots de passe
  • Préférez les clés avec passphrase + ssh-agent
  • Une clé par environnement (dev/staging/prod)
  • Rotation régulière des clés

Ne désactivez jamais host_key_checking en production :

# ansible.cfg
[defaults]
# ❌ Dangereux en production : vulnérable aux attaques MITM
# host_key_checking = False
# ✅ Désactiver uniquement pour les environnements éphémères
# Utiliser une variable d'environnement si nécessaire
# ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

Pour les environnements isolés :

# ansible.cfg ou inventory
[ssh_connection]
ssh_args = -o ProxyJump=bastion.example.com
# ansible.cfg
[defaults]
log_path = /var/log/ansible/ansible.log

Protégez le fichier de log :

Fenêtre de terminal
sudo mkdir -p /var/log/ansible
sudo chown ansible:ansible /var/log/ansible
sudo chmod 750 /var/log/ansible
# ansible.cfg
[defaults]
callback_whitelist = json, profile_tasks

Pour les équipes, AWX ou Ansible Automation Platform offrent :

  • RBAC : contrôle d’accès par rôle
  • Audit trail : qui a lancé quoi, quand
  • Approbations : workflow de validation avant exécution
  • Credentials vault : stockage centralisé et sécurisé
[defaults]
# Logs pour audit
log_path = /var/log/ansible/ansible.log
# Timeout raisonnable
timeout = 30
# Ne pas afficher les mots de passe dans les diff
display_args_to_stdout = False
display_skipped_hosts = True
# Désactiver les warnings obsolètes en prod (mais les traiter !)
# deprecation_warnings = False
[ssh_connection]
# Réutiliser les connexions SSH
pipelining = True
# Timeout de connexion
timeout = 10
[privilege_escalation]
# Ne pas activer become par défaut
become = False

Attention : Ansible charge le premier ansible.cfg trouvé dans cet ordre :

  1. $ANSIBLE_CONFIG (variable d’environnement)
  2. ./ansible.cfg (répertoire courant)
  3. ~/.ansible.cfg (home de l’utilisateur)
  4. /etc/ansible/ansible.cfg (système)

Avant de déployer en production :

  • Secrets chiffrés avec Vault (pas de credentials en clair)
  • no_log: true sur les tâches manipulant des secrets
  • become limité aux tâches qui en ont besoin
  • Versions des collections/rôles épinglées
  • ansible-lint passé sans erreur critique
  • Dry-run (--check --diff) exécuté et vérifié
  • Clés SSH différentes par environnement
  • Logs activés pour l’audit
  1. Les secrets ne doivent jamais apparaître en clair — Vault, no_log, et gestionnaires externes.

  2. Moindre privilège partoutbecome ciblé, credentials séparés par environnement.

  3. La supply chain est un risque — vérifiez, épinglez, auditez les collections et rôles tiers.

  4. Validez avant d’exécuter — ansible-lint, —check, Molecule.

  5. Tracez tout — logs, AWX, historique Git pour l’audit et la conformité.

Maintenez vos compétences à jour en répondant au quiz suivant sur la sécurité Ansible.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
7 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre