SSH : Secure SHell

SSH permet de se connecter à un serveur en mode sécurisé, c'est à dire en minimisant les risques d'espionnage. Si une personne écoute les informations qui transitent entre votre machine (avec un client SSH) et votre serveur (disposant d'un serveur SSH), cette personne ne pourra pas voir ce que vous faites sur le serveur. Les informations qui transitent sont en effet cryptées.

L'installation du serveur SSH (sshd) est simple : aptitude install ssh

Cela installe par la même occasion un client (ssh) et un ensemble de logiciel permettant de gérer vos clefs.

Configuration du serveur

La configuration de base du service SSH est correcte, mais améliorable. Il est en effet recommandé de désactiver la possibilité de se connecter par login/password et de ne permettre que la connexion à travers un échange de clefs (mettre PasswordAuthentication no dans /etc/ssh/sshd_options), ou bien au minimum d'interdire la connexion avec mot de passe vers l'utilisateur root (mettre PermitRootLogin without-password dans /etc/ssh/sshd_options).

Par ailleurs, il est bon de limiter la possibilité de connexion à certains utilisateurs. Pour cela, une technique intéressante est de créer un groupe ssh et d'y placer les utilisateurs désirés. Ensuite, ajouter l'option AllowGroups ssh dans /etc/sshd_options. C'est tout ! (Comme toujours, elancez le service pour que la modification soit prise en compte).

Enfin, dans le cas d'une machine qui sera gérée par plusieurs personnes, donner directement l'accès root via SSH peut-être gênant (qui a fait quoi : logs des connexions difficiles à analyser). Une solution élégante est de bloquer l'accès root direct (PermitRootLogin no), d'ouvrir un accès SSH aux utilisateurs concernés en leur créant chacun un compte et de leur donner un accès aux commandes d'administration via sudo. Cependant, il est parfois indispensable d'avoir l'accès root via SSH, par exemple pour faire une sauvegarde distante avec certains logiciels. Dans ce cas la solution idéale est d'autoriser uniquement les accès restreints à des commandes particulières (PermitRootLogin forced-commands-only).

Un exemple de configuration /etc/ssh/sshd_config est en annexe (tout en bas de la page).

Utilisation de clef publique / clef privée

Un des intérêts de SSH est qu'il vous permet de vous connecter à un serveur distant sans avoir besoin d'indiquer votre mot de passe, uniquement en utilisant un échange de clef selon un algorithme de chiffrement à clé publique. L'idée générale est la suivante :

  1. vous vous créez une paire de clé, l'une privée et l'autre publique
  2. la clé privée reste sur votre ordinateur (dans le sous-répertoire .ssh de votre répertoire personnel), elle est est protégée par cryptage avec un mot de passe

  3. vous placerez la clé publique sur tous les serveurs auxquels vous désirez accéder en toute confidentialité

Concrétement :

  1. Commencez par vous créer une clé : ssh-keygen -b 1024 -t dsa

    Une passphrase vous sera demandée qui protégera votre clé privée par cryptage. Indiquez toujours une passphrase, sinon votre clé privée serait en accessible (et donc utilisable) par l'administrateur de l'ordinateur ou un pirate éventuel ! Une passphrase peut être un simple mot de passe, mais vous pouvez profiter de l'occasion pour utiliser une vraie «phrase de passe» (une phrase entière, telle que «ceci est un mauvais exemple de phrase !»).

  2. Vous disposez alors de deux fichiers, tous deux sont des fichiers textes :
    • $HOME/.ssh/id_dsa : votre clé privée (protégée par cryptage via votre passphrase)

    • $HOME/.ssh/id_dsa.pub : la partie publique de votre clé

  3. Vérifiez à ce moment que le répertoire $HOME/.ssh est lisible seulement par vous : chmod 700 $HOME/.ssh et que la clef privée n'est lisible que par vous : chmod 600 $HOME/.ssh/id_dsa

  4. Sur le serveur distant, vous devrez ajouter le contenu du fichier local id_dsa.pub au fichier $HOME/.ssh/authorized_keys du serveur. Pour cela, il vous faudra accéder au serveur par un autre moyen (telnet, FTP, ssh avec accès par mot de passe, etc) ou contacter l'administrateur de ce serveur.

A partir de ce moment, vous pourrez vous connecter avec ssh nom.du.serveur : votre passphrase vous sera demandée afin que votre client ssh puisse lire votre clé privée, un message crypté avec cette clé sera envoyé au serveur qui pourra la décrypter avec la clef publique, etc... (je ne vais pas faire un topo sur le fonctionnement d'un système à clé publique, si ça vous intéresse demandez à Google).

Vous noterez déjà une chose : lorsque vous tapez votre passphrase, c'est votre ordinateur local qui travaille (le client ssh). Cette passphrase est uniquement destinée à pouvoir utiliser la clé privée locale, elle n'est jamais et ne doit en aucun cas être transmise sur le réseau. Ne tapez jamais une passphrase sur une machine distante si vous n'en êtes pas l'administrateur ou si la connexion n'est pas sécurisée (cryptée) !

Lors de votre première connexion au serveur distant, assurez-vous que vous être le seul à pouvoir modifier le fichier des clefs publiques autorisées, en tapant par exemple : chmod 644 $HOME/.ssh/authorized_keys. Vous pouvez même faire un chmod 600 afin que personne ne puisse deviner qui vous êtes (en cherchant sous google votre clef ou l'empreinte de votre clef, on pourrait tomber sur une de vos pages : c'est de la paranoïa, mais... qui sait !).

Utilisation d'un agent SSH

Saisir sa passphrase à chaque connexion ssh peut être fastidieux. Heureusement, un agent SSH va nous simplifier la vie. Ce logiciel spécifique tourne en tâche de fond et il est capable de garder en mémoire votre clé privée décryptée et de crypter des informations avec elle. Il sera donc utilisé par votre client ssh pour crypter les informations quand c'est nécessaire, votre client n'aura donc plus besoin de vous demander la passphrase.

Voici comment utiliser un agent SSH :

  1. Lancez l'agent ssh avec ssh-agent xxxxxx est le nom de votre shell. La plupart du temps il suffira de taper : eval `ssh-agent` pour pouvoir l'utiliser immédiatement dans votre shell courant (uniquement) et ses processus enfants Notez que si vous êtes sur un poste Ubuntu ou Debian, l'agent est généralement lancé lorsque vous démarrez une session X11 (session graphique Gnome ou KDE).

    Pour savoir si l'agent est déjà lancé, tapez ps waux | grep $SSH_AGENT_PID : vous devrez voir la ligne correspondante à un processus ssh-agent. Dans le cas contraire, c'est que l'agent n'est pas lancé, il faut le faire à la main comme indiqué ci-dessus.

  2. Ajouter votre clef privée à l'agent : ssh-add. Votre devrez saisir votre passphrase à ce moment là, afin que l'agent puisse charger la clé privée décrypter.

  3. C'est tout ! Vos divers clients ssh sont programmés pour détecter la présence de l'agent ssh et l'utiliseront si besoin ! Désormais, un simple ssh nom.du.serveur vous connectera directement au serveur distant en toute sécurité sans rien vous demander.

Note concerant la sécurité

si la machine où tourne votre ssh-agent est compromise (i.e. que quelqu'un arrive à s'y connecter avec votre compte ou en tant que root) alors toutes vos connexions ssh à échange de clef pourront être usurpées ! Attention donc : n'utilisez ssh-agent que sur une machine robuste dont vous êtes totalement sûr, ne le lancez lorsque vous en avez besoin et ne lui envoyez pas des clefs avec ssh-add pour rien. Faites ssh-add -D dès que vous n'avez plus besoin de SSH afin que l'agent oublie toutes vos clefs.

Astuce concernant l'envoie de clé publique vers un serveur

si vous avez un agent en fonctionnement et qu'il connait votre clé privée (avec ssh-add) alors vous pourrez utiliser le petit programme ssh-copy-id user@machine qui saura envoyer votre clé publique au serveur machine pour l'utilisateur user. Il placera automatiquement votre clé publique dans le $HOME/.ssh/authorized_keys et donnera les bons droits à ce fichier. Rien de très magique, mais c'est pratique.

Comment diffuser ma clef publique ?

Votre clef publique est constituée d'une seule ligne contenue dans le fichier $HOME/.ssh/id_dsa.pub.

La clé publique est faite pour être diffusée : vous pouvez l'envoyer telle quelle dans un mail, sans cryptage... vous pouvez même la placer quelque part sur un serveur Web pourquoi pas (voir par exemple sur ThomasNoël) ! Attention cependant à ce que personne n'intercepte pas votre envoi. En effet, un pirate pourrait remplacer votre clé par la sienne (technique appelée man in the middle). Pour éviter cela, on confirmera avec «l'empreinte de la clé» (fingerprint) par un autre moyen de communication (rencontre physique, téléphone, visioconf, etc.). Pour voir l'empreinte de votre clef, tapez : ssh-keygen -l -f ~/.ssh/id_dsa.pub

Annexes

Exemple de configuration du serveur. Adaptez la configuration du vôtre, ne prenez pas celui-ci tel quel !