Administration à distance via SSH et authentification par clé publique

Installation et configuration d’OpenSSH

Notre serveur est maintenant opérationnel, néanmoins il est obligatoire d’être présent physiquement devant celui-ci pour l’administrer. Nous allons changer cela en permettant la connexion depuis une machine distante à ce serveur grâce au logiciel SSH, et nous compléterons le tout en permettant de nous authentifier sans saisir de mot de passe par l’utilisation d’une paire de clés RSA.

Installation d’openssh-server

riri@srv-debian:~$ sudo aptitude install openssh-server

Aptitude affiche la liste des paquets à installer et demande on confirmation, on confirme en tapant y puis en validant. Aptitude télécharge alors les paquets requis et installe automatiquement openssh-server et ses dépendances. Durant le processus d’installation openssh génère automatiquement une clé RSA et DSA qui serviront à chiffrer le trafic entre le client et le serveur. Il est d’ores et déjà possible de se connecter au serveur depuis une machine cliente.

Deux possibilités :

Machine cliente sous Windows

  • Télécharger Putty depuis le site officiel
  • Installer Putty
  • Lancer Putty depuis le menu Démarrer
  • Configuration de Putty :
    • Dans le champ « Host name », saisir l’adresse du serveur. Dans mon cas, 10.0.0.2, pour votre serveur, soit vous connaissez l’adresse IP, soit la commande « ifconfig » sur le serveur vous la donnera.
    • Dans la rubrique « Translation » sous l’item « Windows » dans le menu de gauche, choisir « UTF-8 ».
    • Sauvegardez les paramètres de connexion en revenant dans la rubrique « Session » puis en saisissant un nom pour les paramètres dans la zone de texte « Saved sessions » (par exemple srv-debian) puis en cliquant sur « Save »
    • Ne reste plus qu’à cliquer sur « Open » au bas de la fenêtre pour ouvrir la session sur le serveur.

Machine cliente sous linux

  • Si ce n’est pas déjà le cas, installer le paquetage openssh-client (soit via la commande « sudo aptitude install openssh-client » sous débian, soit selon la méthode idoine sous un autre OS Linux)
  • Taper la commande ssh -l nomutilisateur ipduserveur et valider.
  • Accepter la clé hôte quand le client le demande puis le mot de passe de l’utilisateur. Vous êtes maintenant connecté au serveur !

On peut ainsi ouvrir une session avec un nom d’utilisateur existant sur le serveur (dans mon cas, riri et root). Il faut désormais configurer le fichier sshd.conf pour sécuriser notre serveur. Pour cela, on tape
riri@srv-debian:~$ sudo nano /etc/ssh/sshd_config
Voici le contenu de ce fichier :

# Package generated configuration file
# See the sshd(8) manpage for details

# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2 # Version du protocole utilisé par ssh, la version 2 est la plus récente, la v1 est obsolète
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key #Emplacement de la clé RSA du serveur
HostKey /etc/ssh/ssh_host_dsa_key #Emplacement de la clé DSA du serveur
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes #Spécifie si sshd sépare les privilèges en créant un processus fils
#non privilégié pour prendre en charge le trafic réseau entrant.
#Après une authentification réussie, un autre processus est créé
#avec les privilèges de l’utilisateur authentifié. Le but de la séparation
#de privilèges est d’éviter l’escalade de privilèges si le processus
#non privilégié est corrompu. Par défaut « yes ».

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600 # Utilisé dans le cas de l’utilisation de la v1 du protocole ssh
ServerKeyBits 768

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120 # Temps en secondes avant lequel le serveur coupe la connexion
# si aucune information d’authentification n’est fournie
PermitRootLogin yes # Autorise la connexion en tant que root. Il faut passer cette option à no
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes # Autorise l’authentification par clé publique
#AuthorizedKeysFile %h/.ssh/authorized_keys

# Don’t read the user’s ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don’t trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no # Empêche l’utilisation de mots de passe vides

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

X11Forwarding yes # Permet de déporter l’affichage graphique du serveur sur le client
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes # Maintient la connexion ouverte
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# Sous système SFTP pour le transfert de fichiers
Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM yes

 

