SSH

De DokuWikiExperience.

Sommaire

SSH avec certificat

L'utilisation d'un certificat permet de contrer l'attaque dîte de "man in the middle" (ou l'homme du milieu).

Generation des clefs

La première étape consiste à generer ces clefs (publique / privée) grâce à :

ssh-keygen -b 4096

ce qui nous donne :

$ ssh-keygen -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yanntech/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/yanntech/.ssh/id_rsa.
Your public key has been saved in /home/yanntech/.ssh/id_rsa.pub.
The key fingerprint is:
7b:4a:63:df:aa:37:d8:0f:ca:e1:68:b4:d5:10:1e:02 yanntech@osmose

JE DÉCONSEILLE DE NE PAS METTRE DE PASSPHRASE. En effet en cas de vol de la clef privée c'est votre seul et unique protection.

Copie des clefs

L'utilisation de ssh-copy-id est le moyen le plus rapide :

$ ssh-copy-id
Usage: /usr/bin/ssh-copy-id [-i [identity_file]] [user@]machine
$ ssh-copy-id -i .ssh/id_rsa.pub osmose
15
yanntech@osmose's password:
Now try logging into the machine, with "ssh 'osmose'", and check in:

 .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Et voila, maintenant essayer de vous connecter à nouveau sur votre serveur, vous devriez obtenir quelqu'que chose de semblable :

$ ssh osmose
Enter passphrase for key '/home/yanntech/.ssh/id_rsa':

Bien entendu maintenant seul votre mot de passe de votre clef publique est utile. Pour augmenter encore plus la sécurité vous pouvez désactiver sur votre client la possibilité de s'authentifier sans certificat, modifier donc le fichier /etc/ssh/sshd_config et remplacer :

PasswordAuthentication yes

par :

PasswordAuthentication no

Recharger sshd

/etc/init.d/ssh reload

Faire du SSH à travers un firewall

Cas typique :

  • vous êtes dans un entreprise et vous voulez vous connecter par SSH vers un serveur à l'extérieur du réseau de l'entreprise... mais il y a un firewall entre le réseau interne et Internet !


Avertissement : L'utilisation des techniques décrites ci-dessous est peut-être interdite par l'entreprise.


Il y a trois possibilités, sachant que seule la dernière est potentiellement réalisable si vous ne pouvez pas modifier la configuration du serveur.

Changer de port

Si le firewall a un port complètement ouvert (le port 80 par exemple), vous pouvez modifier la configuration du serveur pour que son démon SSH écoute sur le port 80 en plus du port 22 (attention, il ne doit pas y avoir de serveur Web qui écoute déjà sur le port 80). Pour cela, modifiez le fichier de configuration /etc/ssh/sshd_config pour qu'il contienne les deux lignes suivantes :

Port 22
Port 80

Puis relancez le serveur SSH :

# /etc/init.d/ssh reload
Reloading OpenBSD Secure Shell server's configuration.

Vous pouvez alors lancer votre client SSH en lui précisant d'utiliser le port 80 :

% ssh -p 80 login@nom_DNS_du_serveur

Monter un tunnel HTTP

Si le firewall surveille le port 80 et vérifie que seuls des packets HTTP passent par ce port, alors vous pouvez essayer d'utiliser le programme httptunnel. Ce programme doit tourner sur le client et le serveur. Il encapsule dans une connexion HTTP n'importe quel type de connexion (pas forcément une connexion SSH). Il permet aussi de faire passer la connexion par un Proxy. Installez le package sur le client et sur le serveur :

# apt-get install httptunnel

Lancez le serveur httptunnel sur le serveur :

% hts -F localhost:22 8888

Puis lancez le client httptunnel sur le client :

% htc -F 2222 nom_DNS_du_serveur:8888

ou, si vous devez passer par un Proxy proxy.exemple.org qui écoute sur le port 8080 :

% htc -F 2222 -P proxy.exemple.org:8080 nom_DNS_du_serveur:8888

Vous pouvez alors lancer votre client SSH :

% ssh -p 2222 login@localhost

Utiliser un proxy HTTPS

Récupérez le script ssh-https-tunnel :

$ wget http://wiki.ismaya.fr/data/ssh-https-tunnel
# mv ssh-https-tunnel /usr/local/bin/

Editez le fichier /usr/local/bin/ssh-https-tunnel contenant le programme et rentrez le nom DNS et le port du proxy du réseau interne dans les variables prévues à cet effet :

# Proxy details
my $proxy      = "proxy.exemple.org";
my $proxy_port = 8080;

Créez (s'il n'existe pas déjà) un fichier ~/.ssh/config contenant :

host nom_DNS_du_serveur
ProxyCommand /usr/local/bin/ssh-https-tunnel %h %p
Port 22

Puis essayez de vous connecter au serveur comme vous le faites normalement (en cas de problème ajouter l'option -v):

$ ssh login@nom_DNS_du_serveur

Si cela ne marche pas, essayez de faire écouter le démon SSH du serveur sur le port 443 (port des connexions HTTP sécurisées), comme expliqué dans la première possibilité, et modifiez le fichier ~/.ssh/config en remplaçant 22 par 443, puis réessayez de vous connecter.

Option avançée

Rediriger un port :

ssh -C -g -R <PORT SRC>:<IP DST>:<PORT DST> <IP>

Liens

Outils personnels