Transfert de fichier via SSH

Progression :

Dans ce chapitre, nous allons étudier différentes méthodes pour transférer des fichiers d'une machine à une autre via le protocole SSH. Il existe en effet plusieurs manières de faire pour échanger des fichiers en utilisant SSH :

  • SCP
  • SFTP
  • SSHFS

Le plus souvent, SCP est SFTP sont utilisés, SSHFS correspond à des besoins plus précis et spécifiques. Mais nous allons voir tout cela ensemble. C'est partie ! 🙂

I. SCP : Secure Copy

SCP est le nom d'une commande fournis par le paquet "openssh-client". La commande permet de façon très simple d'échanger des fichiers et des dossiers entre un client SSH et un serveur SSH.

L'utilisation de la commande SCP permet de rapidement prendre et envoyer des fichiers en ligne de commande entre machines Linux.

Nous allons ici utiliser la même structure de commande que la commande "cp" sous Linux qui permet de copier un fichier. SCP prend en effet le modèle de "cp" pour son utilisation basique.

Prenons le schéma suivant, il est souvent plus facile de visualiser les flux réseau ainsi :

ssh-scp-linux-01

On dispose donc de deux machines sous Linux, avec chacune leur arborescence.

Envoi d'un fichier via SSH en utilisant SCP

Si je suis sur la Machine mickael et que je souhaite envoyer le fichier /home/mickael/data/Fichier2 dans le répertoire /var/www du serveur Linux, je vais utiliser la commande suivante :

scp /home/mickael/data/Ficher2 root@192.168.10.131:/var/www/

Quelques explications, vous allez voir, ce n'est pas si complexe que cela 

Ici, on retrouve la structure de la commande "cp" dans laquelle on spécifie la source, puis la destination. Entre les deux, on peut voir "root@192.168.10.131 :".

En effet, étant donné que l'on souhaite envoyer le fichier en question sur une autre machine, il faut bien spécifier son IP, de plus, si l'on passe par SSH, il faut s'authentifier. On va donc se logguer en root sur notre machine distante pour y déposer notre fichier. Le ":" permet de spécifier le chemin dans la machine distante. S'il n'est pas spécifié, les fichiers atteriront dans le dossier par défaut de l'utilisateur : la home. (/root pour l'utilisateur root, /home/user pour l'utilisateur "user", etc.).

Note : Il faut bien sûr être certain que le chemin de destination existe sur la machine de destination. Dans le cas contraire, nous obtiendrons une erreur de la part de SSH.

Téléchargement d'un fichier via SSH en utilisant SCP

Si l'on souhaite effectuer l'opération inverse, c’est-à-dire télécharger un fichier du serveur Linux vers la Machine mickael alors que l'on se trouve sur cette même Machine Mickael, c'est aussi possible. Il faut pour cela connaître à l'avance le chemin et le nom du fichier à télécharger puis utiliser scp de cette façon :

scp root@192.168.10.131:/var/www/Fichier2 /home/mickael/data/

Ici, on retrouve exactement la même construction que notre précédente commande mais nous avons inversé l'ordre des chemins. Cela parce que la source doit toujours se trouver avant la destination. On spécifie à nouveau l'utilisateur avec lequel se connecter en SSH sur l'IP distante et le chemin sur le serveur distant. On précise ensuite le dossier local dans lequel nous souhaitons entreposer les fichiers téléchargés.

Transfert de dossier : utilisation de la récursivité

Ici, nous n'avons pour l'instant téléchargé et envoyé qu'un fichier unique. Cela est pratique mais peut devenir long si l'on souhaite envoyer tout un dossier avec plusieurs fichiers à l'intérieur. La commande SCP nous offre en fait la possibilité de faire une copie distante avec de la récursivité.

Le fait qu'une action soit récursive veut simplement dire que si des sous-éléments de l'élément visé sont présents, l'action s'effectuera également sur eux.

