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.
Gestion des secrets
Section intitulée « Gestion des secrets »Les playbooks manipulent des données sensibles : mots de passe, clés API, certificats, tokens. Ces secrets ne doivent jamais apparaître en clair.
Les anti-patterns à éviter
Section intitulée « Les anti-patterns à éviter »| Anti-pattern | Risque | Solution |
|---|---|---|
| Mot de passe en clair dans une variable | Exposition dans Git, logs, historique | Ansible Vault |
vault_password_file commité | Tout le monde peut déchiffrer | .gitignore + variable d’environnement |
| Secret affiché dans les logs | Visibilité dans CI/CD, AWX | no_log: true sur les tâches |
| Un seul mot de passe Vault | Compromission totale si fuite | Vault IDs par environnement |
Credentials dans --extra-vars | Visible dans ps aux | Fichier chiffré ou variable d’environnement |
Utiliser no_log correctement
Section intitulée « Utiliser no_log correctement »- 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 logsInté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 :
| Solution | Usage | Lookup Ansible |
|---|---|---|
| HashiCorp Vault | Secrets dynamiques, rotation | community.hashi_vault.vault_read |
| AWS Secrets Manager | Environnements AWS | amazon.aws.secretsmanager_secret |
| Azure Key Vault | Environnements Azure | azure.azcollection.azure_keyvault_secret |
| CyberArk | Entreprise, compliance | cyberark.conjur.conjur_variable |
Pour approfondir : Gestion des secrets
Principe de moindre privilège
Section intitulée « Principe de moindre privilège »Le principe de moindre privilège s’applique à plusieurs niveaux avec Ansible.
Sur le control node
Section intitulée « Sur le control node »L’utilisateur qui exécute Ansible n’a pas besoin d’être root :
# Créer un utilisateur dédiésudo useradd -m -s /bin/bash ansiblesudo mkdir -p /home/ansible/.sshsudo chown -R ansible:ansible /home/ansibleProtégez les fichiers sensibles :
chmod 600 ~/.ansible/vault_passwordchmod 600 inventory/group_vars/*/vault.ymlchmod 700 ~/.sshSur les managed nodes
Section intitulée « Sur les managed nodes »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 droitsCredentials par environnement
Section intitulée « Credentials par environnement »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)Supply chain des collections et rôles
Section intitulée « Supply chain des collections et rôles »Les attaques supply chain concernent aussi Ansible. Une collection ou un rôle compromis peut exécuter du code arbitraire sur votre infrastructure.
Vérifier la provenance
Section intitulée « Vérifier la provenance »Avant d’utiliser une collection ou un rôle tiers :
- Vérifiez le namespace : préférez les namespaces officiels (
ansible.*,community.*, éditeurs connus) - Consultez le code source : lisez au moins les tâches principales
- Vérifiez la maintenance : commits récents, issues traitées
- Utilisez OpenSSF Scorecard : évaluez la posture sécurité du dépôt
Épingler les versions
Section intitulée « Épingler les versions »Ne laissez jamais Ansible installer la “dernière version” :
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éeMiroir privé pour les environnements sensibles
Section intitulée « Miroir privé pour les environnements sensibles »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
Modules à risque
Section intitulée « Modules à risque »Certains modules Ansible présentent des risques de sécurité accrus.
shell, command, raw : injection de commandes
Section intitulée « shell, command, raw : injection de commandes »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: absentQuand utiliser les modules shell ?
Section intitulée « Quand utiliser les modules shell ? »| Situation | Recommandation |
|---|---|
| Tâche réalisable avec un module | Utiliser le module (idempotent, sécurisé) |
| Script complexe existant | Copier le script, exécuter avec script |
| Commande ponctuelle simple | command avec validation des entrées |
| Pipes, redirections nécessaires | shell avec no_log si données sensibles |
Valider les entrées
Section intitulée « Valider les entrées »- 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: presentValidation du code
Section intitulée « Validation du code »Avant d’exécuter un playbook en production, validez-le.
Outils de validation
Section intitulée « Outils de validation »| Outil | Usage | Commande |
|---|---|---|
| Syntaxe YAML | Erreurs de parsing | ansible-playbook --syntax-check |
| ansible-lint | Bonnes pratiques, sécurité | ansible-lint playbook.yml |
| yamllint | Style YAML strict | yamllint . |
| Dry-run | Voir les changements | ansible-playbook --check --diff |
Intégration CI/CD
Section intitulée « Intégration CI/CD »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 testMolecule pour les tests de rôles
Section intitulée « Molecule pour les tests de rôles »Molecule permet de tester vos rôles dans des conteneurs isolés :
# Initialiser Molecule dans un rôlemolecule init scenario -d docker
# Exécuter les testsmolecule testSécurisation des connexions
Section intitulée « Sécurisation des connexions »Clés SSH
Section intitulée « Clés SSH »- 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
host_key_checking
Section intitulée « host_key_checking »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 ...Connexion via bastion
Section intitulée « Connexion via bastion »Pour les environnements isolés :
# ansible.cfg ou inventory[ssh_connection]ssh_args = -o ProxyJump=bastion.example.comTraçabilité et audit
Section intitulée « Traçabilité et audit »Activer les logs
Section intitulée « Activer les logs »# ansible.cfg[defaults]log_path = /var/log/ansible/ansible.logProtégez le fichier de log :
sudo mkdir -p /var/log/ansiblesudo chown ansible:ansible /var/log/ansiblesudo chmod 750 /var/log/ansibleCallback plugins pour l’audit
Section intitulée « Callback plugins pour l’audit »# ansible.cfg[defaults]callback_whitelist = json, profile_tasksAWX/AAP pour la centralisation
Section intitulée « AWX/AAP pour la centralisation »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é
Configuration sécurisée
Section intitulée « Configuration sécurisée »Paramètres critiques dans ansible.cfg
Section intitulée « Paramètres critiques dans ansible.cfg »[defaults]# Logs pour auditlog_path = /var/log/ansible/ansible.log
# Timeout raisonnabletimeout = 30
# Ne pas afficher les mots de passe dans les diffdisplay_args_to_stdout = Falsedisplay_skipped_hosts = True
# Désactiver les warnings obsolètes en prod (mais les traiter !)# deprecation_warnings = False
[ssh_connection]# Réutiliser les connexions SSHpipelining = True
# Timeout de connexiontimeout = 10
[privilege_escalation]# Ne pas activer become par défautbecome = FalseHiérarchie des fichiers ansible.cfg
Section intitulée « Hiérarchie des fichiers ansible.cfg »Attention : Ansible charge le premier ansible.cfg trouvé dans cet ordre :
$ANSIBLE_CONFIG(variable d’environnement)./ansible.cfg(répertoire courant)~/.ansible.cfg(home de l’utilisateur)/etc/ansible/ansible.cfg(système)
Checklist sécurité
Section intitulée « Checklist sécurité »Avant de déployer en production :
- Secrets chiffrés avec Vault (pas de credentials en clair)
-
no_log: truesur les tâches manipulant des secrets -
becomelimité aux tâches qui en ont besoin - Versions des collections/rôles épinglées
-
ansible-lintpassé 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
À retenir
Section intitulée « À retenir »-
Les secrets ne doivent jamais apparaître en clair — Vault,
no_log, et gestionnaires externes. -
Moindre privilège partout —
becomeciblé, credentials séparés par environnement. -
La supply chain est un risque — vérifiez, épinglez, auditez les collections et rôles tiers.
-
Validez avant d’exécuter — ansible-lint, —check, Molecule.
-
Tracez tout — logs, AWX, historique Git pour l’audit et la conformité.
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »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
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
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
Liens utiles
Section intitulée « Liens utiles »- Ansible Vault — Chiffrement des secrets
- Principes de sécurité — Fondamentaux à connaître
- Moindre privilège — Limiter les droits
- Supply chain — Sécuriser les dépendances
- Gestion des secrets — Bonnes pratiques générales