On change la valeur de la ligne PermitRootLogin de « yes » à « no ». On enregistre en faisant Ctrl-X puis « o » pour valider les changements.

Redémarrer le serveur avec la commande :
riri@srv-debian:~$ sudo /etc/init.d/ssh restart
Il est désormais impossible de se logger en tant que « root ». Il faudra désormais se connecter avec un utilisateur standard et passer soit par la commande « su root » pour devenir « root » une fois connecté ou bien préfixer les commandes par l’instruction « sudo » comme vu dans un article précédent.

La partie suivante va permettre de s’authentifier sans mot de passe et ce en utilisant une paire de clés publique/privée.

Génération des clés

Sous Windows avec PuttyGen

Avec Putty sont venus 2 utilitaires nommés Puttygen et Pageant. Le premier permet de générer le couple de clés qui va nous permettre de nous authentifier, le second permet de configurer le système pour utiliser automatiquement lesdites clés sans avoir à retaper la « passphrase » qui sera utilisée lors de la génération des clés.

Génération de la paire de clés

  • Lancez Puttygen via « Menu démarrer->Putty->Puttygen »
  • Dans la fenêtre qui apparait vérifier que l’option « SSH-2 RSA » est cochée puis cliquer sur « Generate ». Dans la grande zone vide apparait un message invitant à « generate some randomness », c’est à dire introduire un déplacement aléatoireà la souris afin de générer la paire de clés. Pour ce faire, déplacer rapidement la souris dans la zone idoine afin de faire avancer la barre d’avancement de la génération.
  • Une fois la clé générée on se retrouve avec une longue suite de caractères commençant par ssh-rsa et 4 zones de texte ont fait leur apparition. La zone « key fingerprint » correspond à l’empreinte de la clé complète. Cette empreinte unique est transmise lors de la connexion au serveur. C’est une empreinte similaire qui a été transmise au client par le serveur lors de la première connexion. Elle permet de s’assurer que l’interlocuteur est bien celui avec lequel on veut communiquer car elle correspond à une seule et unique clé privée (celle de son propriétaire). La zone « Key comment » permet de rajouter un commentaire pour la clé générée, par exemple « Clé client Windows XP maison », libre à vous de mettre ou non un commentaire. Les champs « passphrase » et « key passphrase » permettent de protéger la clé privée par un mot de passe (ou plus généralement une phrase quelconque) en cas de vol de ladite clé. Je vous recommande de saisir une passphrase assez longue.
  • Lorsque vous avez saisi le commentaire et la passphrase (2 fois), cliquez sur « Save public key » et enregistrez-la sous le nom « id_rsa.pub ». Cliquez ensuite sur « Save private key » et donnez-lui le nom « id_rsa.ppk ». Nos 2 clés sont désormais sauvegardées et la clé privée est protégée par mot de passe.
  • Sélectionnez ensuite l’intégralité du texte de la clé (le texte commençant par « ssh-rsa ») et copiez-la dans le presse-papiers, il correspond à la clé publique qui servira d’une part à vérifier que c’est bien vous qui êtes connecté sur le serveur mais aussi à déchiffrer les données chiffrées par votre clé privée.

Sous linux, avec ssh-keygen

Linux bénéficie d’un outil dédié à la génération de clés pour ssh nommé ssh-keygen. Pour générer celles-ci, on utilise la commande suivante :
ssh-keygen -t rsa -b 1024 -f id_rsa
Cette commande crée une clé rsa de 1024 bits stockée dans le fichier id_rsa. La clé publique se trouve dans le fichier id_rsa.pub. L’utilitaire demande ensuite de saisir une passphrase (de préférence assez longue), je vous conseille de le faire pour protéger votre clé. Si quelqu’un s’empare de la clé privée, s’il ne connait pas la passphrase permettant de la déverrouiller elle ne lui servira à rien. Tapez une seconde fois votre passphrase lorsqu’elle vous est demandée puis validez. Votre paire de clés est créée !

Copie de la clé sur le serveur

