Installation de ssh, côté serveur
Installation de ssh, côté client
Utilisation de ssh-agent et ssh-add
Port forwarding
Ssh et X Window
Pour faire de votre machine un serveur SSH, c'est à dire
que les utilisateurs d'autre machines puissent lancer des commandes
sur votre ordinateur tout en ayant la garantie que les données échangées
entre ces deux points ne soient pas lisibles par une tierce partie,
il faut procéder comme suit:
Dans ce qui va suivre, on supposera toutefois que votre machine est cliente
d'
ASIS,
de telle manière que castor:/asis est monté sur /net/castor/asis.
Si ce n'est pas le cas, il faut faire ce mount maintenant.
Les options pouvant figurer dans le fichier sshd_config sont décrites
dans les man pages
sshd(8).
Les clefs ainsi créées sont stockées dans les fichiers ssh_host_key
et ssh_host_key.pub du répertoire /usr/local/etc.
Pour établir une connexion encryptée
qui permettra d'exécuter de manière plus sûre des commandes sur un serveur
SSH, il faut procéder comme suit:
Les options pouvant figurer dans le fichier ssh_config sont décrites
dans les man pages
ssh(1).
Comme indiqué, il faut réaliser l'étape ci-dessus en étant root.
Par contre les étapes suivantes doivent être effectuées
par chaque utilisateur individuellement:
Cette commande vous demandera où placer votre paire de clefs. Entrez "Return"
pour accepter la valeur par défaut. Ensuite elle vous demandera d'entrer un
mot de passe (plus exactement une passphrase, un "phrase de passe")
pour verrouiller l'accès à votre clef privée. Bien que cette passphrase
soit facultative, il est fortement recommandé d'en utiliser une:
quiconque s'empare de votre clef privée peut se faire passer pour vous aux
yeux de SSH et ça lui sera plus difficile si vous la protéger de cette
manière. Contrairement aux mots de passe Unix, votre passphrase peut
être aussi longue que vous le désirez, profitez-en !
Les clefs ainsi créées sont stockées dans les fichiers identity
et identity.pub du répertoire $HOME/.ssh.
Attention ! Les lignes de ces fichiers sont longues (en général plus de
300 caractères). Si vous utiliser du "copier/coller" pour transférer le
contenu de identity.pub vers authorized_keys, méfiez-vous
des "newlines" intempestifs que cette opération pourrait créer.
Si vous utilisez SSH comme indiqué ci-dessus, vous serez bien vite
ennuyé de devoir sans cesse entrer la passphrase permettant de lire
votre clef privée et vous commencerez à regretter rsh et rlogin.
Heureusement, il y a une solution: utilisez ssh-agent et
ssh-add. Ceci est l'objet du paragraphe suivant.
Le principe des programmes ssh-agent et ssh-add est le
suivant: ssh-agent est un démon dont le double rôle est d'intercepter
votre clef privée lorsque le programme
ad hoc ssh-add l'aura lue (après vous avoir demandé votre
passphrase une seule et unique fois), puis de transmettre cette clef
aux processus dont il est l'ancêtre lorsque ceux-ci le demandent. Typiquement
il s'agira des commandes ssh ou slogin qui à travers ce procédé n'auront plus besoin de vous demander sans cesse d'entrer la passphrase.
ssh-agent ne peut offrir ce service qu'à ses descendants parce que
seuls ces derniers peuvent hériter du socket que SSH utilise
à cet effet.
Dans la pratique, une des configurations suivantes est typique:
Avant d'expliquer l'influence
que peut avoir SSH dans l'utilisation
de X Window, il faut traiter du port forwarding.
Les services disponibles sur un serveur se distinguent par le port
sur lequel ils "écoutent" les requêtes provenant des clients. Par exemple,
les démons httpd, rlogind et telnetd utilisent
traditionnellement les port TCP 80, 513 et 23, respectivement.
D'autres numéros de port d'usage courant sont listés dans le fichier
/etc/services, avec leur nom tel qu'il est utilisé par diverses
routines et utilitaires (netstat,
lsof, etc.)
Le serveur sshd utilise quant à lui le port 22, proche du port 23 de
telnetd pour exprimer que le service offert (sessions interactives
à distance) est comparable. La grosse différence est bien sûr la
confidentialité des données échangées, obtenue par l'encryptage de la
connexion.
Mais SSH est également capable de fournir cet encryptage
à d'autres services par le biais du port forwarding (options
-L et -R de la commande ssh), de la manière
suivante. Supposons que sur la machine HOST2, j'entre la commande:
Comme on le voit sur la figure ci-dessus, les connexions entre HOST1 et
HOST2 ainsi qu'entre HOST3 et HOST4 ne seront
pas encryptées. C'est pourquoi dans les applications, on
a toujours HOST1 = HOST2 et HOST3 = HOST4:
Exemple pratique, je travaille sur HOST2 et je veux effectuer un
transfert FTP entre HOST2 et HOST3 sans que mon
mot de passe ne soit visible sur le réseau:
Attention: le fonctionnement de FTP fait que cette connexion
encryptée n'est pas utilisée pour transférer les fichiers, uniquement
les commandes de FTP et le mot de passe.
Quelques remarques pour conclure ce paragraphe:
SSH met en place automatiquement le port forwarding décrit
ci-dessus pour que les échanges du protocole
X Window se fasse par une connexion encryptée.
Il faut bien se rendre compte à quel point ce service que nous rend
SSH est précieux et indispensable si nous travaillons dans un
environnement X Window. La situation suivante est typique. Je travaille
sur ma station (machine1) où s'affichent les fenêtres clientes
de mon serveur X. Conscient que les pirates vont peut-être "renifler" le
câble, j'utilise la commande ssh pour ouvrir une session sur une machine
remote, machine2. Je dois y éditer un fichier et j'ai l'habitude
de le faire avec un outil X, xedit par exemple. Je fais donc:
Pour éviter cela et pour que les clients X s'exécutant sur la machine
remote machine2 dialoguent avec votre machine locale
machine1 (dont vous avez le display sous les yeux)
à travers la connexion encryptée mise en place par SSH,
il faut utiliser la valeur de la variable DISPLAY
figurant automatiquement dans votre environnement sur la machine2
si vous y ouvrez une session interactive par la commande ssh.
Cette valeur est de la forme machine2:n (où n est
un petit nombre entier) et le fait que son utilisation provoque l'affichage
des fenêtres sur machine1 (et non machine2) est une indication
que le port forwarding est en jeu.
Rappelons en effet que les clients X se basent sur la forme de la
variable d'environnement DISPLAY pour trouver le chemin du serveur
X où dessiner leurs fenêtres. La convention est la suivante: pour une
valeur de cette variable de la forme "machine:n", le client
se connecte à l'adresse machine au port 6000 + n. Ainsi
une variable DISPLAY de la forme machine2:n sur la machine
machine2 indique que les clients X se connectent localement
pour atteindre en fait la machine machine1,
ce qui est bien le comportement typique du port forwarding de
SSH.
Dans la pratique, l'utilisation sûre de X Window à travers
SSH passe par les précautions suivantes:
Installation de ssh, côté serveur
/bin/cp /net/castor/asis/<votre architecture>/usr.local/bin/sshd1 \
/usr/local/sbin/sshd1
/bin/chmod 750 /usr/local/sbin/sshd1
/bin/ln -s sshd1 /usr/local/sbin/sshd
L'endroit où vous placerez cette copie importe peu, mais pour la suite nous
conviendrons qu'il s'agit de /usr/local/sbin/sshd.
/bin/cp /net/castor/asis/<votre architecture>/usr.local/bin/ssh-keygen1 \
/usr/local/bin/ssh-keygen1
/bin/cp /net/castor/asis/<votre architecture>/usr.local/bin/scp1 \
/usr/local/bin/scp1
/bin/chmod 755 /usr/local/bin/ssh-keygen1 /usr/local/bin/scp1
/bin/ln -s ssh-keygen1 /usr/local/bin/ssh-keygen
/bin/ln -s scp1 /usr/local/bin/scp
L'endroit où vous placerez cette copie importe peu, mais pour la suite nous
conviendrons qu'il s'agit de /usr/local/bin/ssh-keygen.
/bin/cp /net/castor/asis/share/usr.local/man/man8/sshd.8 \
/usr/local/man/man8
/bin/chmod 644 /usr/local/man/man8/sshd.8
/bin/cp /net/castor/asis/share/usr.local/man/man1/ssh-keygen.1 \
/net/castor/asis/share/usr.local/man/man1/scp.1 \
/usr/local/man/man1
/bin/chmod 644 /usr/local/man/man1/ssh-keygen.1 \
/usr/local/man/man1/scp.1
/usr/local/bin/ssh-keygen -N '' \
-f /usr/local/etc/ssh_host_key
Note: vous verrez des messages d'erreur sans conséquence si vous
n'avez pas les commandes netstat et w dans votre PATH
au moment de l'exécution de ssh-keygen (qui utilise l'affichage généré
par ces commandes, et d'autres, comme germe de nombres aléatoires).
cd /
/usr/local/sbin/sshd
Dès maintenant, votre machine est un serveur SSH.
sshd: .epfl.ch : allow
sshd: collab.domaine.pt :allow
sshd: ALL : deny
placées au début de hosts.allow sont typiques. Pour plus d'informations,
consultez le guide d'installation
de tcp_wrappers et les pages de manuels de
hosts_options.5 et
hosts_access.5.
Installation et utilisation de ssh, côté client
cd /net/castor/asis/<votre architecture>/usr.local/bin
/bin/cp ssh1 ssh-add1 ssh-agent1 ssh-askpass1 ssh-keygen1 scp1 \
/usr/local/bin
cd /usr/local/bin
/bin/chmod 755 ssh1 ssh-* scp1
/bin/chmod u+s ssh1
/bin/ln -s ssh1 ssh
/bin/ln -s ssh-add1 ssh-add
/bin/ln -s ssh-agent1 ssh-agent
/bin/ln -s ssh-askpass1 ssh-askpass
/bin/ln -s ssh-keygen1 ssh-keygen
/bin/ln -s scp1 scp
/bin/ln -s ssh slogin
L'endroit où vous placerez ces copies importe peu, mais pour la suite nous
conviendrons qu'il s'agit du répertoire /usr/local/bin.
cd /net/castor/asis/share/usr.local/man/man1
/bin/cp ssh* scp.1 /usr/local/man/man1
cd /usr/local/man/man1
chmod 644 ssh* scp.1
/bin/ln -s ssh.1 slogin.1
/usr/local/bin/ssh-keygen
Note: vous verrez des messages d'erreur sans conséquence si vous
n'avez pas les commandes netstat et w dans votre PATH
au moment de l'exécution de ssh-keygen (qui utilise l'affichage généré
par ces commandes, et d'autres, comme germe de nombres aléatoires).
/usr/local/bin/ssh "machine remote"
SSH vous invitera à entrer la passphrase verrouillant l'accès
à votre clef privée. Ceci fait, vous verrez apparaître le prompt
d'une session interactive sur la machine remote, avec la garantie
que personne ne pourra vous espionner à partir d'une autre machine du réseau
et lire le courrier électronique que vous éditer ou les mots
de passe que vous utiliser sur le serveur.
Utilisation de ssh-agent et ssh-add
xinit [ options ]
devient
/usr/local/bin/ssh-agent xinit [ options ]
(ou une modification analogue si vous utilisez startx, etc.). Une fois
ses dispositions prises pour communiquer avec ses descendants, ssh-agent
fork le programme qui lui est donné en argument. Le résultat de cette
modification est donc que tous les processus qui naîtront durant votre session
X Window (en particulier chaque fois que vous invoquerez ssh)
auront ssh-agent comme ancêtre et pourront donc obtenir de sa part
une copie de votre clef privée.
/usr/local/bin/ssh-add < /dev/null
à votre fichier .xinitrc (ou .xsession, etc.) avant la
première invocation de ssh. La commande ssh-add va afficher
une fenêtre dans laquelle vous pourrez entrez votre passphrase pour
l'unique fois de cette session X Window.
if [ -r $HOME/.ssh/identity ] ; then
eval `/usr/local/bin/ssh-agent -s`
PATH=/usr/local/bin:$PATH /usr/local/bin/ssh-add < /dev/null
fi
et rajouter ceci au début de /usr/bin/X11/endsession:
if [ ! -z "$SSH_AGENT_PID" ] ; then
kill "$SSH_AGENT_PID"
fi
NB: ceci a été testé sur Irix 5.3, des modifications seront
peut-être nécessaires pour d'autres architectures. N'hésitez pas à me
contacter
en cas de problèmes.
Port forwarding
HOST2: /usr/local/bin/ssh -L p1:HOST4:p2 HOST3
ou que sur la machine HOST3, j'entre la commande:
HOST3: /usr/local/bin/ssh -R p1:HOST4:p2 HOST2
alors j'aurais la situation suivante:
c'est à dire qu'en me connectant depuis la machine HOST1 sur le
port p1 de la machine HOST2, cette connexion sera transférée
(forwarding) vers le port p2 de la machine HOST4,
via HOST3.
HOST2: /usr/local/bin/ssh -L p1:HOST3:p2 HOST3
HOST3: /usr/local/bin/ssh -R p1:HOST3:p2 HOST2
et sur HOST2, on se connecte localement au port p1 pour
aboutir à la situation suivante:
De cette manière, je peux mettre en place une connexion encryptée entre
HOST2 et n'importe quel service (c'est à dire n'importe quel port
p2) de HOST3.
/usr/local/bin/ssh -L 1234:HOST3:21 HOST3
FTP utilise le port 21 pour la connexion transmettant les commandes PUT, GET, etc., mais le nombre 1234 est quelconque.
/usr/bin/ftp HOST2 1234
Connected to HOST2.
220 HOST3 FTP server (Version wu-2.4(8) Fri Feb 7 16:04:38 MET 1997) ready.
Name (HOST2:toto): toto
331 Password required for toto.
Password:J'entre mon mot de passe en toute sécurité
230 User toto logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>ls -l
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
-rw-r--r-- 1 toto sicsl 2879 Nov 18 19:02 Netpbm
drwxr-xr-x 2 toto sicsl 512 Sep 12 12:21 bin
drwxr-xr-x 2 toto sicsl 512 Aug 8 11:54 html
drwxr-xr-x 2 toto sicsl 512 Aug 8 11:45 misc
226 Transfer complete.
ftp>quit
221 Goodbye.
/usr/local/bin/ssh -f -L p1:HOST3:p2 HOST3 exec sleep 3600 > /dev/null 2>&1
SSH et X Window
setenv DISPLAY machine1:0
/usr/local/bin/X11/xedit <fichier>
Problème: le dialogue X entre les deux machines utilise sa propre
connexion TCP/IP et ne passe pas par le canal encrypté de ma session
SSH: les éventuels pirates peuvent espionner toute ma session
d'édition du fichier (ce peut être assez grave si j'édite par exemple
/etc/passwd car ils pourront essayer de le
cracker).
De même pour une commande "xterm -display machine1:0" ou
équivalente: les pirates peuvent suivre tout ce que je tape au clavier,
y compris le mot de passe si j'utilise su pour devenir le root
de machine2.
FAUX: setenv DISPLAY machine1:0 (cas de csh, tcsh)
DISPLAY=machine1:0 ; export DISPLAY (cas de sh, bash)
JUSTE: if ( $?DISPLAY == 0 ) then
setenv DISPLAY machine1:0
endif (cas de csh, tcsh)
if [ "${DISPLAY:-unset}" = "unset" ] ; then
DISPLAY=machine1:0 ; export DISPLAY
fi (cas de sh, bash)
Martin Ouwehand
Updated: Fri May 28 16:45:01 METDST 1999