Il existe plusieurs protocoles Internet permettant de se connecter à
un ordinateur distant : telnet
, les r-commandes
(rlogin
, rsh
ou encore rcp
),
ssh
(Secure Shell). Alors que
telnet
et les r-commandes font circuler les informations
en clair sur le réseau (voir notre documentation sur les dangers de
telnet
), ssh
est beaucoup plus
sûr :
ssh
sont chiffrées, ce qui garantit leur confidentialité
Pour ces deux raisons, nous vous conseillons vivement
d'abandonner telnet
et
rlogin
pour adopter ssh
. Le
piratage, ça n'existe pas que dans les films. Vous pensez peut-être
que rien sur votre compte n'intéresse un pirate, et que donc il n'est
pas utile de prendre vos précautions. Vous avez tort à deux
titres : le pirate peut se servir de votre compte pour attaquer
une autre machine... Bonne chance alors pour convaincre la DST que ce
n'était pas vous. Ensuite, en vous exposant au danger, vous mettez
ensuite en danger les autres utilisateurs de l'ENS. Alors soyez
responsables.
ssh
avec Windows ou Mac OS. Reportez-vous à notre
documentation sur les dangers de
Telnet, nous vous y indiquons quels programmes vous pouvez
utiliser pour faire du ssh
. Vous pouvez également
consulter, sur le site des WinTuteurs, le tutorial
sur PuTTY (Windows).
L'utilisation de ssh
pour se connecter à une machine est
extrêmement simple.
machineloc
. La machine distante,
c'est celle à laquelle vous voulez vous connecter. Dans ce tutorial,
on l'appelle machinedist
. Par exemple, si vous êtes dans
votre thurne et que vous voulez vous connecter à clipper
,
la machine locale est votre propre ordinateur, la machine distante est
clipper.
machineloc ~ $ ssh
login@machinedist
On peut aussi utiliser la syntaxe équivalente :
machineloc ~ $ ssh machinedist -l login
Pour indiquer la machine à distance, vous pouvez utiliser aussi bien
le nom de la machine (clipper.ens.fr
,
horus.ens.fr
, etc.) que son adresse IP (pour clipper,
129.199.129.1
).
Si vous avez le même login sur les deux machines en question, ce n'est pas la peine de le mentionner, tapez simplement :
machineloc ~ $ ssh machinedist
Si c'est la première fois que vous vous connectez par ssh
sur cette machine, vous verrez un message tel que celui-ci :
machineloc ~ $ ssh toto@machinedist
The authenticity of host 'machinedist' (111.222.333.4)' can't be established.
RSA1 key fingerprint is 1z:2y:3x:4w:56:78:98:78:ab:cd:ef:01:23:45:67:89.
Are you sure you want to continue connecting (yes/no)?
Ne paniquez pas ! Tout est parfaitement normal, on vérifie qu'il
s'agit de la bonne machine. Il suffit de répondre 'yes' pour
continuer. ssh
vous dira alors :
Warning: Permanently added 'machinedist,111.222.333.4' (RSA1) to the list of known hosts.
Ce qui signifie que ssh
ne vous embêtera plus à poser la
question. Notez au passage le « RSA1 » entre parenthèses. Il s'agit du
type de clef utilisée par la machine distante. Cette information peut
vous servir par la suite pour générer une clef.
La façon la plus simple de s'identifier est le mot de passe. Par
défaut, ssh
vous le réclamera.
clipper ~ $ ssh machine.monlabo.fr
toto@machine's password:
Il vous suffit de taper votre mot de passe. Attention, pour des
raisons de sécurité (un coup d'œil sur l'écran de son voisin est
un mode de piratage basique mais efficace) celui n'apparaître pas à
l'écran, vous devrez taper en aveugle. Si vous pensez avoir commis une
erreur dans votre mot de passe, faites Ctrl+u
et retapez
le en entier. Si vous avez tapé correctement votre mot de passe, vous
aurez à votre disposition un shell sur la machine distante. Sinon,
vous lirez « Permission denied. » et il faudra
recommencer.
Une autre méthode utilise ce qu'on appelle une « clef publique »,
c'est-à-dire un code qui vous identifie. Si vous suivez la procédure
décrite ci-dessous, vous pourrez vous connecter par ssh
sur une machine distante sans avoir à taper de mot de passe.
Il existe différentes versions de SSH. Suivant le type de version
utilisé sur la machine distante, le type de clef à générer
diffère. Cette information vous est donnée par exemple lors de votre
première connexion ssh
sur cette machine (voir ci-dessus). Si vous ne vous en souvenez plus,
sachez que SSH1 utilisegénéralement des clefs RSA1, et SSH2 des clefs
DSA. Pour connaître la version de SSH utilisée sur la machine
distante, tapez ssh -v
sur la machine distante.
clipper ~ $ ssh -v
OpenSSH_3.7.1p2, SSH protocols 1.5/2.0, OpenSSL 0.9.7c 30 Sep 2003
Usage: ssh [options] host [command]
<...>
Le « SSH protocols 1.5/2.0 » vous indique qu'il s'agit d'un
ssh
récent qui peut faire du SSH1 ou du SSH2.
Pour ce faire, commencez par taper la commande ssh-keygen
(comme key generator) sur la machine
locale (et pas sur la machine à distance).
machineloc ~ $ ssh-keygen
Avec un ssh
récent, qui peut faire du SSH1 ou du SSH2, il
faut indiquer le type de clef à générer (voir ci-dessus). Par exemple,
pour générer une clef DSA (SSH2) :
machineloc ~ $ ssh-keygen -t dsa
Le générateur de clefs va en générer deux, une clef publique et une
clef privée. Il va placer la clef privée (sous forme chiffrée) dans un
endroit qui, par défaut, est $HOME/.ssh/id_dsa
pour
SSH2 et $HOME/.ssh/identity
pour SSH1 :
machineloc ~ $ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/usr/home/toto/.ssh/id_dsa):
Appuyez sur Enter
pour accepter la
localisation de la clef (il est plus simple d'accepter la localisation
proposée). ssh-keygen
vous demande ensuite une « passphrase » (équivalent d'un mot de passe, mais sous
forme de phrase). Cette phrase sert à fortifier la clef pour la rendre
plus difficilement cassable. À partir de là, deux solutions :
ssh-agent
pour ne pas avoir à la
retaper à chaque fois (voir plus bas)Enter
), votre connexion sera moins sûreQue vous tapiez une phrase ou pas, à la fin vous verrez quelque chose comme
Your identification has been saved in /usr/home/toto/.ssh/id_dsa. Your public key has been saved in /usr/home/toto/.ssh/id_dsa.pub. The key fingerprint is: 1a:2a:3e:4a:1a:65:1c:89:10:92:9c:5c:1f:75:cc:de toto@machineloc
Si l'on récapitule, ssh-keygen
a généré deux
clefs :
$HOME/.ssh/identity
(ou
$HOME/.ssh/id_dsa
si c'est du SSH2) et qui n'est
accessible qu'à vous$HOME/.ssh/id_dsa.pub
(ou
$HOME/.ssh/identity.pub
si c'est du SSH1) et qui peut
être lue par tout le monde$HOME
» ? $HOME est ce qu'on appelle une
variable d'environnement, qui sert à indiquer aux programmes quel est
votre répertoire personnel (la racine de votre compte). Faites
echo $HOME
pour savoir quel est le vôtre. Sur
clipper
, c'est
/users/promo/matiere/login
. Pour en savoir plus, voir
l'article « Concept :
arborescence » dans le n°3 du Hublot.
Maintenant, sur la machine distante, allez dans le
répertoire .ssh
et éditez le fichier
authorized_keys
: ajoutez à la fin, et sur
une seule ligne (attention aux éditeurs qui coupent les
lignes) la clef publique (identity.pub
pour SSH1 ou
id_dsa.pub
pour SSH2) que vous venez de générer. Procédez
ainsi pour toutes les machines distantes auxquelles vous voulez vous
connecter sans avoir à taper votre mot de passe. Et voilà !
ssh-agent
Si vous avez opté pour la solution « phrase de passe », bravo, votre
connexion est plus sûre. Mais vous devez taper à chaque fois ladite
phrase... Solution, utiliser ssh-agent
.
D'abord, il faut lancer ssh-agent
, qui gère les clefs
d'identification. Si vous êtes logué dans une salle informatique de
l'ENS avec la config conscrits, pas de problème,
ssh-agent
est déjà lancé. Si ce n'est pas le cas, il faut
le lancer vous-même.
Comme l'agent est disponible dans tous les programmes qui découlent, on le lance au début d'une session. Par exemple, quand vous êtes en mode texte et que vous lancez le serveur X :
machineloc ~ $ ssh-agent startx
Quand vous vous loguez à distance, c'est plutôt :
machinedist ~ $ exec ssh-agent $SHELL
Une fois lancé, l'agent vous suit dans toutes vos connexions à
distance, et ainsi il est disponible partout. Il faut donner à l'agent
votre clef à gérer en tapant ssh-add
. On vous demande
alors votre phrase de passe :
machine ~ $ ssh-add
Need passphrase for /home/toto/.ssh/identity (toto@machine)
Enter passphrase:
Identity added: /home/toto/.ssh/identity (toto@machine)
Vous pouvez également utiliser ssh
pour exécuter une
commande à distance. Par exemple, vous voulez, de votre machine
personnelle, connaître l'heure sur clipper, pour savoir si votre
machine est en retard, en avance ou à l'heure.
machineloc ~ $ ssh clipper.ens.fr date
Fri Jul 4 12:01:49 MET DST 2003
N'oubliez pas de préciser toto@machine
si vos logins sont
différents entre les deux machines. Si vous voulez exécuter à distance
une commande avec des options, mieux vaut mettre des guillemets. Par
exemple, je veux savoir si brick
est une station Sun ou
un PC, en utilisant la commande uname
.
machineloc ~ $ ssh toto@brick.ens.fr "uname -p"
i386
La réponse est « i386 », dénomination utilisée pour les PC.
Il est possible que vous voyiez un jour le message d'erreur suivant :
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the host key has just been changed. Please contact your system administrator.
Ce message signifie que la clef ssh (l'identification) de la machine
distante a changé. En effet, à chaque fois que vous vous connectez à
une machine par ssh
, celle-ci présente à votre machine
une sorte de carte d'identité, ainsi vous êtes sûr qu'il s'agit bien
de la bonne machine et pas d'un pirate. Ou bien la machine a
réellement changé de clef ssh (à l'ENS, cela arrive de temps à autres
quand le SPI upgrade une machine), ou bien c'est une attaque de
pirate. Il vaut mieux écrire au SPI pour savoir ce qu'il en est.
Il y a d'autres commandes associées à ssh
qui vous
permettent, de manière tout aussi sûre, de transférer des fichiers
d'une machine à une autre. En l'espèce, scp
(Secure Copy) a un fonctionnement aussi simple que celui
de ssh
.
Les explications qui suivent sous pour les sytèmes UNIX. Pour savoir comment faire sous Windows, reportez-vous au tutorial des WinTuteurs sur WinSCP.
Pour envoyer des fichiers de votre machine locale à la machine distante, faites :
machineloc ~ $ scp <mon ou mes fichiers> machinedist:
Attention, n'oubliez pas les deux points à la fin. Vous
devrez taper votre mot de passe (sauf si vous utilisez
l'authentification par clef publique, voir ci-dessus), puis
ssh
se lancera dans le transfert en vous indiquant sa
progression :
machineloc ~ $ scp tagada.txt machinedist:
toto@machinedist's password:
tagada.txt 100% |***************************************| 2263 00:00
Pour énumérer les fichiers à copier, mettez-les simplement à la suite, séparés par une espace, sans virgule.
Pour transférer un répertoire entier, il faut
utiliser l'option -r
(comme recursive),
sinon ssh vous dira « <répertoire>: not a regular
file ».
machineloc ~ $ scp -r <répertoire> machinedist:
Dans ces premiers examples, le(s) fichier(s) sera ou seront copié(s),
avec le même nom sur la machine distante, à la racine de
votre compte. Nous allons compliquer progressivement les
choses. Maintenant, vous voulez changer le nom du fichier en cours de
route, renommer tagada.txt
en
coincoin.txt
:
machineloc ~ $ scp tagada.txt machinedist:coincoin.txt
Maintenant, nous allons envoyer notre fichier tagada.txt
à un endroit précis sur le compte distant, dans le répertoire
$HOME/divers/blagues
:
machineloc ~ $ scp tagada.txt machinedist:divers/blagues
Pour rapatrier des fichiers de la machine distante à votre machine locale, la même syntaxe est utilisée, mais inversée :
machineloc ~ $ scp machinedist:tagada.txt .
Le . (point) à la fin signifie que scp
devra mettre le
fichier ici, dans le répertoire dans lequel vous vous trouvez
actuellement. Évidemment, vous pouvez lui indiquer un autre
répertoire :
machineloc ~ $ scp machinedist:tagada.txt divers
Et ainsi de suite, vous pouvez appliquez les mêmes techniques que pour le transfert machine locale -> machine distante, décrites ci-dessus.
Quand on utilise beaucoup la connexion distante, il devient très
vite fastidieux d'avoir toujours à taper en entier le nom
clipper.ens.fr
, a fortiori son adresse IP
129.199.129.1
. S'il n'y a pas d'ambiguïté (en l'occurrence,
si vous n'utilisez jamais qu'un seul serveur portant le nom de clipper,
et pas, par exemple, clipper.ens.fr et clipper.chezmoi.fr), vous pouvez
assigner un alias à une adresse. Pour ce faire, mettez
dans le fichier $HOME/.ssh/config
les lignes
suivantes :
Host clipper User toto HostName clipper.ens.fr
(n'oubliez pas de remplacer « toto » par votre nom d'utilisateur).
Ainsi, il suffira de taper :
machineloc ~ $ ssh clipper
au lieu de :
machineloc ~ $ ssh toto@clipper.ens.fr
Cette modification s'étend également à scp
. Il vous suffit
en effet de taper :
machineloc ~ $ scp tagada.txt clipper:divers/blagues
au lieu de :
machineloc ~ $ scp tagada.txt toto@clipper.ens.fr:divers/blagues