Autrement dit si on décide de copier un répertoire via SCP, les fichiers de ce répertoire seront également copiés et réorganisés de la même façon chez la machine cible. Il faut pour cela ajouter l'option "-r" juste après "scp", exemple :

scp -r /home/mickael/data/ root@192.168.10.131:/var/www/

En suivant notre schéma initial, les fichiers "Ficher1", "Fichier2" et "Fichier3" vont tous trois être transférés, et cela à l'aide d'une seule commande, pratique n'est-ce pas ?

D'ailleurs lors d'un transfert, nous pouvons voir la liste des fichiers transférés :

ssh-scp-linux-02

Une petite précision concernant la situation dans laquelle le port du serveur SSH n'est plus le port par défaut (22), c'est une configuration que nous avons étudié lors de la configuration d'OpenSSH. Quand le SSH est changé, l'application ne peut naturellement pas le devenir car elle vise par défaut le port 22. Il faut donc spécifier à SCP le port sur lequel aller discuter, cela se fait via l'option "-P", à spécifier avant la source et la destination :

scp -r -P 7256 /home/mickael/data/ root@192.168.10.131:/var/www/

Utilisation d'un client Windows

Si votre client est un Windows, vous pouvez utiliser le logiciel WinSCP qui se chargera de faire le même type de transfert avec une interface graphique.

Vous pouvez trouver WinSCP, qui porte d'ailleurs bien son nom, sur son site officiel : http://winscp.net/eng/download.php .