Sous Windows

  • Connectez-vous au serveur en utilisant Putty comme vu au début de l’article avec l’utilisateur de votre choix (mais pas root, celui-ci étant désormais désactivé)
  • Tapez les commande suivantes :
    riri@srv-debian:~$ cd
    riri@srv-debian:~$ mkdir .ssh
    riri@srv-debian:~$ cd .ssh
    riri@srv-debian:~$ nano authorized_keys
  • Collez le texte de la clé avec un clic droit (merci le copier/coller rapide de putty) et assurez-vous que la clé tienne sur une seule ligne (supprimez les retours à la ligne qui se sont rajoutés automatiquement)
  • Sauvegardez le fichier en faisant CTrl-x puis « o » puis Entrée

Notre serveur est maintenant prêt à accepter les connexions utilisant une authentification par clé. Quittez Putty puis relancez-le.

Sous linux

Tapez la commande suivante :
riri@srv-debian:~$ ssh-copy-id -i ~/id_rsa.pub user@ipduserveur
Tapez le mot de passe de l’utilisateur lorsqu’il vous est demandé. Et voilà, la clé est automatiquement copiée dans le dossier « /home/nomutilisateur/.ssh/authorized_keys »

Connexion au serveur en utilisant la paire de clés

Sous Windows

  • Dans le menu de gauche, choisir la rubrique « Connection » puis développer la sous-rubrique « SSH » et cliquer sur « Auth »
  • Dans la zone « Private key file for authentication », cliquer sur « Browse » et choisir le fichier « id_rsa.ppk » généré plus tôt
  • Revenir dans la rubrique Session et sauvegarder les paramètres en cliquant une fois sur le nom donné lors de la sauvegarde de la première fois (srv-debian dans mon cas) puis sur « Save »
  • Enfin, cliquer sur « Open » pour ouvrir la session. Saisir le login de l’utilisateur pour lequel vous avez généré les clés et le fichier authorized_keys
  • Lorsqu’elle vous est demandée, saisir la passphrase que vous aviez choisi lors de la génération des clés et valider. Vous voilà maintenant loggé !

Et maintenant ?

Et alors me direz-vous ? Si on ne spécifie pas de clé privée à utiliser pour l’authentification on peut toujours se connecter en utilisant le couple login/pass. Quand on connait la fragilité d’un mot de passe, il vaudrait mieux supprimer la possibilité de se connecter en utilisant celui-ci. Rien de plus simple ! Editez le fichier sshd_config

riri@srv-debian:~$ sudo nano /etc/ssh/sshd_config

Repérez la ligne suivante :

#PasswordAuthentication yes

et remplacez-la par

PasswordAuthentication no

Redémarrez le service ssh avec la commande :

riri@srv-debian:~$ sudo /etc/init.d/ssh restart

Il est désormais impossible de se connecter au serveur par ssh en utilisant un mot de passe !

T’es gentil mais devoir taper la passphrase à chaque fois c’est quand même chiant. Quelque part c’est pas faux :o. Et c’est pour cela que les agents ssh sont là. Sous Windows nous utiliserons Pageant, fourni avec PuTTy tandis que sous linux nous utiliserons les outils ssh-agent et ssh-add. C’est parti !

Utilisation d’un agent pour conserver les clés en mémoire

Sous Windows

Rien de plus simple ! Lancez l’outil pageant depuis le « Menu démarrer –> PuTTy –> Pageant ». Double-cliquez sur l’icône qui est apparue dans la barre des tâches (l’ordinateur avec un trait noir) puis cliquez sur « Add key ». Dans la fenêtre qui apparait, choisissez votre fichier id_rsa.ppk, validez puis saisissez votre passphrase lorsqu’elle vous est demandée et voilà ! La clé privée sera mémorisée sous sa forme décodée pendant toute la durée où la machine sera allumée. Peu importe le nombre de fois où vous lancerez putty, il vous sera uniquement demandé votre login, l’authentification sera faite automatiquement avec votre clé et il n’y aura plus besoin de saisir de mot de passe ou de passphrase

Sous linux

1 comment

  1. […] si compliqué, si ? Votre Debian est désormais opérationnelle, il ne reste plus qu’à lui installer SSH avec une authentification par clé publique, sudo pour éviter de faire des conneries en mode root et vous voilà paré pour configurer un beau […]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *