Chapitre 41.  Transférer des fichiers

1. Téléchargement anonyme : HTTP
2. Téléchargement identifié et sécurisé : SFTP

Il existe deux façons de servir des fichiers :

le transfert de fichiers

qui permet de télécharger et de téléverser des fichiers sur un serveur : c'est l'objet de ce chapitre ;

le partage de fichiers

qui permet d'accéder à des fichiers et à des répertoires depuis des ordinateurs distants comme s'ils étaient présents sur un périphérique local : techniquement, il s'agit alors de systèmes de fichiers réseau, qui feront l'objet du Chapitre 43 et du Chapitre 44.

Traditionnellement, on utilise pour cela le protocole FTP (file transfer protocol). Ce protocole souffre cependant de grands défauts, et est largement déprécié au profit des protocoles HTTP (hypertext transfer protocol, le protocole du Web) et SFTP (SSH file transfer protocol). Ce sont donc ces deux systèmes que nous vous proposons de découvrir.

1. Téléchargement anonyme : HTTP

Installation du serveur d'Apache HTTPD

Si vous souhaitez mettre à disposition des fichiers, sur l'Internet ou sur votre réseau local, le plus simple est d'installer un serveur HTTP comme Apache HTTPD :

# aptitude install apache2

Après son installation, le serveur HTTP démarre. Par défaut, il est configuré pour servir les fichiers contenus dans le répertoire /var/www/. Ce répertoire contient déjà un fichier HTML de démonstration, index.html.

Mettre à disposition des fichiers

Pour proposer des fichiers en téléchargement, vous pouvez tout simplement les placer dans ce répertoire /var/www/ :

# cp formation-debian.pdf /var/www/

Tous les fichiers que vous placez dans ce répertoire seront accessibles à l'URL http://nom_du_serveur/nom_du_fichier, dans notre cas : http://formation-debian.via.ecp.fr/formation-debian.pdf.

Proposer une liste des fichiers

Pour le moment, lorsque quelqu'un accède à l'URL racine de votre serveur, http://nom_du_serveur/, c'est le fichier de démonstrations /var/www/index.html qui s'affiche. Apache est capable d'afficher à la place une liste des fichiers disponibles : il suffit pour cela de retirer le fichier index.html :

# rm /var/www/index.html

Espace personnel par utilisateur

Si vous êtes seul à utiliser votre ordinateur, vous pouvez sans problème utiliser le répertoire /var/www/ pour diffuser vos fichiers, quoiqu'il faille à chaque fois effectuer les copies ou déplacements en tant que root.

Il est également possible de proposer à chaque utilisateur la possibilité d'avoir un espace Web personnel. Pour cela, il faut activer un module du serveur Apache HTTPD, puis redémarrer celui-ci :

# a2enmod userdir
Enabling module userdir.
Run '/etc/init.d/apache2 restart' to activate new configuration!
# /etc/init.d/apache2 restart
* Restarting web server apache2
 ... waiting                                              [ OK ]

Après cela, un utilisateur ksaffier peut créer dans son répertoire personnel un sous-répertoire nommé public_html : tout ce qu'il y placera sera alors disponible à l'URL http://nom_du_serveur/~ksaffier :

% mkdir ~/public_html
% cp formation-debian.pdf ~/public_html/
[Astuce] Astuce

Vous pouvez également construire dans ce répertoire un site Web personnel !

2. Téléchargement identifié et sécurisé : SFTP

Un serveur HTTP permet de mettre à disposition des fichiers, qui peuvent alors être téléchargés par n'importe qui. En revanche, cela ne peut pas convenir si vous souhaitez contrôler l'accès à ces fichiers, ou si vous souhaitez déposer des fichiers sur votre serveur. Pour cela, la meilleure solution consiste à utiliser le protocole SFTP.

Installation

SFTP signifie SSH file transfer protocol : il s'agit donc d'un protocole lié à SSH, et qui est intégré au serveur OpenSSH. Ce serveur a fait l'objet du Chapitre 40, auquel je vous renvoie si vous ne l'avez pas déjà installé.