Après avoir démarré le logiciel (et l'avoir installé s'il s'agit de la version non portable) vous verrez apparaître cette fenêtre :

ssh-scp-linux-03
Fenêtre de connexion WinSCP

Ici, on retrouve une configuration un peu comme celle de Putty sous Windows, on peut y spécifier l'IP ou le nom de notre serveur cible, son port, le nom d'utilisateur et son mot de passe. Vous retrouverez également en haut le champ" Protocole de fichier". En effet, WinSCP permet de gérer les transferts en SCP, mais également en SFTP (que nous verrons juste après) et en FTP, dans cette liste de sélection, choisissez donc "SCP" :

ssh-scp-linux-04

On pourra ensuite cliquer sur "Connexion" pour lancer la connexion. On se retrouvera alors avec une fenêtre comme celle-ci :

ssh-scp-linux-05

Ici, on peut apercevoir l'arborescence de mon client Windows à gauche, et l'arborescence de mon serveur Linux à droite, avec la possibilité de simplement glisser/coller des fichiers entre les deux, le tout de manière sécurisée grâce au SSH !

Comme vous le voyez, WinSCP vous propose de nombreuses options comme des raccourcis, des enregistrements de session, etc. Mais ce n'est pas l'objet de ce cours, il fait néanmoins partie de la boite à outils d'un bon administrateur système. 😉

II. SFTP : Secure FTP

SFTP (Secure FTP), qui comme son nom l'indique est un dérivé du protocole "FTP" (File Transfert Protocol), permet lui aussi de transférer des fichiers d'une machine Linux à une autre de façon très simple.

SFTP est une extension du protocole SSH, plus techniquement un "sub-system", on peut le voir rapidement dans le fichier de configuration d'OpenSSH :

subsystem sftp /usr/lib/openssh/sftp-server

On peut décrire le SFTP comme l'encapsulation du protocole FTP dans une "couche" sécurisée qu'est SSH. Autrement dit, en SFTP, client et serveur dialoguent en FTP mais utilisent SSH pour faire transiter les paquets, ce qui permet de sécuriser l'utilisation du FTP.

En effet, le FTP est un protocole ancien qui n'a pas été conçue à la base avec une pensée pour la sécurité. Il fait passer les informations (identifiants et fichier) en clair sur le réseau ! SSH permet alors de sécuriser l'utilisation du FTP en chiffrant les échanges entre les machines.

En l'état, il existe peu de différence entre utiliser SCP ou SFTP. Avec un client comme WinSCP sous Windows, l'effet sera exactement le même et l'utilisation aussi. Vous n'aurez qu'à choisir "SFTP" au lieu de "SCP" lors du remplissage des informations de connexion.

Sous Linux, en tant que client, la commande "sftp" s'utilise exactement comme la commande "scp", celle que nous avons vu plus haut.

III. SSHFS : SSH FileSystem

SSHFS signifie "SSH File System", il s'agit ici d'une notion un peu plus avancée que du simple transfert de fichier comme SCP ou SFTP puisque SSHFS va nous permettre de monter un répertoire d'une machine Linux sur une autre, de la même manière que l'on peut monter un répertoire SMB entre deux machines.

Quelle différence entre monter un répertoire et copier un fichier ?

Monter un répertoire va permettre à la machine cliente de voir un répertoire en temps réel alors que celui-ci se situe sur la machine distante. Si une modification est effectuée sur ce répertoire, le client le verra instantanément et il pourra agir dessus comme s’il s'agissait d'un répertoire local. Dans le cas de SSHFS, l'échange qui permet la lecture et l'écriture sur le répertoire est fait sur le réseau en utilisant le protocole SSH.

Cela peut être encore un peu flou pour le moment, dans ce cas-là, rien ne vaut la pratique ! Reprenons notre schéma :

 

ssh-scp-linux-01

Ici, en me situant sur le "Serveur Linux", je voudrais avoir accès en permanence au dossier "/home/mickael/data" de "Machine mickael". Je souhaite donc monter ce répertoire distant en local, admettons dans /mnt/data. Je dois commencer par installer SSHFS sur mes deux machines Linux, pour l'installer sous Debian 8 :

apt-get install sshfs

Pour l'installer sous CentOS 7 :

  rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum install fuse-sshfs

C'est ensuite très simple, si l'on souhaite monter le répertoire "/home/mickael/data" de la machine de Mickael sur le serveur, on va, depuis le serveur, exécuter les commandes suivantes :

  mkdir /mnt/data
sshfs mickael@192.168.10.1:/home/mickael/data /mnt/data

Plus clairement, je demande à monter le répertoire /home/mickael/data de la machine 192.168.10.1 dans mon répertoire local /mnt/data, le tout en m'authentifiant en tant que "mickael" sur la machine distante. Attention, il ne s'agit pas d'une copie, si je démonte le répertoire /mnt/data, les données ne seront plus présentes.

Dès lors, quand on se rend sur le répertoire local /mnt/data, on pourra voir en direct le contenu du répertoire /home/mickael/data distant, et mieux encore, on pourra y ajouter, supprimer ou modifier des fichiers et dossiers à volonté étant donné que le répertoire est monté. Si vous avez du mal à saisir le concept, je vous recommande de tester cela entre deux machines Linux, cela devient tout de suite plus clair !

D'ailleurs, si vous utilisez la commande "mount" qui permet sous Linux de visualiser les points de montage présents, on pourra clairement voir notre montage SSHFS :

mickael@192.168.10.131:/home/mickael/data on /mnt/data type fuse.sshfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0)

Une fois nos opérations terminées, il est recommandé de démonter le montage effectué. C’est-à-dire de couper la liaison SSHFS entre les deux machines. Pas d'inquiétude, cela ne changera rien aux modifications faites étant donné qu'elles sont faites en direct. Pour ce faire, utilisez la commande "umount" et précisez le répertoire de montage local :

umount /mnt/data

Nous avons vu dans ce chapitre les différentes façons dont SSH peut être utilisé pour effectuer des transferts de fichier, ce sont des techniques très souvent utilisées lors de l'administration d'un système contenant des serveurs Linux, notamment quand ceux-ci sont distants comme les serveurs hébergés chez des grands hébergeurs. Nous allons dans le prochain chapitre étudier les possibilités qu'offre SSH concernant le X11 Forwarding.


Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

    Mickael Dorigny

    Fondateur d'IT-Connect.fr et d'Information-security.fr. Auditeur sécurité chez Amossys.

      mickael a publié 475 articles sur IT-Connect.See all posts by mickael