Prenons l'exemple suivant, je possède un utilisateur "toto" avec pour mot de passe "toto"
Ce que vous retrouverez "souvent" dans des environnements dit "débutants" seront des "hardcoded credentials" ceci est une faille de sécurité claire puisque votre identifiant et mot de passe sont stockés en clair dans un fichier.
Par exemple dans la partie ad-hoc présenté précédemment vous aviez dans le fichier "hosts" ceci :
#Premier hôte
192.168.10.5 ansible_user=ilan ansible_password=ilan ansible_ssh_common_args='-o StrictHostKeyChecking=no'
#Second hôte
192.168.10.6 ansible_user=ilan ansible_password=ilan ansible_ssh_common_args='-o StrictHostKeyChecking=no'
On retrouve donc a chaque fois une "variable" ansible_user & ansible_password fournissant le mdp OS de la machine (ici 192.168.10.5 et 10.6)
Pour palier à cela, vous pouvez utiliser le Ansible-Vault.
Dans un premier temps créez dans votre projet un fichier credentials.yml et renseignez le normalement :
#Première étape créer le fichier credentials
vim files/secrets/credentials.yml
# Dans le fichier credentials renseigner ceci
ansible_password: ilan
Ensuite nous allons utiliser la commande ansible-vault pour chiffrer le fichier.
ansible-vault encrypt files/secrets/credentials.yml
Il vous demandera alors un mot de passe Vault, renseignez le et gardez le en tête.
Une fois le mdp renseignez, si vous affichez votre fichier il sera chiffré :
# J'affiche le contenu
cat files/secrets/credentials.yml
# Voici le contenu
$ANSIBLE_VAULT;1.1;AES256
34333031633836353638656131323338346239313562633430396638623833313535636435383931
3430313237363561613939653332323666663930373831310a653535376162326131323938346663
35366330333434373232303839653765363934393436323363313561356139366161613836323664
3931343334663838340a323461326139643364653030313938313631383562626637303934373763
62363763383561306430333033306435333235663338366531353664333135303463
Récupérez ensuite le playbook basique créé précédement
---
- name: "Apache installation using docker"
hosts: prod
become: true
tasks:
- name: Create Apache container
docker_container:
name: webapp
image: httpd
ports:
- "80:80"
Et ajoutez ensuite une option "vars_files" permettant de spécifier l'emplacement de votre fichier de credentials
---
- name: "Apache installation using docker"
hosts: prod
become: true
vars_files:
- files/secrets/credentials.yml
tasks:
- name: Create Apache container
docker_container:
name: webapp
image: httpd
ports:
- "80:80"
Au moment de lancer votre playbook, ajoutez alors l'option --ask-vault-pass, il vous demandera alors au moment de l'exécution le mdp du Vault renseigné plus tôt.
ansible-playbook -i hosts.yml --ask-vault-pass deploy.yml
Et voilà ! Vous savez comment sécuriser votre playbook avec un fichier de credentials chiffré !
#Dans un premier temps
ssh-keygen -t rsa
#Dans un second temps
ssh-copy-id <user>@<ip/dns>
Remarque : N'oubliez pas de laisser par défaut id_rsa sinon votre configuration client par défaut ne connait pas d'autres "nom" de clé et vous devrez les renseigner à la main
Dans le fichier de configuration sshd_config du serveur distant décomentez/ajoutez :
PubkeyAuthentication yes
PasswordAuthentication no
Puis redémarrez SSH
sudo systemctl restart sshd
Dans mon cas je vais retourner dans le fichier group_vars/prod.yml qui contient :
---
ansible_user: ilan
ansible_password: "{{ vault_ansible_password }}"
Je le modifie afin qu'il n'utilise plus de mdp
---
ansible_user: ilan
#ansible_password: "{{ vault_ansible_password }}"
Je modifie également mon playbook afin qu'il n'aille plus chercher le fichier credentials.yml
Avant :
---
- name: "Apache installation using docker"
hosts: prod
become: true
vars_files:
- files/secrets/credentials.yml
tasks:
- name: Create Apache container
docker_container:
name: webapp
image: httpd
ports:
- "80:80"
Après :
---
- name: "Apache installation using docker"
hosts: prod
become: true
#vars_files:
# - files/secrets/credentials.yml
tasks:
- name: Create Apache container
docker_container:
name: webapp
image: httpd
ports:
- "80:80"
ansible-playbook -i hosts.yml basics2.yml
Et voilà ! Votre playbook passe par une authentification SSH via clé publique/privée !