Table of Contents
Aujourd'hui, nous voyons le serveur FTP (file transfer protocol).
Dans notre étude de cas, nous voulons que chaque utilisateur accède à son hébergement: il faut que lorsqu'il s'identifie, il se trouve directement dans son espace FTP. Il nous faut aussi pouvoir gérer un serveur anonyme et un dépôt (on peut uploader anonymement).
Choix du logiciel
Soft courants: wu-ftp, proftpd, vsftpd.
Le choix s'est porté sur proftpd car:
- il est modulaire
- la syntaxe de configuration est directement inspirée de celle d'1)
- gestion d'hôtes virtuels
Installation
sudo aptitude install proftpd
debconf demande si on veut le lancer depuis inetd ou indépendamment: standalone
Il tourne. Vérifier quel utilisateur a lancé le processus:
ps aux | grep ftp
ou
ps -ef | grep ftp
C'est l'utilisateur nobody.
On peut se connecter avec un utilisateur existant sur la machine:
linux@403-15:~$ ftp localhost Connected to 403-15.deblab.org. 220 ProFTPD 1.2.10 Server (Debian) [127.0.0.1] Name (localhost:linux): 331 Password required for linux. Password: 230 User linux logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp>
Configuration
Dans /etc/proftpd.conf
Annonce
L'option “Defer Welcome”, si elle est activée, permet de cacher le nom du serveur (sécurité par l'obscurité ;).
Defer Welcome on:
linux@403-15:~$ ftp localhost Connected to 403-15.deblab.org. 220 ProFTPD 1.2.10 Server ready. Name (localhost:linux): toto 331 Password required for toto. Password: 230 User toto logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp>
Restreindre l'accès
Par défaut, le serveur permet aux personnes ayant un compte de se connecter au serveur FTP. Elle arrivent dans leur home directory, /home/user/.
Si on veut interdire l'accès à un utilisateur, il suffit de mettre son username dans /etc/ftpusers. Cette manière n'est pas recommandée par les développeurs de proftpd.
Autre manière, dans le fichier de configuration, on peut utiliser la balise <limit>:
<limit login> AllowUser jack DenyAll
Si on ne met pas la ligne DenyAll, comme par défaut il accepte tous les users, ça n'a pas d'effet.
Exercice
Créer un utilisateur toto, créer un fichier dans /home/toto/. Restreindre l'accès ftp à toto et essayer.
sudo adduser toto su - toto touch fichier.txt
Dans /etc/proftpd.conf, ajouter en dehors d'une balise existante (par exemple à la fin du fichier):
<Limit LOGIN> AllowUser toto DenyAll </Limit>
Ensuite, redémarrer le serveur:
sudo /etc/init.d/proftpd restart
Si on essaie avec un autre utilisateur, ça ne fonctionne pas:
linux@403-15:~$ ftp localhost Connected to 403-15.deblab.org. 220 ProFTPD 1.2.10 Server (Debian) [127.0.0.1] Name (localhost:linux): linux 331 Password required for linux. Password: 530 Login incorrect. Login failed.
Avec toto, ça marche.
chroot jail
Lorsqu'on est connecté, on peut remonter dans l'arborescence et voir des répertoires et des fichiers sensibles. Pour éviter cela, on fait une prison chroot en ajoutant dans le fichier de configuration (hors balise):
DefaultRoot ~
Lorsque l'utilisateur s'identifie, il se retrouve dans son répertoire home, mais il apparaît pour lui comme root (/), et il ne peut donc pas remonter l'arborescence.
Serveur anonyme
Dans le fichier, enlever le premier # des lignes à partir de
# <Anonymous ~ftp>
jusqu'à la fermeture de cette balise.
Si on a restreint l'accès, il faut rajouter l'utilisateur ftp:
<Limit LOGIN> AllowUser toto ftp DenyAll </Limit>
Le répertoire home de l'utilisateur anonymous (alias de l'utilisateur ftp) est /home/ftp/. N.B: même si la directive
DefaultRoot ~
n'est pas activée, il y a un chroot jail et pwd donne /
Si on regarde ce qu'on a décommenté dans la balise <Anonymous>, on note que tous les répertoires et sous-répertoires ne permettent pas l'écriture.
Hôtes virtuels
Attention ici, dans Apache l'hôte est inclue dans l'URL (HTTP 1.1); or, le protocole FTP ne gère pas les hôtes virtuels: il traduit en adresse IP. Donc, on va plutôt jouer les numéros de port. C'est assez lourd comme gestion.
Tom a un hébergement chez nous: www.tom.com (il y a donc un hôte virtuel Apache). Comment va-t-il mettre ses pages à jour? avec un client FTP.
On peut mettre le ~DocumentRoot à /home/tom/web, et quand il se logge avec son client ftp, il est dans /home/tom/
Exercice
Comme on va avoir les copains de Tom comme clients, on va écrire un script /usr/local/bin/www-mkhost qui fera les choses suivantes: Pour la partie serveur web:
- créer un hôte virtuel 2): ajout d'un fichier /etc/apache2/sites-available/www.domaine.com
- créer un lien symbolique dans sites-enabled
- créer un nouvel utilisateur qui a comme home directory /hosts/user
- créer un répertoire /hosts/user/web/ et une page d'accueil /home/hosts/web/index.html
Pour la partie FTP, il faut ajouter le nom de l'utilisateur à la fin de la ligne AllowUser (sans doute avec sed).
sudo vi /usr/local/bin/www-mkhost
Contenant:
#!/bin/bash # usage www-mkhost domain user # creation du fichier virtual host d'apache VHFILE=/etc/apache2/sites-available/$1.conf echo "<VirtualHost *>" >> $VHFILE echo "ServerName $1" >> $VHFILE echo "DocumentRoot /hosts/$2/$1" >> $VHFILE echo "ErrorLog /var/log/apache2/$1.log" >> $VHFILE echo "TransferLog /var/log/apache2/$1.access.log" >> $VHFILE echo "CustomLog /var/log/apache2/$1.access.log combined" >> $VHFILE echo "</VirtualHost>" >> $VHFILE # creation du lien symbolique dans sites-enabled ln -s $VHFILE /etc/apache2/sites-enabled/$1.conf # ajout dans /etc/hosts de l'hote virtuel echo "127.0.0.1 $1" >> /etc/hosts # creation de l'utilisateur adduser --home /hosts/$2 $2 # creation du repertoire web et de la page d'accueil mkdir /hosts/$2/$1 touch /hosts/$2/$1/index.html # relance du serveur web /etc/init.d/apache2 reload
Ensuite, le rendre exécutable:
sudo chmod 755 /usr/local/bin/www-mkhost
Et le lancer:
sudo www-mkhost www.tom.com tom