Authentification sur les Target Hosts
Objectif de cet atelier pratique
- Mettre en place l'authentification sur les machines sur lesquelles nous voulons nous acquitter des tâches administratives
Un peu de théorie
Pour commencer, nous allons nous poser une série de questions :
- 
Quel compte utilisateur du ou des Target Hosts est joignable depuis l'extérieur via SSH ? 
- 
Quelle méthode d'authentification sera utilisée ? L'authentification par clé SSH sera le meilleur choix. 
- 
Une fois qu'Ansible s'est authentifié, est-ce qu'on dispose déjà des droits root?
- 
Est-ce qu'il faut augmenter les droits ? Si oui, est-ce qu'on utilise suousudo?
Notre labo constitué d'une panoplie de box Vagrant nous offre un environnement assez homogène :
- 
Chaque système est accessible via le compte vagrantavec le mot de passevagrant.
- 
L'élévation des droits s'effectue avec sudo.
Un peu de pratique
Placez-vous dans le répertoire du deuxième atelier pratique :
Voici les quatre machines virtuelles de cet atelier :
| Machine virtuelle | Adresse IP | 
|---|---|
| ansible | 192.168.56.10 | 
| rocky | 192.168.56.20 | 
| debian | 192.168.56.30 | 
| suse | 192.168.56.40 | 
Démarrez les VM :
Connectez-vous au Control Host :
Ansible est déjà installé sur cette machine :
Notre environnement ne fournit pas de résolution DNS. Étant donné qu'il vaut
mieux travailler avec des noms d'hôtes qu'avec des adresses IP, nous allons
éditer le fichier /etc/hosts du Control Host. La VM fournit les éditeurs de
texte vim et nano à cet effet :
# /etc/hosts
127.0.0.1      localhost.localdomain  localhost
192.168.56.10  ansible.sandbox.lan    ansible
192.168.56.20  rocky.sandbox.lan      rocky
192.168.56.30  debian.sandbox.lan     debian
192.168.56.40  suse.sandbox.lan       suse
Ce n'est pas une mauvaise idée de tester la connectivité de base de nos VM :
$ for HOST in rocky debian suse; do ping -c 1 -q $HOST; done
PING rocky.sandbox.lan (192.168.56.20) 56(84) bytes of data.
1 packets transmitted, 1 received, 0% packet loss, time 0ms
PING debian.sandbox.lan (192.168.56.30) 56(84) bytes of data.
1 packets transmitted, 1 received, 0% packet loss, time 0ms
PING suse.sandbox.lan (192.168.56.40) 56(84) bytes of data.
1 packets transmitted, 1 received, 0% packet loss, time 0ms
Je vais d'abord collecter les clés SSH publiques des Target Hosts :
$ ssh-keyscan -t rsa rocky debian suse >> .ssh/known_hosts
# suse:22 SSH-2.0-OpenSSH_8.4
# rocky:22 SSH-2.0-OpenSSH_8.7
# debian:22 SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2
Si j'essaie de me connecter successivement à tous mes Target Hosts depuis le
Control Host, je m'aperçois que l'hôte rocky pose problème :
Cela tient du fait que la box Vagrant de Rocky Linux interdit la connexion SSH par mot de passe dans sa configuration par défaut. Je dois donc me connecter à cette box depuis Vagrant et reconfigurer SSH :
J'identifie l'option qui permet l'authentification par mot de passe :
...
PasswordAuthentication yes
#PermitEmptyPasswords no
#PasswordAuthentication no
...
Je prends en compte la nouvelle configuration :
Je me reconnecte au Control Host :
Partant de là, je peux mettre en place l'authentification par clé SSH depuis le Control Host. Je génère une paire de clés SSH en acceptant toutes les options par défaut :
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): [Entrée]
Enter passphrase (empty for no passphrase): [Entrée]
Enter same passphrase again: [Entrée]
Your identification has been saved in /home/vagrant/.ssh/id_rsa
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:1ll42oV6A43V9nyKokliTTSn1hW8UTj6LAYbdjkZWx4 vagrant@ansible
The key's randomart image is:
+---[RSA 3072]----+
|           .o=.  |
|        o o=E.o  |
|       . =+X=*.o |
|        B.OOo.  +|
|       =S==++. ..|
|      o.+ +.+..  |
|     . o + o     |
|        o        |
|                 |
+----[SHA256]-----+
Je distribue la clé publique sur mes Target Hosts en fournissant à chaque
fois le mot de passe vagrant :
$ ssh-copy-id vagrant@rocky
...
vagrant@rocky's password: *******
Number of key(s) added: 1
$ ssh-copy-id vagrant@debian
...
vagrant@debian's password: *******
Number of key(s) added: 1
$ ssh-copy-id vagrant@suse
...
vagrant@suse's password: *******
Number of key(s) added: 1
Un premier test sans configuration
Un ping Ansible nous permet de tester le bon fonctionnement de
l'authentification sur les Target Hosts :
$ ansible all -i debian,rocky,suse -u vagrant -m ping
debian | SUCCESS => ...
rocky  | SUCCESS => ...
suse   | SUCCESS => ...
Avertissement sur l'interpréteur Python
Ne vous laissez pas perturber par un avertissement du genre [WARNING]:
Platform linux on host suse is using the discovered Python interpreter at
/usr/bin/python3.6. En langage tam-tam, cela signifie que l'hôte en
question n'est doté que d'un interpréteur Python minimal. Nous verrons cela
en temps et en heure.
L'option -u vagrant n'est pas vraiment nécessaire ici, étant donné que le
compte utilisateur local vagrant est identique au compte utilisateur sur la
cible :
$ ansible all -i debian,rocky,suse -m ping
debian | SUCCESS => ...
rocky  | SUCCESS => ...
suse   | SUCCESS => ...
En dehors de l'avertissement sur l'interpréteur Python, on peut dire que l'opération est un succès et que tout fonctionne comme prévu.
Quittez le Control Host :
Supprimez toutes les VM :
À vous de jouer !
Placez-vous dans le répertoire du troisième atelier pratique :
Voici les quatre machines virtuelles Ubuntu 22.04 de cet atelier :
| Machine virtuelle | Adresse IP | 
|---|---|
| control | 192.168.56.10 | 
| target01 | 192.168.56.20 | 
| target02 | 192.168.56.30 | 
| target03 | 192.168.56.40 | 
Démarrez les VM :
Connectez-vous au Control Host :
Ansible est déjà installé sur cette machine :
Faites le nécessaire pour réussir un ping Ansible comme ceci :
$ ansible all -i target01,target02,target03 -m ping
target03 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
target02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
target01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
