SSH: un shell sécurisé

SSH est un protocole utilisé sur les plate-formes Unix (et assimilées) afin de prendre la main à distance à l’aide de la ligne de commande.

1 – Introduction

1.1 – Définitions

SSH est le nom du protocole de secure shell (terminal sécurisé).

OpenSSH est une implémentation libre (GPL) du protocole SSH.

Nota: on utilisera (abusivement) le terme SSH comme un mot générique désignant le protocole SSH quelle que soit son implémentation. En règle générale ce qui est valable pour OpenSSH l’est aussi pour le SSH originel.

1.2 – Concept de base: le protocole

Il a toujours été utile de pouvoir prendre la main sur une machine distance. Si cela est un réalité établie elle est d’autant plus vraie lorsqu’il s’agit d’administrer de serveur. Le SSH est performant à un point tel que de nombreux administrateur de système Unix ne branche jamais d’écran ou de clavier sur leur serveur. Ceux ci sont caché dans une salle technique alors qu’il peuvent être administré à partir de n’importe quel ordinateur du réseau sous réserve d’avoir en possession les « credential » (identifiant de connexion) appropriés.

1.3 – Technologies

Tout comme Telnet (par exemple) le SSH permet de prendre la main à distance en mode texte. La très grande différence se situe au niveau de la sécurité. En effet contrairement à ne nombreux protocoles peu sécurisé comme Telnet, le SMTP ou le FTP, le SSH met en place une connexion chiffrée avant même de transmettre votre identifiant et votre mot de passe. Lors d’une analyse de trame, un logiciel tout simple comme ettercap est à même de relever de mots de passe de compte e-mail ou FTP par, contre, le mot de passe d’une connexion de type SSH transitera chiffré. Il est, certes, toujours possible de déchiffrer un mot de passe, même s’il est encodé en 128 bits, mais cela sécurise des connexion qui se doivent de rester confidentielle. Le protocole SSH peut aussi être utilisé pour en-capsuler d’autres protocoles comme – à titre d’exemple concret – le FTP, on parle alors de SFTP.

1.4 – Principes de fonctionnement

Le déroulement d’une connexion par SSH se réalise en deux phase. Le client et le serveur établissement un canal sécurité pour que le client puisse ensuite s’authentifier.

Mise en place du canal sécurisé:

  1. Le serveur et le client échanges des information sur les protocole de chiffrement qu’ils supportent afin de se mettre d’accord sur la technologie commune à employer.
  2. Le serveur envoie sa clef publique au client
  3. Le client vérifie s’il connaît le serveur et, le cas échéant, ajoute sa clef publique à son trousseau. Après quoi il chiffre une clef de session avec la clef publique du serveur et la lui envoie.
  4. Le serveur déchiffre la clef de session avec sa clef privée puis chiffre avec la clef de session un message de confirmation servant à initialiser le canal sécurisé.
  5. A partir de ce moment client et serveur dialoguent en chiffrant les échanges à l’aide de clefs de session partagées.

Authentification du client:

