Table des matières
SSH
Documentations
http://www-106.ibm.com/developerworks/library/l-keyc.html http://www-106.ibm.com/developerworks/linux/library/l-keyc2/ http://troumad.free.fr/Linux/Linux.sxw
Fichiers de configuration
/etc/ssh ~/.ssh
Sécuriser les connexions ssh
Fichier /etc/ssh/sshd_config cf. http://www.faqs.org/docs/securing/chap15sec122.html
- Spécifier quels utilisateurs peuvent se connecter : AllowUsers toto bibi truc@test.domaine.fr
Seuls les utilisateurs toto bibi peuvent se connecter ainsi que l'utilisateur truc, mais uniquement à partir de la machine test.domaine.fr
- Interdire l'accès à root: PermitRootLogin no
Vérifier si SSH tourne sur le PC distant et quelle est la version du programme:
telnet nom_ou_N°IP_PC_distant 22
Se connecter au PC distant :
ssh nom_ou_N°IP_PC_distant ou bien pour avec un autre utilisateur que celui qui est utilisé ssh -l utilisateur nom_ou_N°IP_PC_distant ssh utilisateur@nom_ou_N°IP_PC_distant
Pour augmenter la vitesse de transfert (compression) : ssh -C Pour pouvoir afficher des applications graphiques (X11 forwarding) : ssh -X Pour pouvoir afficher des applications graphiques (trusted X11 forwarding) : ssh -Y
En cas de message d'erreur "cannot open display", éditer /etc/ssh/sshd_config et vérifier que X11Forwarding est à "yes".
ConnectionTimeout : En cas d'erreur de connexion le timeout est particulièrement long (de l'ordre de 2 minutes ?) Pour le raccourcir par exemple à 10 secondes : ssh -o ConnectTimeout=10 user@machine (ConnectTimeout et non pas ConnectionTimeout comme indiqué dans la doc !)
Se connecter en root au PC distant :
L'autoriser/l'interdire : voir : /etc/ssh/sshd_config
PermitRootLogin yes | no AllowUsers DenyUsers
Lancer une application sur la machine distante
ssh utilisateur@nom_ou_N°IP_PC_distant <commande distante>
Créer / changer un couple de clés privées/publiques
$ ssh-keygen -t rsa pour générer un couple de clés RSA $ ssh-keygen -t dsa DSA et répondre aux questions. Un couple de clés est créé dans /<répertoire>/<nom_fichier> qui a été indiqué : <nom_fichier> contient la clé privée <nom_fichier>.pub contient la clé publique La clé publique contient à la fin <login>@<machine>
ssh-keygen sans passphrase permet de se connecter à un serveur ssh sans taper de mot e passe (la passphrase). Mais c'est un trou de sécurité. Pour un login sans mot de passe, il est préférable s'utiliser ssh-agent, ssh-add et keychain. Voir plus loin à “Utilisation de ssh-agent”
Problèmes
*1* ssh: connect to host toto port 22: Connection refused 1 - Le port 22 doit être ouvert (vérifier le firewall) 2 - Vérifier que le serveur sshd est installé ET qu'il est démarré NB : après installation (urpmi openssh-server) le serveur n'est pas démarré automatiquement Le lancer avec : # service sshd start
*2*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE 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)! … Agent forwarding is disabled to avoid attacks by corrupted servers. X11 forwarding is disabled to avoid attacks by corrupted servers. Are you sure you want to continue connecting (yes/no)?
Cause probable : PC1 = PC sur lequel on a tapé la commande ssh PC2 et qui affiche le message d'erreur PC2 = PC que l'on essaye de connecter
Une nouvelle installation de SSH a été faite sur PC2. Pour que ce message ne s'affiche plus, supprimer dans le fichier ~.ssh/known_hosts de PC1 la (les) lignes commençant par le(s) nom(s) correspondant à PC2.
*3*
Cygwin : “connection refused” Voir l'installation, la configuration et le démarrage de sshd sur : “How to install OpenSSH sshd server and sftp server on a Windows 2000 or Windows XP or Windows Server 2003” (http://pigtail.net/LRP/printsrv/cygwin-sshd.html)
En résumé : Aujourd'hui les étapes 1 et 2 sont inutiles : c'est fait par ssh-host-config
(1) My Computer, Properties, Advanced, Environment Variables, System variables Ajouter une nouvelle variable : Variable name : CYGWIN Variable value : ntsec tty
(2) Rajouter au path :
;X:\cygwin\bin
(remplacer X par la lettre du disque sur lequel se trouve cygwin)
(3) Lancer Cygwin puis : ssh-host-config - privilege separation : yes - local user : yes - install sshd as a service : yes - CYGWIN= ntsec tty
(4) Démarrer sshd : net start sshd (ou cygrunsrv –start sshd)
Pour stopper sshd : net stop sshd (ou cygrunsrv –stop sshd)
Connexion directe sous konqueror
cf.http://www.linux.org/lessons/short/fish/t1.html#FISH-STORY fish:nom_ou_N°IP_PC_distant fish:utilisateur@nom_ou_N°IP_PC_distant fish:utilisateur@nom_ou_N°IP_PC_distant/repertoire/à/consulter Attention : avant d'utiliser fish se connecter au moins une fois avec user@ssh à la machine distante, sinon la connexion par fish est refusée. fish ne fonctionne pas sous les autres browsers : “fish is not a registered protocol” Connexion directe sous konqueror (variante) ——————————— cf. http://www.linuxgazette.com/node/401 idem fish, mais la commande est sftp : sftp:nom_ou_N°IP_PC_distant sftp:utilisateur@nom_ou_N°IP_PC_distant sftp:utilisateur@nom_ou_N°IP_PC_distant/repertoire/à/consulter
sftp n'a rien à voir avec le protocole ftp : c'est en fait du ssh. Ne fonctionne pas non plus sous les autres browsers : “sftp is not a registered protocol”
Copie de fichiers
Copier un fichier local sur un pc distant: $ scp /rep_source/fichier utilisateur@pc_distant:~/rep_destination $ scp /rep_source/fichier utilisateur@pc_distant:~/rep_destination/ (même résultat) $ scp /rep_source/fichier utilisateur@pc_distant:~/rep_destination/autre_nom_de_fichier
L'inverse : copier un fichier résidant sur un pc distant dans un répertoire local : $ scp utilisateur@pc_distant:/répertoire_distant/fichier /chemin/vers/rép_local/nom_fichier
Pour les copies récursives, option -r : $ scp -r utilisateur@pc_distant:/répertoire_distant
Pour éviter d'avoir à taper à chaque connexion le login/mot de passe :
1 - générer une paire de clés privée/publique (= clé/serrure) $ ssh-keygen -t rsa Répondre à la question “passphrase:” en entrant la phrase de son choix
Les clés générées sont dans ~/.ssh : id_rsa clé privée id_rsa.pub clé publique
Changer la “passphrase” (ou en entrer une) si nécessaire : $ ssh-keygen -p -f ~/.ssh/id_rsa
2 - Copier la clé publique dans le fichier ~/.ssh/authorized_keys de la machine sur laquelle on veut se connecter : $ scp ~/.ssh/id_rsa.pub utilisateur@nom_ou_N°IP_PC_distant:~/.ssh/authorized_keys ou bien ajouter cette clé publique à un fichier ~/.ssh/authorized_keys existant $ cat ~/.ssh/id_rsa.pub | ssh utilisateur@nom_ou_N°IP_PC_distant “cat » ~/.ssh/authorized_keys” ou bien utiliser ssh-copy-id pour ces copies.
3 - Utiliser ssh-agent (voir plus loin “Utilisation de ssh-agent”) (facultatif : n'est pas utile si on a pas entré de “passphrase”, mais l'absence de passphrase est un trou de sécurité dans le cas ou un pirate vole la clé privée)
ssh, scp, sftp sous windows
Pour se connecter depuis Windows à une machine linux : winscp winscp.net/
Monter un répertoire Unix distant
shfs à revoir : ne marche plus (utiliser sshfs à la place, voir plus loin) shfs (Secure SHell FileSystem Linux kernel module)
http://shfs.sourceforge.net/ Installation et mode d'emploi : http://www.labo-linux.org/index.php?page=lumieres&id=278 # urpmi shfs-utils
shfsmount utilisateur@machine_distante /point/de/montage ou mount -t shfs utilisateur@machine_distante /point/de/montage
Attention, contrairement à fish, pour indiquer un répertoire, rajouter “:” après le nom de machine : shfsmount utilisateur@machine_distante:/répertoire/à/monter /point/de/montage
shfsmount -o rmode=755 user@PC_distant:/répertoire/distant /point/de/montage
cf man shfsmount -o rmode=755 pour permettre à un utilisateur autre que root d'accéder au point de montage :/répertoire/distant facultatif, si absent c'est le répertoire / qui est monté,
Attention : cas d'une machine W$+Cygwin protégée par firewall (kerio) après un shfsmount -o rmode=755 user@PC_distant:/répertoire/distant /point/de/montage si la commande ls /point/de/montage bloque, c'est très probablement kerio qui bloque l'exécution de la commande cygwin ls : le vérifier
Problème : Après installation par urpmi # urpmi shfs-utils # shfsmount -o rmode=755 utilisateur@PC_distant:Documents /mnt/disk shfsmount: shfs filesystem not supported by the kernel
Solutions : - recompiler shfs à partir des sources ? - utiliser sshfs (cf. ci-dessous) à la place de shfs.
Utilisation de ssh-agent
ssh-agent est un daemon dont le seul but est de garder en mémoire (de façon sécurisée) la “passphrase” de façon à ce qu'il ne soit pas nécessaire de la taper à chaque utilisation de ssh. La commande suivante crée la variable SSH_AUTH_SOCK qui contient le chemin d'un socket que ssh, scp (et autres commandes) vont utiliser pour dialoguer avec ssh-agent : $ eval `ssh-agent`
Communiquer la clé privée et la phrase de passe à ssh-agent au moyen de ssh-add : $ ssh-add ~/.ssh/id_rsa Enter passphrase for /home/user/.ssh/id_rsa:
La clé privée est ainsi décryptée et stockée dans le cache de ssh-agent, prête à être utilisée On peut maintenant utiliser ssh et scp sans avoir à entrer le mot de passe.
keychain
Récupérer la dernière version sur http://www.gentoo.org/proj/en/keychain.xml
Permet d'utiliser un seul processus ssh-agent par systeme, et non par session (login). Particulièrement intéressant si on veut utiliser ssh et scp dans un cron. Keychain supprime les processus ssh-agent éventuellement en surnombre. Il mémorise les variables SSH_AUTH_SOCK et SSH_AGENT_PID dans ~/.keychain/nom_machine.sh
A partir d'une autre session, récupération de ces variables : source ~/.keychain/nom_machine-sh
Pour automatiser, copier les lignes suivantes dans ~/.bash_profile # Keychain lance ssh-agent et stocke les variables SSH_AUTH_SOCK et SSH_AGENT_PID # dans ~/.keychain/nom_machine-sh pour pouvoir les récupérer dans d'autres sessions # cf. http://www-106.ibm.com/developerworks/linux/library/l-keyc2/
/usr/bin/keychain ~/.ssh/id_rsa source ~/.keychain/nom_machine-sh
Tunnel SSH
Soit trois machines : A locale B intermédiaire par exemple une machine autorisée à se connecter sur C C distante par exemple un firewall
tunnel crypté A —–> B —–> C
ssh
Sur la machine locale : ssh -L port_local_quelqconque:C:port_C nom_login@B
C et B n° IP ou nom de machine port_C est le port de la machine distante C auquel on veut accéder à partir de A port_local_quelqconque : un port libre sur A vers lequel sera redirigé le port_C via le port ssh de B
Exemple : ssh -L 4091:C:443 nom_login@B # 443 = port https ou ssh -L 4091:C:443 nom_login@B sleep 180 ou encore passer en tâche de fond (<Ctrl><z>, puis bg
Le serveur web du firewall est accessible par : https://localhost:4091
urpmi, mises à jour de plusieurs machines en parallèle
Clusterssh
urpmi clusterssh (dans cooker-contrib ou MDV 2007) Permet des connexions multiples simultannées sur plusieurs machines Cf : http://clusterssh.sourceforge.net/index.php/ClusterSSH:About
man cssh