TP 8 : Vaulter les mots de passe MariaDB du lab existant

Objectif

Reprendre le playbook d’installation MariaDB du lab découverte (avec ses mots de passe en clair) et le sécuriser proprement avec Ansible Vault, sans rien changer au comportement du playbook.

Environnement disponible

Vous disposez de :

  • 1 serveur de contrôle avec Ansible installé
  • 1 client Debian : nrd-db1

Informations de connexion

  • Utilisateur : root
  • Mot de passe : formation

⚠️ Les conteneurs de ce lab repartent de zéro à chaque session. Les premières étapes ci-dessous refont donc systématiquement tout le bootstrap.

Ce que vous allez réaliser

  1. Installer Ansible
  2. Générer une clé SSH et la déployer sur le client
  3. Localiser l’IP et créer l’inventaire
  4. Chiffrer les trois secrets du playbook MariaDB avec encrypt_string : mot de passe root, mot de passe applicatif
  5. Reconstruire le playbook pour qu’il utilise ces variables vaultées plutôt que des valeurs en clair
  6. Configurer ansible.cfg pour ne plus avoir à taper le mot de passe Vault à chaque exécution
  7. Exécuter le playbook et vérifier que MariaDB fonctionne exactement comme avant

Conseils

  • Réutilisez la structure du playbook playbook_mariadb_install.yaml du lab découverte de cette formation — l’objectif ici n’est pas de le réécrire, mais de sécuriser ses variables.
  • N’oubliez pas chmod 600 sur le fichier de mot de passe Vault.
  • Une fois ansible.cfg configuré, plus besoin de --vault-password-file ni --ask-vault-pass en ligne de commande.

🧪 Lab · membre · 30 min

🧪 Lancer le lab
Voir la solutionMasquer la solution

Générer une clé SSH et la déployer sur le client

ssh-keygen -t ed25519 -C "ansible@control-serveur" -f ~/.ssh/id_ed25519 -N ""

ssh root@nrd-db1
nano .ssh/authorized_keys
# Coller la clé publique, sauvegarder

Localiser l’IP et créer l’inventaire

ping nrd-db1

mkdir ansible && cd ansible
nano inventaire.yaml
# inventaire.yaml
all:
  hosts:
    nrd-db1:
      ansible_host: <IP>
ansible all -i inventaire.yaml -m ping

Créer le fichier de mot de passe Vault

echo "MonMotDePasseVault123" > .vault_pass.txt
chmod 600 .vault_pass.txt

Chiffrer les deux secrets

ansible-vault encrypt_string 'SuperRoot123!' --name 'mysql_root_password' --vault-password-file .vault_pass.txt
ansible-vault encrypt_string 'AppPass123!' --name 'app_password' --vault-password-file .vault_pass.txt

Créer le fichier de variables vaultées

mkdir group_vars
nano group_vars/all.yml
# group_vars/all.yml
mysql_root_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          <collez ici le bloc généré pour mysql_root_password>

app_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          <collez ici le bloc généré pour app_password>

Configurer ansible.cfg

nano ansible.cfg
# ansible.cfg
[defaults]
vault_password_file = .vault_pass.txt

Reconstruire le playbook, en s’appuyant sur les variables vaultées plutôt que sur des valeurs en clair

nano playbook_mariadb_secure.yaml
# playbook_mariadb_secure.yaml
---
- name: Installer et configurer MariaDB de façon sécurisée
  hosts: nrd-db1
  become: yes

  vars:
    app_db: appdb
    app_user: appuser

  tasks:
    - name: Installer MariaDB
      ansible.builtin.apt:
        name:
          - mariadb-server
          - python3-pymysql
        state: present
        update_cache: yes

    - name: Démarrer MariaDB
      ansible.builtin.service:
        name: mariadb
        state: started
        enabled: yes

    - name: Définir le mot de passe root
      community.mysql.mysql_user:
        name: root
        host: localhost
        password: "{{ mysql_root_password }}"
        login_unix_socket: /run/mysqld/mysqld.sock
        check_implicit_admin: true
        priv: "*.*:ALL,GRANT"

    - name: Créer la base applicative
      community.mysql.mysql_db:
        name: "{{ app_db }}"
        state: present
        login_user: root
        login_password: "{{ mysql_root_password }}"

    - name: Créer l'utilisateur applicatif
      community.mysql.mysql_user:
        name: "{{ app_user }}"
        password: "{{ app_password }}"
        priv: "{{ app_db }}.*:ALL"
        host: "%"
        state: present
        login_user: root
        login_password: "{{ mysql_root_password }}"

Exécuter le playbook

ansible-playbook playbook_mariadb_secure.yaml -i inventaire.yaml -v

Remarquez : aucune option --vault-password-file ni --ask-vault-pass n’a été nécessaire — ansible.cfg s’en charge automatiquement.

Vérifier que tout fonctionne comme avant

ansible nrd-db1 -i inventaire.yaml -m command -a "mysql -u appuser -pAppPass123! -e 'SHOW DATABASES;'" --become

Vous devriez voir appdb dans la liste des bases — le comportement est identique au lab découverte, mais les deux mots de passe ne sont désormais jamais lisibles en clair dans le playbook ni dans group_vars/all.yml.