
Configuration de la connexion SSH sans mot de passe vers vos noeuds gérés (utilisation des clés SSH)
Maîtrisez la configuration de la connexion SSH sans mot de passe avec des clés SSH pour Ansible. Sécurisez et automatisez l'accès à vos noeuds gérés depuis votre noeud de contrôle. Essentiel pour une automatisation fluide.
L'authentification par clés SSH : la pierre angulaire d'une automatisation Ansible efficace
Pour qu'Ansible puisse gérer vos noeuds distants de manière automatisée et non interactive, il est impératif de mettre en place une méthode d'authentification qui ne nécessite pas la saisie manuelle d'un mot de passe à chaque connexion. La méthode la plus courante, la plus sécurisée et la plus recommandée pour cela est l'authentification par clé SSH (également appelée authentification par clé publique).
Ce mécanisme repose sur une paire de clés cryptographiques : une clé privée, qui doit rester secrète et protégée sur votre noeud de contrôle Ansible, et une clé publique correspondante, qui est copiée sur les noeuds gérés que vous souhaitez administrer. Lorsqu'Ansible tente de se connecter à un noeud géré, le serveur SSH sur ce noeud utilise la clé publique pour vérifier l'authenticité de la connexion initiée par le noeud de contrôle (qui prouve sa possession de la clé privée correspondante). Si la vérification réussit, la connexion est établie sans qu'aucun mot de passe ne soit échangé.
Cette configuration est non seulement plus sécurisée que l'authentification par mot de passe (car les mots de passe ne transitent pas sur le réseau et les clés peuvent être beaucoup plus complexes), mais elle est aussi indispensable pour l'exécution de playbooks Ansible qui opèrent sur de nombreux hôtes ou qui s'exécutent de manière planifiée, sans intervention humaine.
Etape 1 : Générer une paire de clés SSH sur le noeud de contrôle
Si vous ne disposez pas déjà d'une paire de clés SSH que vous souhaitez utiliser pour Ansible sur votre noeud de contrôle, la première étape est d'en générer une. Cela se fait à l'aide de l'outil `ssh-keygen`.
Ouvrez un terminal sur votre noeud de contrôle Ansible et exécutez la commande suivante :
ssh-keygen -t rsa -b 4096 -C "votre_email@example.com"
Décortiquons cette commande :
- `ssh-keygen`: L'utilitaire de génération de clés.
- `-t rsa`: Spécifie le type de clé à créer. RSA est un algorithme courant et robuste. D'autres options modernes incluent `ed25519`, qui est souvent préféré pour sa sécurité et ses performances. Si vous utilisez `ed25519`, l'option `-b` (taille en bits) n'est pas nécessaire car la taille est fixe.
- `-b 4096`: Spécifie la taille de la clé en bits pour RSA. Une taille de 2048 bits est souvent considérée comme le minimum, mais 4096 bits offre une sécurité accrue.
- `-C "votre_email@example.com"`: Ajoute un commentaire à la clé, généralement votre adresse e-mail. C'est utile pour identifier la clé, mais c'est optionnel.
Lorsque vous exécutez cette commande, `ssh-keygen` vous posera quelques questions :
1. "Enter file in which to save the key (/home/votre_utilisateur/.ssh/id_rsa):" : Indique où enregistrer la clé. Par défaut, il propose `~/.ssh/id_rsa` (pour la clé privée) et `~/.ssh/id_rsa.pub` (pour la clé publique). Il est généralement recommandé d'accepter l'emplacement par défaut en appuyant sur Entrée, surtout si c'est votre première clé ou votre clé principale. Si vous avez déjà une clé `id_rsa`, vous pouvez spécifier un nom de fichier différent (par exemple, `~/.ssh/ansible_rsa`) pour créer une clé dédiée à Ansible.
2. "Enter passphrase (empty for no passphrase):" : Vous demande de saisir une phrase de passe (passphrase) pour protéger votre clé privée. Si vous définissez une passphrase, vous devrez la saisir chaque fois que la clé privée est utilisée, à moins d'utiliser un agent SSH (`ssh-agent`) pour la mémoriser. Pour une automatisation Ansible entièrement non interactive, il est souvent nécessaire d'avoir une clé sans passphrase, ou d'utiliser un `ssh-agent` correctement configuré. Si vous optez pour une clé sans passphrase (en appuyant sur Entrée sans rien saisir), assurez-vous que votre clé privée est très bien protégée sur votre noeud de contrôle (permissions de fichier restrictives).
Une fois la génération terminée, vous aurez deux nouveaux fichiers dans votre répertoire `~/.ssh/` (ou l'emplacement que vous avez spécifié) :
- `id_rsa` (ou le nom que vous avez choisi) : C'est votre clé privée. NE LA PARTAGEZ JAMAIS. Elle doit être protégée avec des permissions restrictives (typiquement `600`, soit lecture/écriture uniquement pour le propriétaire).
- `id_rsa.pub` (ou `nom_choisi.pub`) : C'est votre clé publique. C'est cette clé que vous allez copier sur les noeuds gérés.
Etape 2 : Copier la clé publique SSH sur les noeuds gérés
Maintenant que vous avez une clé publique, vous devez l'installer sur chaque noeud géré auquel vous souhaitez qu'Ansible se connecte sans mot de passe. La clé publique doit être ajoutée au fichier `~/.ssh/authorized_keys` de l'utilisateur distant avec lequel Ansible se connectera sur le noeud géré (par exemple, `~/.ssh/authorized_keys` pour l'utilisateur `ansible_user` sur `managed_node1`).
La méthode la plus simple et la plus recommandée pour copier la clé publique est d'utiliser l'utilitaire `ssh-copy-id`. Si cet utilitaire n'est pas disponible sur votre noeud de contrôle (il l'est sur la plupart des systèmes Linux et macOS), une méthode manuelle est également possible.
Utilisation de `ssh-copy-id` (méthode recommandée) :Depuis votre noeud de contrôle, pour chaque noeud géré, exécutez :
ssh-copy-id utilisateur_distant@adresse_noeud_gere
Par exemple, si votre utilisateur sur le noeud géré `server1.example.com` est `admin_user` et que vous voulez utiliser la clé `~/.ssh/id_rsa.pub` (la clé par défaut) :
ssh-copy-id admin_user@server1.example.com
Si vous avez généré une clé avec un nom spécifique (par exemple, `~/.ssh/ansible_rsa.pub`), vous pouvez le spécifier avec l'option `-i` :
ssh-copy-id -i ~/.ssh/ansible_rsa.pub admin_user@server1.example.com
`ssh-copy-id` vous demandera le mot de passe de `utilisateur_distant` sur `adresse_noeud_gere` une dernière fois. Une fois le mot de passe fourni, l'outil se connectera au noeud géré, créera le répertoire `~/.ssh` et le fichier `authorized_keys` si nécessaire (avec les bonnes permissions), et y ajoutera votre clé publique.
Méthode manuelle (si `ssh-copy-id` n'est pas disponible) :Si `ssh-copy-id` n'est pas disponible, vous pouvez copier la clé manuellement. D'abord, affichez le contenu de votre fichier de clé publique sur le noeud de contrôle :
cat ~/.ssh/id_rsa.pub
Copiez la sortie de cette commande (qui ressemble à `ssh-rsa AAAA... votre_email@example.com`). Ensuite, connectez-vous via SSH à votre noeud géré en utilisant le mot de passe :
ssh utilisateur_distant@adresse_noeud_gere
Une fois connecté au noeud géré, exécutez les commandes suivantes pour ajouter la clé copiée au fichier `authorized_keys` :
# Sur le noeud géré
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
echo "CONTENU_DE_VOTRE_CLE_PUBLIQUE_COLLE_ICI" >> ~/.ssh/authorized_keys
Assurez-vous que les permissions sur le répertoire `~/.ssh` (700) et sur le fichier `authorized_keys` (600) sont correctes, car des permissions trop laxistes peuvent empêcher l'authentification par clé de fonctionner.
Répétez cette opération pour chaque noeud géré que vous souhaitez administrer avec Ansible.
Etape 3 : Tester la connexion SSH sans mot de passe
Après avoir copié votre clé publique sur un noeud géré, vous devriez pouvoir vous y connecter via SSH depuis votre noeud de contrôle sans qu'on vous demande de mot de passe.
Testez cela en exécutant :
ssh utilisateur_distant@adresse_noeud_gere
Si tout est correctement configuré, vous devriez être connecté directement. Si on vous demande encore un mot de passe, vérifiez les points suivants :
- Les permissions des fichiers et répertoires `~/.ssh` et `~/.ssh/authorized_keys` sur le noeud géré sont-elles correctes (`700` pour `~/.ssh`, `600` pour `authorized_keys`) ?
- La clé publique a-t-elle été correctement copiée dans `authorized_keys` (pas de caractères manquants ou en trop) ?
- Le serveur SSH sur le noeud géré est-il configuré pour autoriser l'authentification par clé publique (`PubkeyAuthentication yes` dans `/etc/ssh/sshd_config`) ? (Un redémarrage du service `sshd` peut être nécessaire après modification de `sshd_config`).
- Si vous utilisez une clé avec passphrase, avez-vous ajouté la clé à votre `ssh-agent` (`ssh-add ~/.ssh/votre_cle_privee`) ?
Une fois que la connexion SSH sans mot de passe fonctionne pour tous vos noeuds gérés, Ansible pourra communiquer avec eux de manière fluide et automatisée. C'est une étape fondamentale pour une expérience Ansible réussie.