L'établissement du dialogue entre le client et le serveur suit un protocole particulier :
établissement d'une couche transport sécurisée
chiffrement des données à l'aide de clefs symétriques pendant la transaction
Le client peut s'authentifier en toute sécurité, et accéder aux applications conformes aux spécifications du protocole.
La couche transport assure le chiffrement et le déchiffrement des données. Elle assure également la compression pour améliorer le transfert. Le client et le serveur négocient plusieurs éléments afin que la session puisse s'établir.
l'échange des clés
l'algorithme de clé publique à utiliser
l'algorithme de chiffrement symétrique à utiliser
l'algorithme d'authentification de message à utiliser
l'algorithme repère (hash) à utiliser
Lors du premier échange, le client ne connaît pas le serveur. Le serveur propose alors une clé hôte qui servira par la suite au client de moyen d'identification du serveur.
M0:$ ssh -l mlx M1.foo.org Warning: Permanently added 'M1,x.y.z.t' (DSA) to the list of known hosts. mlx@M1.foo.org's password: Last login: Sat Nov 2 11:37:32 2002 from 212.47.248.114 Linux 2.2.19. mlx@M1.foo.org:$
Voilà une idée de ce que cela donne :
freeduc-sup.alt.eu.org,144.85.15.72 ssh-rsa AAAAB3NzaC1y (...) pegase,195.115.88.38 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIE (...) freeduc-sup.eu.org,137.194.161.2 ssh-dss AAAAB3NzaC1kc3M (...) (...)
Le risque de ce processus, vient donc surtout de la première transaction, où le client n'a pas le moyen d'identifier de façon fiable le serveur avec qui il communique. Un pirate peut dans certains cas, tenter de détourner cette opération. Au cours d'un échange, le client et le serveur modifient régulièrement leurs clés. A chaque opération de renouvellement de clé, un pirate qui aurait réussi à décrypter les clés, devrait refaire toute l'opération.
Authentification :
Une fois le tunnel sécurisé mis en place, le serveur envoie au client les différentes méthodes d'authentification qu'il supporte. Dans le cadre d'une authentification par mot de passe, celui-ci peut être envoyé en toute sécurité puisqu'il est chiffré.
Connexion :
Une fois l'authentification réalisée, le tunnel SSH peut multiplexer plusieurs canaux en délégant la tâche à des agents.
[mlx@M1 X11]$ pstree -l 24245
sshd---bash-+-drakfw
|-pstree
|-2*[xclock]
`-xlogo
Ici on voit dans la même session ssh, 2 canaux pour xclock, 1 pour xlogo et 1 pour la commande pstree. Chaque canal est numéroté. Le client peut fermer un canal sans pour autant fermer toute la session.
OpenSSH est constitué de deux ensembles de fichiers de configuration, comme c'est en général le cas sur les services sous linux (ldap, samba..). Il y a un fichier de configuration pour les programmes clients (ssh, scp et sftp) et l'autre pour le service serveur(sshd). Les informations de configuration SSH qui s'appliquent à l'ensemble du système sont stockées dans le répertoire /etc/ssh. Voici les principaux fichiers de configuration :
ssh_config fichier de configuration client SSH pour l'ensemble
du système. Il est écrasé si un même fichier est
présent dans le répertoire personnel de
l'utilisateur
(~/.ssh/config).
sshd_config fichier de configuration pour sshd.
ssh_host_dsa_key clé DSA privée utilisée par sshd.
ssh_host_dsa_key.pub clé DSA publique utilisée par sshd.
ssh_host_key clé RSA privée utilisée par sshd pour la
version 1 du protocole SSH.
ssh_host_key.pub clé RSA publique utilisée par sshd pour la
version 1 du protocole SSH.
ssh_host_rsa_key clé RSA privée utilisée par sshd pour la
version 2 du protocole SSH.
ssh_host_rsa_key.pub clé RSA publique utilisée par sshd pour la
version 2 du protocole SSH.
Les informations spécifiques à un utilisateur sont stockées dans son répertoire personnel à l'intérieur du répertoire ~/.ssh/:
authorized_keys ou parfois authorized_keys2
ce fichier contient une liste de clés
publiques "autorisées". Si un utilisateur
se connecte et prouve qu'il connaît la clé
privée correspondant à l'une de ces clés,
il obtient l'authentification. Notez qu'il
ne s'agit que d'une méthode d'authentification
facultative.
id_dsa contient l'identité d'authentification
DSA de l'utilisateur.
id_dsa.pub la clé DSA publique de l'utilisateur.
id_rsa la clé RSA publique utilisée par sshd pour
la version 2 du protocole SSH.
identity la clé RSA privée utilisée par sshd pour la
version 1 du protocole SSH.
known_hosts ce fichier contient les clés hôte DSA des
serveurs SSH auxquels l'utilisateur s'est connecté.
Exemple sur une machine :
mlx@M1:~$ ls -al .ssh/ total 16 drwx------ 2 mlx mlx 4096 Jan 16 2004 ./ drwxr-xr-x 5 mlx mlx 4096 Oct 18 16:12 ../ -rw------- 1 mlx mlx 1192 Mar 11 2004 authorized_keys2 -rw------- 1 mlx mlx 240 Jan 16 2004 known_hosts