Authentification SSH sans mot de passe avec une clé SSH de type RSA ou DSA
Nous naviguons à travers nos serveurs, ici, là bas, et au final, on se retrouve avec une ribambelle de mot de passe à retenir. La connexion par le biais du service SSH sur vos machines Unix/Linux (Debian 5 de préférence :D) sans mot de passe est devenu monnaie courante, voyons voir comment mettre en place ce type d'authentification.
But de ce billet
Vous en avez marre de vous authentifier à chaque fois sur votre serveur de production ou simplement sur votre ordinateur personnel ? Le service OpenSSH offre la possibilité de s'authentifier (et donc, se connecter) sans mot de passe, à l'aide des fameuses clés SSH de type RSA ou DSA.
Mise en situation
Afin de vous expliquer au mieux la démarche à suivre, voici un exemple concret.
Nous avons, un serveur (ou du moins, un ordinateur avec le service openssh-server allumé) que nous allons nommer "server". Sur ce serveur, nous avons un compte utilisateur, appelons le "user_server".
De l'autre côté, nous avons notre poste client, qui lui s'appelle "local". L'utilisateur sur le poste client s'appelle "user_local".
Configuration du service OpenSSH sur le serveur.
Votre serveur doit accepter l'authentification via des clés SSH.
Pour se faire, éditons la configuration du service OpenSSH. Un petit vi /etc/ssh/sshd_config. Nous vérifions que la ligne "AuthorizedKeysFile" est décommentée comme ci-dessous. Nous profitons de cette édition pour vérifier également que la permission de s'authentifier directement en "super utilisateur" est impossible via "AllowRootLogin" à "no" (Merci @rhaamo pour cet éclaircissement) Par défaut sous Debian, cette valeur est à "without-password"
user_server@server:~$ vi /etc/ssh/sshd_config AuthorizedKeysFile %h/.ssh/authorized_keys AllowRootLogin no
Rechargeons notre configuration OpenSSH.
sudo /etc/init.d/ssh reload
La configuration du service OpenSSH étant maintenant terminée, Passons à la suite.
Création d'une clé SSH sur notre poste client.
Cette partie du billet ne vous sera utile que si vous ne disposez pas déjà d'une clé SSH. Si c'est le cas, passez à la partie suivante Installation de ma clé SSH publique sur le serveur., sinon, continuez la lecture ;-)
Pour générer une clé SSH, il existe plusieurs chiffrement dont 2 particulièrement RSA et DSA. Après nombreux commentaires à ce sujet, et en allant un peu plus loin, difficile de choisir quel est la meilleure "sécurité", DSA tire la couverture vers elle à en croire cette page (Merci à @rhaamo pour m'avoir averti des autres possibilités)
Créons une clé DSA.
ssh-keygen -t dsa
Il vous sera demandé si vous voulez appliquer une "passphrase" sur votre clé SSH. Si vous choisissez de ne pas renseigner cette "passphrase", alors, si jamais vous perdez votre clé, n'importe qui pourra se connecter sur vos différents serveurs. Il est très dangereux de laisser une clé sans "passphrase"
La génération faite, vous allez avoir 2 fichiers dans votre /home/user_local/.ssh/
- id_dsa : Elle est la clé privée, ne jamais la divulguer.
- id_dsa.pub : C'est la partie publique de votre clé SSH, c'est celle-ci qui nous intéresse.
Afin d'éviter de ne devoir retaper sa passphrase, il existe "ssh-keygen", voir la partie "SSH-AGENT" de la page Configurer et utiliser SSH
Installation de ma clé SSH publique sur le serveur.
Méthode automatisée
Rien de plus simple (Merci chatmoa), il existe une commande (ssh-copy-id) sur le poste client pour "directement" ajouter notre clé publique dans le fichier "~/.ssh/authorized_keys" de l'utilisateur visé. Attention tout de même, cette commande n'est pas disponible sur toutes les distributions. Présente sur RedHat/Debian et Ubuntu, mais pas sur les *BSD.(@rhaamo)
user_local@local: ~$ ssh-copy-id user_server@server
Après avoir renseigné notre mot de passe pour la dernière fois, la clé publique est copiée sur le compte utilisateur "user_server" du serveur.
Méthode manuelle
Pour commencer, nous allons transférer notre clé SSH publique sur le serveur.
scp /home/user_local/.ssh/id_rsa.pub user_server@server:/home/user_server/
Cette commande a pour but de copier la clé /home/user_local/.ssh/id_rsa.pub dans le répertoire /home/user_server du serveur. On va vous demander le mot de passe concernant l'utilisateur "user_server".
Connectons nous maintenant sur le serveur afin de créer le fichier ".ssh/authorized_keys".
ssh user_server@server cat /home/user_server/id_rsa.pub >> /home/user_server/.ssh/authorized_keys
Faites bien attention aux droits du fichier "authorized_keys", en effet, si le fichier ne possède pas les bons droits (600), il se peut qu'il ne soit pas lu et donc, notre authentification par clé SSH ne fonctionnera pas. (Clin d'œil à Yop69 du Forum-Ubuntu)
Test de la configuration
Maintenant que tout est configuré, testons ensemble.
user_local@local:~ $ ssh user_server@server Linux 2.6.26-1-amd64 #1 SMP Sat Jan 10 17:57:00 UTC 2009 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. user_server@server:~$
Petit TIP
Il se peut que le service OpenSSH ne soit pas sur le port par défaut (22), ce qui est d'ailleurs est une bonne chose, au vu des nombreux scanners de ports.
Votre service OpenSSH tourne sur le port 54000, vous n'avez plus à taper votre mot de passe (grâce aux clés SSH), mais vous devez spécifier le port à chaque connection SSH. Comme ci-dessous.
ssh user_server@server -p 54000
Pour configurer automatiquement toute connexion SSH à "server" sur le port 54000 en utilisant l'utilisateur user_server, ajoutez ceci dans ~/.ssh/config de votre poste client. (@than, merci pour ton commentaire)
Host server Hostname server.domaine.fr Port 54000 User user_sever
Et voilà, vous vous connecterez de la manière suivante maintenant.
ssh server
N'hésitez pas à me faire de vos remarques et de vos suggestions.
Bonne journée à tous.
Mickaël.