Charger et déposer des fichiers

Comme expliqué au Chapitre 40, vous pouvez accéder à votre serveur SFTP :

avec la commande sftp utilisateur@serveur

assez limitée, son utilisation, très basique est semblable à celle du programme ftp, avec des commandes comme get et put ;

avec la commande lftp sftp://utilisateur@serveur

beaucoup plus agréable, ce logiciel est décrit au Chapitre 22 ;

sous GNOME

directement avec Nautilus, le gestionnaire de fichiers de GNOME ;

sous Windows

, avec un logiciel comme WinSCP.

Limiter l'accès au répertoire personnel

Il est possible de limiter l'accès de certains utilisateurs, pour qu'ils puissent par exemple administrer leur site Web personnel, mais n'aient pas le droit d'accéder aux fichiers des autres utilisateurs, ni à quoi que ce soit d'autre d'ailleurs.

Il est probable que vous ne souhaitiez pas limiter ainsi tous vos utilisateurs, parce que vous n'auriez alors plus la possibilité de vous connecter vous-même à votre serveur par SSH. Nous allons donc créer un groupe qui servira à identifier les utilisateurs qui doivent être ainsi limités, et y ajouter ces utilisateurs :

# addgroup chrooted
# adduser ksaffier chrooted

Nous allons maintenant éditer le fichier de configuration du serveur OpenSSH, /etc/ssh/sshd_config. Tout d'abord, il faut modifier ainsi la ligne Subsystem sftp :

Subsystem sftp internal-sftp

Ajoutez ensuite, à la fin du fichier, la section qui permettra de contraindre tous les membres du groupe précédemment défini dans leur répertoire personnel, et de ne les autoriser à faire que du SFTP :

Match Group chrooted
    ChrootDirectory %h
    ForceCommand internal-sftp

Explications : la première ligne demande de n'appliquer la suite qu'aux utilisateurs membres du groupe chrooted. La seconde définit un répertoire « prison » ou chroot, le %h désignant le répertoire personnel de l'utilisateur. Enfin, la dernière ligne force l'utilisation de SFTP, ce qui interdit par exemple les connexions SSH normales.

[Avertissement] Avertissement

Cette dernière ligne est importante. En effet, si vous l'omettez, vos utilisateurs ne pourront pas, dans un premier temps, ouvrir de connexion SSH, puisqu'ils sont contraints de rester dans leur répertoire personnel, qui ne contient pas de Shell. Or, ils pourront tout à fait déposer eux-mêmes un Shell dans leur répertoire et pourront alors se connecter normalement ! Ils resteront toujours limités dans leur chroot, mais comme il existe des moyens de sortir d'un chroot, autant éviter cette éventualité, et ne fournir d'accès SSH qu'aux utilisateurs auxquels vous êtes sûr de pouvoir faire confiance.

Dernière opération : le répertoire de chroot doit appartenir à l'utilisateur root. Il va donc falloir changer le propriétaire du répertoire personnel de chaque utilisateur ainsi limité, mais également leur donner un moyen de poser des fichiers ! Je vous propose donc de leur créer un sous-répertoire public_html/, dans lequel ils pourront contruire leur site Web personnel :

# chown root:root ~ksaffier
# mkdir ~ksaffier/public_html
# chown ksaffier ~ksaffier/public_html

Lorsque vos utilisateurs se connectent en SFTP, ils sont donc placés dans leur répertoire personnel comme racine virtuelle. Si vous souhaitez que vos utilisateurs arrivent directement dans le répertoire où ils doivent déposer leurs documents (/public_html/, de leur point de vue), vous pouvez leur créer un pseudo-répertoire personnel pointant vers ce répertoire. En effet, OpenSSH essaie de passer dans un répertoire personnel à l'intérieur de la racine virtuelle :

    # mkdir ~ksaffier/home
    # ln -s ../public_html ~ksaffier/home/ksaffier

C'est fait : maintenant, l'utilisateur ksaffier peut se connecter en SFTP à votre serveur, mais ne peut accéder qu'à son répertoire personnel, et ne peut écrire que dans son répertoire public_html/.