Obtenir un shell sur le serveur : ssh

Pour obtenir un shell sur le serveur, vous devez utiliser le programme ssh fournit par OpenSSH (ou un autre client de votre choix, voir la liste ici).

Plusieurs options sont disponibles en voici quelques unes :

-p (pour port)
Port à connecter sur la machine distante.
On peut aussi le spécifier pour une machine donnée dans le fichier de configuration (cf la page de man de sshd_config.5).

-X
Active le transfert X11. On peut aussi le spécifier pour une machine donnée dans le fichier de configuration.
Le transfert X11 doit être activé avec précaution. En effet, les utilisateurs capables de contourner les permissions des fichiers sur la machines distante (pour accéder à la base de donnée d'accréditation de X) peuvent accéder au à l'écran X11 local via le transfert de connexion. Un attaquant pourrait alors effectuer des opérations telles qu'enregistrer la frappe.

-x
Désactive le transfert X11.

Exemple :
user1@mon_poste ~/.ssh $ ssh user1@Serveur

Last login: Thu May  1 17:41:29 2005 from 192.168.0.20
Linux Serveur 2.4.24 #1 Wed Feb 11 01:01:56 CET 2004 i686 GNU/Linux

user1@Serveur:~$

Copier des fichiers : scp

SSH permet de copier de manière sécurisée des fichiers ou des répertoire depuis le serveur vers le client ou bien depuis le client vers le serveur en utilisant la commande scp .

Pour celà, nous pouvons utilisez plusieurs options :

-r
Copie récursivement des répertoires entiers.

-v
Mode bavard. scp affichent des messages d'information et de débogage sur ce qu'il fait. Utile pour le débogage des problèmes de connexion, d'authentification et de configuration.

D'autre options sont disponibles, voir la traduction du man de scp par Laurent GAUTROT ici .

Exemple : copie de fichiers

Copie d'un fichier vers le serveur :
user1@A ~/$ scp /chemin/vers/mon/fichier/toto.txt user@chezmoi.com:/chemin/de/destination/
Copie de plusieurs fichiers vers le serveur :
user1@A ~/$ scp fichier1.txt fichier2.txt user@chezmoi.com:/chemin/de/destination/
Copie d'un répertoire :
user1@A ~/$ scp -r mon_repertoire user@chezmoi.com:/chemin/de/destination/
Copie d'un fichier contenant des espaces :
user1@A ~/$ scp "\"/chemin/Mon fichier avec espace.txt\"" user@chezmoi.com:/chemin/de/destination/
Copie d'un fichier contenant deux points (cf http://www.openssh.com/fr/faq.html#2.13) :
user1@A ~/$ scp ./chemin/Mon_fichier_avec_deux:points.txt user@chezmoi.com:/chemin/de/destination/
On utilise donc pour celà un chemin relatif ou absolu (cf ./chemin/Mon_fichier_avec_deux:points.txt au lieu de chemin/Mon_fichier_avec_deux:points.txt).

Copier de nombreux fichiers : tar & ssh

Si vous souhaitez copier de nombreux fichiers, il peut être judicieux d'en envoyer qu'un seul à travers le réseau, plutôt que un par un. Pour celà on peut, si l'on est sous un environnement UNIX, utiliser la commande tar couplée à la commande scp à l'aide d'un "pipe" (|).
user1@A ~/$ tar -cf - /mes/fichiers_1 /mes/fichiers_2 | ssh user@monserveur.com tar -xf - -C /chemin/de/destination/
 
le résultat de cette commande sera sur monserveur.com :
user@monserveur ~/$ ls /chemin/de/destination/mes/
fichiers_1        fichiers_2
Pour compresser, on peut ajouter à la commande tar l'option -z (compression en gzip) ou -j (compression en bzip2).

Si l'on veut ensuite sauvegarder tous les fichiers sur le serveur mais dans un seul fichier tar en le compressant en gzip :
user1@A ~/$ tar --ignore-failed-read -zcf - /chemin/fichier1 /chemin/2/fichier2 | ssh user@monserveur.com "cat > mon_fichier_de_sauvegarde.tar.gz"

Rediriger les ports avec ssh

Le principe des tunnels SSH Tunnels est de permettre d'atteindre des machines auxquelles vous n'avez pas normalement accès, par exemple, des machines sur un réseau local à votre entreprise ou derrière un firewall. Il vous faut néanmoin posséder un accès à une machine connectée au réseau que vous voulez atteindre (en général un firewall). SSH peut créer 2 types de tunnels, appelé "redirections locales" et "redirections distantes".

Pour celà, nous devons utilisez plusieurs options de ssh :

-f
Demande à ssh de basculer en arrière-plan juste avant d'exécuter la commande.

-N
N'exécute aucune commande distante. Utilisé pour les transferts de ports (seulement dans la version 2 du protocole).

-C
Active la compression de toutes les données en gzip

-g
Permet à des machines distantes de se connecter à des ports transférés locaux.

-R: R port:host:hostport
Spécifie que le port donné hostport de la machine distante host sera transféré au port port de la machine locale. Ceci fonctionne grâce à l'allocation d'une socket qui écoute sur le port hostport de la machine distante host, et qui, dès qu'une connexion est établie sur ce port, la transfère à travers le canal sécurisé, et se connecte sur le port port de la machine locale.

-L L port:host:hostport
Spécifie que le port donné de la machine locale (client) sera transféré vers l'hôte et le port donné depuis la machine distante. Ceci fonctionne grâce à l'allocation d'une socket qui écoute sur le port port de la machine locale, et qui, dès qu'une connexion est établie sur ce port, la transfère à travers le canal sécurisé, et se connecte à host sur le port hostport depuis la machine distante.
Seul root peut transférer des ports privilégiés.

Exemple 1 : Redirection distante de ports (-R Remote)

On veut, par exemple, que le poste chezmoi.com puisse se connecter au poste A possédant l'adresse locale 192.168.0.2 (qui se trouve dans un réseau privé, et est donc normalement inaccessible).

SSH port forwarding

Dans cet exemple, il faut le poste A et le poste chezmoi.com aient lancés chacun leurs serveurs SSH.

Depuis le poste A faire la commande suivante :
user1@A ~/$ ssh -fN -C -g -R 2222:127.0.0.1:22 user@chezmoi.com
Ceci ouvre le port 2222 sur user@chezmoi.com et le redirectionne sur le port 22 du poste A. Maintenant, depuis chezmoi.com, vous avez accé au poste A en faisant :
user@chezmoi.com ~/$ ssh -p 2222 user1@127.0.0.1
user1@A ~/$

Donc maintenant, quand je me connecte depuis chezmoi.com sur l'adresse locale (127.0.0.1), je suis redirectionné sur le poste A : la connexion via le port 22 sur mon adresse locale (127.0.0.1) me redirectionne vers le port 22 du poste A.

Exemple 2 : Redirection locale de ports (-L Locale) :

On veut, par exemple, créer un tunnel ssh pour encapsuler le protole POP afin de sécuriser le transfert du mot de passe et les mails. Ceci peut être si par exemple vous accéder à votre compte mail depuis une connexion wifi, afin d'éviter une interception de votre mot de passe.

La seule restriction, mais elle est importante, est que le serveur d'accéder aux e-mails possè également un serveur ssh.

Tunneling pop

Supposons que votre serveur de mail se nomme mail.domain.com, et que votre poste se nomme chezmoi :

Depuis le poste chezmoi faire la commande suivante :
user1@chezmoi ~/# ssh -L 110:mail.domain.com:110 mail.domain.com

Donc ici, vous transférez votre requête POP du port 110 de chezmoi au moyen de la connexion SSH au port 22 de mail.domain.com. Ensuite, serveur.mail.com se connecte à son port 110 pour vous permettre de vérifier votre courrier.
Ensuite, au lieu de spécifier "mail.domain.com" comme nom de serveur POP3, vous allez maintenant entrer "localhost".

Si serveur.mail.com n'exécute aucun démon de serveur SSH, mais que vous pouvez tout de même vous connecter par SSH à un ordinateur tout près, au moyen d'un pare-feu par exemple, vous pouvez quand même utiliser SSH pour rendre sécurisée la partie de la connexion POP qui est faite sur un réseau public.

Pop forwarding

Dans ce cas, la commande est légèrement différente :

user1@chezmoi ~/# ssh -L 110:mail.domain.com:110 other.domain.com

Dans cet exemple, vous transférez votre requête POP du port 110 de votre ordinateur (chezmoi) au moyen de la connexion SSH au port 22 de other.domain.com.
Ensuite, other.domain.com se connecte au port 110 de mail.domain.com. pour vous permettre de vérifier votre courrier. Seule la connexion entre vous et other.domain.com est sécurisée, mais dans nombre de cas, cela suffit pour acheminer des informations sur un réseau public de façon sécurisée et pour vous offrir plus de sécurité qu'auparavant.

Exemple 3 : VNC et SSH

- But : prendre le contrôle à distance d'une machine derrière un pare-feu avec SSH et VNC.

On établit une connexion VNC non pas directement vers le système éloigné, mais vers une connexion SSH qui prend en charge le trafic sur le port concerné (5901...) et le dirige vers le destinataire désigné.
La connexion se fait donc en deux temps : définition de la liaison SSH avec redirection via un port correspondant à celui de VNC, puis lancement de VNC vers le client SSH.

- Configuration :

Sur le Poste distant (PCDistant): serveur SSH démarré, le port 22 est ouvert sur le firewall et le serveur VNC est activé
Sur le poste local (celui qui controlera le poste distant) : installer vncviewer (disponible sous licence G.P.L. et multiplateforme avec TightVNC ou avec VNC Free Edition 4.1 de RealVNC

- Commandes :

Depuis le poste distant, on fait :

ssh -L5901:localhost:5900 -C utilisateurdistant@PCDistant

Ensuite, sur le poste locale, on fait :

vncviewer localhost:5901

- Explication :

5900 : port utilisé par le serveur VNC.
5901 : port affecté au terminal ouvert sous VNC (si on ouvre un deuxième terminal, se sera sur le port 5902 etc...)

-L <localport>:<remotehost>:<remoteport>
le paramètre <remotehost> est interprété côté serveur SSH.
localhost est, à peu près, équivalent à PCDistant (en fait, il s'agit de la même machine, mais sur des interfaces réseau différentes : l'interface de loopback dans un cas et l'interface LAN [ethernet ou WIFI] dans l'autre). Comme c'est bien sur le serveur PCDistant que l'on souhaite se connecter en VNC, c'est bien lui qu'il faut indiquer comme <remotehost> dans la commande SSH.