User Tools

Site Tools


coursieps:20050909

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
1)
/Apache2 Apache
coursieps/20050909.txt · Last modified: 2013/01/30 17:50 (external edit)