télétravail avec ssh¶
Objectif
Simplifier considérablement tous les accès aux serveurs & services à distance quand ce n’est pas tout simplement autoriser l’accès aux services (parfois il n’y a pas d’autre solution). Ce peut être:
- simple connexion ssh, travail direct sur les serveurs du laboratoire, de calcul («calculco»), de la PLM etc.
- transferts de fichiers: scp
- sauvegardes: rsync, unison etc.
- connexions plus complexes: rebonds
- tunnel ssh, proxy : accès aux serveurs de jeton (matlab, maple),
accès au serveur «charges des services» - autres services: git, … ?
Les exemples de cet article supposent que l’utilisatrice Agathe Zeblouse
a pour identifiants agathe
et zeblouse
respectivement sur son
portable et au travail.
Principes et généralités¶
Remarque : sur un UNIX ( Mac OS, Linux ) tous les les fichiers se
trouvent dans le répertoire caché (car le nom du répertoire commence par
un « . » ) .ssh
de votre répertoire d’accueil. Pour vérifier que les
droits sont corrects :
agathe@portable:~$ ls -a (option -a pour afficher les fichiers/rep. cachés)
...
drwx------ 2 agathe test 4096 mars 7 12:14 .ssh
Ici le répertoire n’est bien accessible qu’à l’utilisateur agathe, la clef privée Vous pouvez supprimer ce répertoire et son contenu sans conséquence ( si ce n’est d’avoir à recommencer les manipulations suivantes :-))
Étape1: générer le couple de clefs publique/privée¶
Dans un terminal, taper la commande :
ssh-keygen -t ed25519 -o -a 64 # si votre client ne supporte pas ed25519 cf. note ci-dessous
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/agathe/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/agathe/.ssh/id_ed25519.
Your public key has been saved in /home/agathe/.ssh/id_ed25519.pub.
The key fingerprint is:
+--[ED25519 256]--+
| ..+.o. |
|.oo o o o +.=.|
|o.o@ .. . o o = o|
|oo*o*o o . o . |
|++++o.= S . |
|...+.o + o |
|E o . . . |
|.. o |
| . |
+----[SHA256]-----+
Commentaires sur la séquence
id_ed25519
est le nom de la clé par défaut. Si vous utilisez intensivement ces méthodes de connexions (plusieurs identités, plusieurs institutions) il peut être judicieux de générer plusieurs couples de clefs.- passphrase: cf. l’avertissement ci-après.
id_ed25519.pub
:nom de fichier de la clef publique qu’il faudra transmettre sur le(s) serveur(s) cible(s).- RSA et elliptic curves: si votre client ssh, trop vieux, ne
supporte pas la commande
ssh-keygen -t ed25519
, générer une clef RSA avec la commandessh-keygen -t rsa -b 4096
. En effet, pour une sécurité «correcte» avec RSA , il faut forcer une longueur supérieure à celle par défaut de votre système (qui est probablement 2048).
Attention
Il est important de bien comprendre que les manipulations précédentes entraînent des risques du point de vue sécurité: si une personne vous vole votre clef privée et que vous n’avez pas mis de passphrase, il a libre accès à votre compte sans mot de passe, depuis n’importe quelle machine. (il lui suffit -par exemple- de profiter d’une absence & d’une session ouverte pour copier les deux clefs privées/publiques
- si cette clef vous sert sur plusieurs services/serveurs, cette personne est en possession d’un passe-partout(!)
- ce système d’identification est complètement indépendant du login/passwd … changer de mot de passe ne résoud pas le problème(!)
- néanmoins, avec une passphrase correcte, ces méthodes de connexions sans mot de passe, sont au contraire recommandées par certains: êtes vous sûr de la fiabilité du flux client-serveur lorsque vous tapez n fois votre mot de passe dans la journée?
Étape 2: copier la clef publique id_ed25519.pub sur l’hôte cible¶
Il suffit de taper la commande:
agathe@portable: ssh-copy-id -i ~/.ssh/id_ed25519.pub zeblouse@cible.fr
Que fait la commande précédente? Elle ajoute simplement la clé publique dans le fichier
~/.ssh/authorized_keys
sur le compte zeblouse du serveur cible.fr
.
Si la commande ssh-copy-id
n’est pas disponible sur votre système:
Plusieurs méthodes sont possibles (cf. comment transférer un fichier).
Une solution élégante:
agathe@portable: cat ~/.ssh/id_ed25519.pub | ssh zeblouse@cible.fr "cat - >> ~/.ssh/authorized_keys"
On peut aussi bien entendu utiliser un éditeur pour ajouter la clef à la
fin du fichier authorized_keys
. (plusieurs clefs sont possibles pour le
même compte cible)
Vous pouvez réitérer la manipulation sur tous les serveurs que vous utilisez fréquemment et vous connecter désormais sans mot de passe.
Connexions sans mot de passe, avec passphrase¶
Cette version est la plus sérieuse du point de vue de sécurité.
Si vous avez une saisie une « passphrase » lorsque vous avez générez les deux clefs, alors vous êtes dans ce cas de figure. En effet, la méthode exige de renseigner la passphrase (une fois) à chaque session. Vous confiez la passphrase qui protège votre clef privée à « l’agent ssh » et ce dernier, autorisera alors toutes les connexions ssh vers les différentes cibles sans mot de passe.
Passer la main à l’agent ssh :
agathe@portable : ssh-add ~/.ssh/id_ed25519
Enter passphrase for /home/agathe/.ssh/id_ed25519:
Identity added: /home/agathe/.ssh/id_ed25519
On peut vérifier que la clef privée est bien présente via la commande
ssh-add -l ou supprimer des clefs par la commande ssh-add -d <file>.
Si l’agent ssh ne démarre pas automatiquement en même temps que votre PC, lancez-le avec la commande suivante:
agathe@portable: eval `ssh-agent`
À partir de ce moment, les commandes suivantes ne requièrent plus la saisie du mot de passe:
agathe@portable: scp fichier zeblouse@cible:
agathe@portable: ssh zeblouse@cible
zeblouse@cible$:
Commentaires sur la séquence
- copie de
fichier
sur le répertoire d’accueil decible
- se connecter sur
cible
- … c’est fait!
Astuces supplémentaires¶
les basiques¶
L’efficacité est limitée, on peut néanmoins citer:
-
choisir le même login sur vos portables vous affranchit de taper
zeblouse@
-
déclarer
univ-littoral.fr
comme domaine de recherche par défaut des propriétés DNS (propriétés réseaux) vous affranchit de taper.univ-littoral.fr
-
fixer vous même le nom/alias des machines auxquelles vous vous connectez fréquemment dans le fichier
hosts
de votre portable vous affranchit également de taper.univ-littoral.fr
. Pour les Unix-like (Linux, MacOs) le fichier est/etc/hosts
et pour Windows:C:\Windows\System32\drivers\etc\hosts
.
mieux : configurer, renseigner le fichier ~/.ssh/config
¶
au plus simple:
# contenu du $HOME/.ssh/config de votre portable
Host piccolo
HostName piccolo.univ-littoral.fr
User zeblouse
ou encore:
# contenu du $HOME/.ssh/config de votre portable
Host pic
HostName piccolo.univ-littoral.fr
User zeblouse
IdentityFile /home/agathe/.ssh/labo
Commentaires sur la séquence
- Host est un alias : on peut mettre n’importe quoi
- User: facultatif si login(source) = login(cible), ce qui n’est pas le cas dans nos exemples ( agathe ≠ zeblouse)
- Agathe à l’étape un a généré labo et labo.pub (au lieu du couple par défaut id_ed25519 et id_ed25519.pub), on doit forcer l’usage de la bonne clef.
La connexion s’établie alors simplement avec la commande:
agathe@portable: ssh pic
Vous pouvez multiplier les serveurs dans ce fichier config
ssh : exemples pratiques¶
Lorsque vous n’êtes pas sur le «bon» réseau (extérieur, EDUROAM…), ssh vous permet d’accéder malgré tout à des services (par l’établissement d’un tunnel ssh) ou des machines (par rebonds) qui sont soit masqués par le pare-feu de l’université, soit simplement disponibles que sur le réseau local du laboratoire.
Hint
Si vous êtes déjà un utilisateur confirmé de ces fonctionnalités,
passez rapidement les exemples et consultez directement la dernière
section de cet article qui vous indiquera comment configurer votre
fichier ~/.ssh/config
afin de bénéficier de l’ensemble des
fonctionnalités des exemples.
Exemple 1 (tunnel): imprimer depuis le réseau eduroam¶
Vous êtes au labo., connecté sur le réseau EDUROAM: vous n’avez pas accès au serveur d’imprimante…
ouvrir le tunnel comme suit:
ssh -N -f -l votre_login -L 9631:printserver.lmpa:631 piccolo.univ-littoral.fr
Qu’ès aquò? La commande crée un tunnel ssh (port standard 22 - donc non
indiqué - du serveur piccolo
) en se connectant sur le service
d’impression de printserver
(service cups
dont le port standard est 631,
inaccessible de l’extérieur). Le service cups
(port 631) est redirigé
sur le port 9631 du localhost
de votre portable. Tout se passe comme
si le serveur d’impression du labo était transféré sur l’adresse
127.0.0.1:9631 de votre portable.
autres commentaires ( taper la commande man ssh
pour plus
d’information ):
-
-N : simple redirection de port
-
-f : demande l’execution en arrière-plan.
-
-l votre_login : votre login de connexion sur piccolo (login labo)
-
localhost
: toute machine possède une adresse réseau particulière appeléeloopback
, dont l’adresse IP est 127.0.0.1 (taper la commandeping localhost
pour vous en convaincre). -
9631 : le port de redirection peut-être choisi à votre convenance (1234 aurait pu faire l’affaire). Il ne faut pas prendre un port déjà existant ( conflit ) et un nombre > 1024 (les 1024 premiers ports ne peuvent être ouverts que par l’administrateur)
Ouaip? mais comment j’imprime ?
Toutes les files
d’impression
sont désormais accessibles depuis votre localhost
. Prenons l’exemple
la file hp2
( HP LaserJet M606M recto-verso )
# interroger sa disponibilité
lpq -U votre_login -h 127.0.0.1:9631 -Php2
# imprimer le fichier.pdf (
lpr -U votre_login -H 127.0.0.1:9631 -Php2 fichier.pdf
Exemple 2 (tunnel): accéder au serveur de jeton MATLAB¶
Vous n’êtes pas sur le réseau du laboratoire et vous voulez utilisez Matlab: le service est masqué derrière le pare-feu.
Note: pour plus d’informations sur l’installation et le choix du serveur de jeton , consulter la fiche matlab sur calculco
Le tunnel s’ouvre comme suit:
ssh -f -N -L 27000:jetons-cs:27000 -L 39555:jetons-cs:39555 votre_login@calculco.univ-littoral.fr
Exemple 3 (rebond): accès direct à votre poste de travail¶
Vous n’êtes pas sur le réseau du laboratoire et vous voulez accéder (échanges de fichiers, lancer un calcul) à votre PC fixe, sans effectuer la manipulation en deux temps ( portable → serveur → PC) … plus l’éventuel retour!.
ssh -A -t zeblouze@piccolo.univ-littoral.fr ssh -A -t zeblouse@pc-perso.univ-littoral.fr
Sauter vite à la section adapter votre fichier config pour simplifier
Exemple 4 (double rebonds)¶
On peut, sur le principe de l’exemple précédent, enchaîner plusieurs connexion. S’il s’agissait de se connecter depuis l’extérieur, sur une machine virtuelle (vm-cible) prise en charge par un hyperviseur masqué, on pourrait procéder comme suit:
ssh -A -t login1@passerelle ssh -A -t login2@hyperviseur ssh -A login3@vm-cible
Exemple 5: connexion au serveur «charges des services»¶
… ou comment accéder à un serveur web « vu depuis » (masqué par firewall, * ) ? Le serveur des charges n’est accessible que de l’intranet (et encore, cablé: la connexion via eduroam est non-autorisée )
- avoir accès à une machine du réseau
- installer un plugin/addons sur votre brouteur (chrome, firefox...)
- (*)permet aussi d'accéder -par exemple- à sciencedirect (mais «vu de
l'ULCO» donc avec les abonnements de l'ULCO)
ouvrir la socket:¶
Linux, MacOS, windows 10 WSL:
ssh zeblouse@piccolo.univ-littoral.fr -D 12345
Note: 12345 est ici arbitraire, le tout est:
- d'être cohérent ( avec la configuration du _proxy_ dans le browser - prochaine étape -)
- de choisir un nombre supérieur à 1024 ( les 1024 premiers ports sont réservés
à _root_ = superutilisateur )
Avec Putty:
Aller directement dans le menu SSH/tunnels:
puis remonter dans le menu Sessions pour indiquer le serveur de connexion (piccolo
) et sauvegarder la session de sorte qu’à la prochaine connexion, il suffira de double-cliquer sur le nom choisi:
configuration du browser : chrome, firefox¶
- chrome : «Proxy Switcher and Manager»
- firefox : «toggle proxy» [lien](https://addons.mozilla.org/fr/thunderbird/addon/toggle-proxy-51740/)
Une fois le plugin installé, le configurer avec le même numéro de socket que celui choisi lors de la connexion ssh:
se connecter au service:
Pour récupérer une connexion «normale», ne pas oublier de switcher cliquer sur l’applet en haut à droite de l’écran pour passer d’un mode à l’autre
Les captures écrans pour le plugin «Toggle Proxy» de firefox:
idem que pour chrome, un bouton à côté de la barre d’adresse permet de passer d’un mode à l’autre:
Simplifier le tout(!) : ajuster ~/.ssh/config
et le fichier ~/.alias
(ou ~/.bashrc
)¶
Pour mettre en oeuvre les 4 exemples précédents, éditer (ou créer) le
fichier ~/.ssh/config
du portable:
proposition de fichier .ssh/config
¶
# acces direct sur les serveurs accessible de partout
# il s'agit ici d'un simple alias
Host piccolo
Hostname piccolo.univ-littoral.fr
# agathe fait le choix d'une clef spécifique pour calculco (clef "calcul")
# elle a un 3ième login : azeblouse
Host calculco
Hostname calculco.univ-littoral.fr
IdentifyFile /home/agathe/.ssh/calcul
User azeblouse
# billard "une bande" (acces pc-perso ...)
Host pc-perso
Hostname pc-perso.univ-littoral.fr
ProxyCommand ssh -W %h:%p piccolo
User zeblouze
# billard "deux bandes"
# exemple: acces a une machine virtuelle (ma-vm) situee sur un hyperviseur,
# (ici flute) inaccessible directement de l'exterieur
Host fluteproxy
Hostname flute.univ-littoral.fr
ProxyCommand ssh -W %h:%p piccolo
User zeblouze
Host ma-vm
Hostname ma-vm
ProxyCommand ssh -W %h:%p fluteproxy
IdentifyFile /home/agathe/.ssh/virtual
User autre_login
### TUNNELS ###
# matlab du Pôle Calcul
Host matlab
Hostname calculo
LocalForward 27000 jetons-cs:27000
LocalForward 39555 jetons-cs:39555
# (note: ici, calculco, sans l'extension univ-littoral.fr,
# reprend implicitement l'entrée «calculco» définie plus haut )
# pour imprimer depuis eduroam
Host print
Hostname piccolo.univ-littoral.fr
LocalForward 9631 printserver.lma:631
User zeblouse
se connecter, échanger des fichiers¶
Une fois le fichier ~/.ssh/config
renseigné comme précédemment
indiqué, Agathe peut taper les commandes suivantes, de façon homogène et
simplifiée, sans mot de passe, sans se soucier ni de ses identifiants ni
du nombre de sauts à effectuer pour atteindre la machine cible avec
laquelle elle compte travailler:
# connexions
ssh piccolo
ssh calculco
ssh ma-vm
# copies recursive du rep. "code source" dans le rep. "projet" du serveur de calcul
scp -rp code-source calculco:projet
# recuperer les resultats
scp calculco:projet/results/*.out .
# copie d'un fichier sur le
scp examen1.tex pc-perso:Licence/
# synchronisation du rep recherche local avec celui du serveur de fichiers
rsync -avz recherche/ piccolo:recherche/
...
proxy web ( serveur des charges )¶
ssh piccolo -D 12345
puis ouvrir le brouteur ( cf exemple 5)
tunnels¶
A partir de là les commandes pour ouvrir les tunnels ( impression et matlab ) se réduisent à:
# acces imprimantes
ssh -f -N print
# acces à Matlab
ssh -f -N matlab
Un petit plus : éditer le fichier ~/.bashrc
du portable Mac ou Linux
# établir les tunnels pour l'impression et accès aux jetons matlab
alias tprint='ssh -f -N print'
alias tmatlab='ssh -f -N matlab'
# alias pour imprimer (une fois le tunnel établi !)
# impression recto-verso sur imprimanteq HP 606M et HP 602M (salle commune)
alias imp2='lpr -U votre_login -H 127.0.0.1:9631 $1 -Php2'
alias imp='lpr -U votre_login -H 127.0.0.1:9631 $1 -Php'
#interrogation hp hp2
alias impq2='lpq -U votre_login -h 127.0.0.1:9631 -Php2'
alias impq='lpq -U votre_login -h 127.0.0.1:9631 -Php'
Ainsi, au final, les commandes se résument à :
# avant de lancer matlab, ouvrir le tunnel
tmatlab
# ouverture du tunnel pour les impressions:
tprint
# imprimer un fichier (recto-verso, sur HP606M)
imp2 le_fichier.ps
astuce: complétion pour MacOS
Les fainéants (comme moi) qui veulent ajouter la completion
sur les Host définies dans le fichier de .ssh/config
peuvent suivre les instructions:
gist.github.com/aliang/1024466.
Ceci est inutile pour linux (la fonctionnalité est en principe incluse
dans votre shell).
Quelques liens/sources :