`

  1. Dans le canal sécurisé, le client envoie soir ses identifiant de type login et mot de passe soit sa clef publique.
  2. Le serveur répond en accordant au client un accès a son shell.

2 – Mise en oeuvre

2.1 – Installation d’un serveur SSH

Un serveur SSH (et son client) s’installe soit en utilisant les outils de gestion de package intégré à votre distribution linux, soit en compilant les sources que vous pouvez trouver sur les site officiel d’OpenSSH (voir en bas de page).

  • Exemple sous Debian: apt-get install ssh sshd.
  • Exemple sous Mandriva: urpmi ssh sshd.

2.2 – Configuration

Le fichier de configuration de SSH est ##/etc/ssh/sshd_config## en l’éditant on peut configurer son serveur. Voici les principaux arguments de ce dernier:

  • Port
    • Argument: Port TCP
    • Exemple: Port 22
    • Explication: Port TCP sur lequel écoute le serveur SSH
  • Protocol
    • Argument: 1 ou 2
    • Exemple: Protocol 2
    • Explications: Protocole SSH il n’en existe – à l’heure actuelle – que deux. Il est préférable d’utiliser la version 2.0.
  • Hostkey
    • Argument: Chemin de fichier.
    • Exemple: Hostkey /etc/ssh/ssh_host_rsa_key
    • Explications: Fichier stockant le clef d’identification du serveur (existe pour les clefs de type RSA et/ou DSA).
  • SysLogLevel
    • Argument: QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2 ou DEBUG3
    • Exemple: SysLogLevel INFO
    • Explications: Niveau de log des incidents. Plus le niveau est bas plus le nombre d’enregistrement est faible. Ce niveau correspond au niveau d’importance minimal devant être notifié.
  • LoggingGraceTime
    • Argument: Temps en secondes (0 = durée infinie)
    • Exemple: LoggingGraceTime 600
    • Explications: Temps maximum pour l’authentification. Si le client ne s’est pas identifié dans cette période de temps, il est déconnecté du système.
  • PermitRootLogging
    • Argument: Booléen
    • Exemple: PermitRootLogging no
    • Explications: Autorise ou non la connexion en tant que super-utilisateur (root).
  • PubkeyAuthentication
    • Argument: Booléen
    • Exemple: PubkeyAuthentication yes
    • Explications: Autorise ou non l’utilisation d’une clef publique (option de SSH2 uniquement)
  • PermitEmptyPassword
    • Argument: Booléen
    • Exemple: PermitEmptyPassword no
    • Explications: Autorise ou non la connexion en utilisant un mot de passe vide.
  • PasswordAuthentication
    • Argument: Booléen
    • Exemple: PasswordAuthentication yes
    • Explications: Autorise ou non la connexion avec un mot de passe (par opposition à la connexion par clef)
  • X11Forwarding
    • Argument: Booléen
    • Exemple: X11Forwarding no
    • Explications: Active ou non la possibilité de se connecter à distance en mode graphique.
  • Subsystem
    • Argument: Nom du sous-système et chemin de l’exécutable
    • Exemple: Subsystem sftp /usr/lib/sftp-server
    • Explication: Permet d’associer de sous système au SSH comme du SFTP…

Pour les autres option (la configuration des option Kerberos par exemple) je vous invite à consulter le manuel (man sshd_config (uù [ici->http://www.openbsd.org/cgi-bin/man.cgi?query=sshd_config]). Ainsi que les site cités en fin de ce document.

Exemple de configuration simple

# Configuration optimisée pour du SSH2 - connexion avec mot de passe

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes
PAMAuthenticationViaKbdInt no

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentification
LoginGraceTime 60
PermitRootLogin yes
StrictModes yes
PubkeyAuthentication yes

# Dé-activation des identifications "rhost"
RhostsAuthentication no
IgnoreRhosts yes
HostbasedAuthentication no

# Les mots de passe
PermitEmptyPasswords no
PasswordAuthentication yes

# Pas de X11 merci...
X11Forwarding no
KeepAlive yes

# Mais du SFTP!
Subsystem sftp /usr/lib/sftp-server

2.3 – Et les droits?

OpenSSH, à proprement parler, ne gère pas les droit. En réalité, il se contente d’autoriser au non une connexion distante, la gestion des droits devenant alors purement simplement celle de l’hôte. Cependant, comme vous avez pu le constater dans le paragraphe précédent, il est possible d’y ajuster quelques ajustement comme, par exemple, autorisez ou non l’utilisateur root à se connecter.

Un autre ajustement consiste a établir une black-list ou une white-list (respectivement un liste d’utilisateur ne pouvant pas se connecter ou un liste d’utilisateur pouvant se connecter) voire même les deux.

Cela se fait à l’aide des paramètre:

  • AllowGroups: Autoriser des groupes d’utilisateurs.
  • AllowUsers: Autoriser des utilisateurs.
  • DenyGroups: Interdire des groupes d’utilisateurs.
  • DenyUsers: Interdire de utilisateurs.

En règle générale ces arguments supporte en paramètres des listes de noms (et non pas d’ID ou de GID) pouvant conporté les caractères spéciaux * et ?.

3 – Les outils

3.1 – Le client SSH

Un client SSH est intégré à chaque distribution GNU/Linux, il suffit donc de l’installer avec la commande adéquate.

  • Debian: apt-get install ssh
  • Mandrake: urpmi ssh
  • Sources: elle sont disponibles sur le site OpenSSH.org

L’utiliser est particulièrement simple, il s’appelle avec une commande du type ssh MonUtilisateur@ServeurSSH après quoi il suffit de s’identifier pour se retrouver sur une console comme toutes les autres…

On notera que dans certains cas, lorsque le fonction X11Forwarding est activé et que le client peut supporter cette option, il est possible de récupérer du serveur un affichage graphique.

3.2 – Le FTP sécurisé

Le protocole SSH permet aussi de transporter autre chose qu’un shell, l’autre fonctionnalité la plus utilisée est le transfert de fichier utilisant le protocole FTP, il s’agit alors du SFTP. Le principe de fonctionnement est exactement le même que pour le FTP à la différence que tout le protocole d’authentification se fait à la mode SSH et que les transactions sont chiffrée.

Traditionnellement, on utilise le logiciel sftp dont le mode d’emploi est très proche de celui du ftp. On se connecte, par exemple, avec une commande du type sftp MonUtilisateur@ServeurSFTP puis on utilisera le double jeu de commandes locales et distante comme cd pour choisir son répertoire sur le serveur et lcd pour le répertoire locale. Les deux autres « grandes » commandes étant put et get permettant, respectivement, de remonter et de récupérer des données du serveur.

3.3 – Utiliser sa clef privée pour se connecter

La grande force de SSH et aussi de permettre des connexion où l’authentification de fait entièrement avec des clefs. Dans ce cas de figure il n’est pas nécessaire de s’authentifier avec un mot de passe puisque le chiffrement des données se fait grâce au double jeu de clef publique et privé des deux interlocuteurs: le serveur et le client. Ceci peut certes s’avérer pratique puisqu’on n’entre plus de « crédentials » mais c’est surtout un procédé qui peut être utilisé pour des connexion systématique entre deux ordinateur sans nécessiter d’intervention humaine et, surtout, sans avoir besoin de stocker de mot de passe dans un quelconque fichier.

Dans ce cas de figure, il faut tout d’abord que le serveur SSH accepte cette option (en activant l’option PubkeyAuthentication) et qu’un échange préalable de clef ait été réalisé. Pour ce faire, on peut utiliser la méthode avec scp (outil de copie sécurisé) tel que le préconise le site de Léa.

  1. Récupération de la clef publique du client par le serveur:
  2. $scp .ssh/id_dsa.pub jop@scipc-jpg:/home/jop/.ssh/dsa2connex
    Warning: Permanently added 'scipc-jpg' (RSA) to the list of known hosts.
    jop@scipc-jpg's password:
    id_dsa.pub 100% |*****************************| 613 00:00
  3. L’ajouter au clef authorisées: $ cat dsa2connex >>authorized_keys

3.4 – Quelques outils pratiques pour SSH et SFTP

Client SSH pour Windows

Le logiciel putty permet (en autre) de se connecter à n’importe quel serveur SSH à partir d’un client Windows.

Client SFTP pour Windows

WinSCP est probablement le client SFTP libre le plus connu pour Windows, il autorise aussi des connexions SSH. On remarquera qu’il est présent dans les outils distribués par SambaEdu3.

Client SFTP pour Mac OS X

Fugu et un client graphique agréable pour des échanges SFTP.

Client SSH pour PalmOS (!)

Un peu anecdotique mais il bon de rappeller que les outils libres sont très portable… En effet pssh permet d’ouvrir un session SSH à partir d’un ordinateur de poche fonctionnant sous PalmOS.

4 – Liens et informations

Laisser un commentaire

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