# [HOWTO] Configurer un serveur FTP avec Proftpd

## kopp

But : avoir un serveur ftp qui puisse autoriser les connexions anonymes, aussi bien qu'en utilisateur, en permettant l'envoi de données par les utilisateurs, le téléchargement etc...

Dernière mise à jour : 31/05/06

 - correction par rapport à l'overwrite

 - corrections de fautes de français (bouh j'ai honte)

Sommaire :

     I . Installation

     II . Configuration

     III . Bonus

I - Installation

On va installer le paquet net-ftp/proftpd, qui nécessitera entre autre ftpbase.

Avant, il était nécessaire de rajouter le use authunix, qui maintenant n'est plus nécessaire et son ancien effet est aujoud'hui direct. Merci Shingara pour la remarque.

Ensuite, on "emerge" proftpd :

```
#  emerge proftpd
```

Voilà, maintenant on va passer à la configuration :

II - Configuration

Alors, on va créer un utilisateur sous lequel tournera le serveur :

```
#  useradd -d /home/ftp -g ftp -p ftp ftp
```

Nous voilà donc avec un utilisateur ftp, appartenant au groupe ftp, ayant pour répertoire /home/ftp (là ou on va stocker les repertoire du ftp) et pour mot de passe ftp

Ensuite, on va créer le fichier de configuration :

on va donc éditer le fichier de configuration /etc/proftpd/proftpd.conf avec votre éditeur préféré.   (*hint* vim *hint*)

Alors on va donner un nom au serveur, lui dire de fonctionner en standalone, et préciser que toutes les connections doivent être traitées par ce serveur, qu'un shell valide n'est pas nécessaire. On précise qu'on utilise PAM pour s'identifier, avec le service ftp

```
ServerName          "Exemple de Serveur Proftpd"

ServerType          standalone

DefaultServer       on

RequireValidShell   off

AuthPAM             on

AuthPAMConfig       ftp

```

On va ensuite, par securité, désactiver le login en root :

```

RootLogin off
```

Ensuite, on précise le port à utiliser : par defaut le port ftp est 21.

```
Port            21

```

(Rem : n'oubliez pas d'autoriser la circulation par ce port dans vos règles iptables)

On règle le umask :

```
Umask 022
```

Ensuite, on dit sous quel utilisateur le serveur doit être lancé, on a créé un utilisateur "ftp" tout à l'heure à cet effet.

```
User ftp

Group ftp
```

Si vous voulez limiter le nombre de connections (pour éviter une DOS par exemple) :

```
MaxInstances 10
```

On peut autoriser le remplaçement de fichiers (overwrite) de manière globale :

```
AllowOverwrite on
```

Pour l'autoriser au cas par cas, voyez plus bas la section d'ajout d'utilisateurs.

Le serveur autorise les comptes de la machine n'ayant pas de compte dans ce fichier à se connecter, et à se ballader avec leurs droits normaux : si vous voulez les limiter à un certain endroit, ajoutez ceci :

```
DefaultRoot /home/ftp
```

Ici, /home/ftp sera consideré comme la racine, et on ne pourra pas aller plus haut dans l'arborescence.

Voilà, les règles de bases sont écrites, on va maintenant ajouter les utilisateurs

Utilisateur anonyme

On va créer un répertoire publique en lecture seule seulement pour les utilisateurs anonymes

```
su ftp

mkdir /home/ftp/pub
```

Ensuite, on ajoute un utilsateur anonyme qu'on restreint à ce répertoire, en lecture seulement

```
<Anonymous /home/ftp/pub>

    User ftp

    Group ftp

    UserAlias anonymous ftp # on "alias" avec anonymous

    MaxClients 10 # si on veut limiter le nombre de clients anonymes connectés

    <Limit WRITE>

         DenyAll

    </Limit>

</Anonymous>
```

Ensuite, si vous voulez ajouter un utilisateur (qu'on appellera user1), avec mot de passe, autorisation d'upload etc 

```
<Anonymous /home/ftp/user1> #on donne comme répertoire racine /home/ftp/user1, mais on peut aussi donner son $HOME en mettant ~user1 à la place

   User user1

   Group ftp #il demande que l'utilisateur appartienne au groupe ftp

   AnonRequirePassword yes # on demande l'identification par mot de passe

   <Limit STOR READ CWD DELE MKD RNTO RMD RETR>

       AllowAll

   </Limit>

</Anonymous>
```

On a autorisé l'utilisateur à envoyer des données, lire, changer de répertoire, effacer des fichiers, créer des répertoires, renomer, effacer des répertoires, et télécharger depuis le serveur.

Pour permettre à un utilisateur précis de remplacer des fichiers, il faut ajouter dans la configuration AllowOverwrite on :

```
<Anonymous /home/ftp/user1> 

   User user1

   Group ftp

   AnonRequirePassword yes

   AllowOverwrite on

   <Limit STOR READ CWD DELE MKD RNTO RMD RETR>

       AllowAll

   </Limit>

</Anonymous>
```

Voilà, pour lancer le serveur, il y a un script dans /etc/init.d/

Il suffit de taper :  

```
#  /etc/init.d/proftpd start
```

Et pour que le serveur soit démarré automatiquement au démarrage de la machine : 

```
#  rc-update add proftpd default
```

Note : pour vous connecter avec votre explorateur en anonyme, il suffit de taper l'adresse du ftp.

si vous voulez être connecté avec un utilisateur particulier, tapez l'adresse comme ceci:

ftp://nom_d_utilisateur@adresse_du_ftp

ATTENTION, comme Ey le fait remarquer, la connection en ftp n'est pas sécurisée par défaut, donc la connection par utilisateur normal non associé au ftp, donnant accès à tout, est  à proscrire, de même qu'utiliser le même utilisateur normal que l'on utilise pour d'autres opérations sur la machine. Je vous conseille de créer des utilisateurs dédiés au ftp, n'appartenant qu'à ce groupe, et surtout ayant un shell non-valide, i.e /bin/false, pour pouvoir bloquer les connections à ssh sur ce critère dans le pire des cas...

III - BONUS

Règles iptables

Alors : voici des règles iptables fournies par Profy

Note : Dans le cas présent, l'interface de connection est ppp

```
#FTP serveur(serveur) <-> internet(client)

#ports de l'interfaces

#Ici on autorise les amis

iptables -A INPUT -p tcp -s <ip ou de domaine du pote> -i ppp0 --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp -s <ip ou de domaine du pote> -i ppp0 --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp -o ppp0 --sport 21 -m state --state ESTABLISHED -j ACCEPT

#ports pour le transfert de fichier

iptables -A INPUT -p tcp -i ppp0 --dport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp -o ppp0 --sport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp -i ppp0 --sport 1024:65000 --dport 1024:65000 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp -o ppp0 --sport 1024:65000 --dport 1024:65000 -m state --state ESTABLISHED,RELATED -j ACCEPT 
```

Accès à un repertoire monté

Lorsqu'on se connecte avec un utilisateur, le répertoire de connection est considéré comme la racine, on ne peut donc pas remonter plus haut dans l'abrorescence réelle du disque. C'est bien joli, mais si on veut accéder à un autre endroit du disque, on ne peut pas. Et bien sûr, les liens symboliques ne fonctionnent pas.

Pour remédier à celà, il existe une astuce : on crée un répertoire mnt/ par exemple, et là on va y mettre une image du répertoire auquel on voudrait accéder, avec cette commande :

```
mount -n --bind /mnt/rep_source /home/mon_user/mnt/rep_destination 1>&2 
```

Pour automatiser ceci, il suffit de placer la ligne suivante dans /etc/fstab :

```
/mnt/rep_source        /home/mon_user_mnt/rep_destination        none       bind         0 0
```

Merci à Kwenspc pour cette astuce! Et à Ey pour la ligne dans le fstab 

Voilà une petite configuration pour un serveur ftp simple.

Voilà, c'est un premier how to, je suis ouvert à tous commentaires, modifications ou corrections que vous auriez à apporter.

Ce document est publié sous license GNU FDL

(note : ouais je sais, ça ne sert à rien, mais c'est plus fun  :Smile: )Last edited by kopp on Wed May 31, 2006 1:45 pm; edited 8 times in total

----------

## cylgalad

envoi de données...

----------

## kopp

 *cylgalad wrote:*   

> envoi de données...

 

Oups, plus c'est gros, moins je les vois moi  :Smile:  ... bon après avoir cité deux fois au lieu d'éditer, c'est corrigé, avec quelques autres....

----------

## cylgalad

Il y a pleins d'autres fautes  :Wink: 

----------

## kopp

Voilà, j'ai tout relu, et normalement, je n'en ai pas laissées...

Enfin, je suis un peu une buse en orthographe... donc rien n'est sûr! mais ça doit déjà être moins moche  :Smile: 

----------

## -KuRGaN-

Nikel, merci pour le how-to.

Ben je sens que je vais en faire un sur vsftpd histoire de garnir les how-to français services FTP  :Wink: 

----------

## profy

Les regles iptables pour ftp, le client ftp peut ainsi fonctionner en mode passif (A tester).

ppp0 : interface de la connexion Internet.

Ne pas oublier d'activer ip_conntrack_ftp.

```

#FTP serveur(serveur) <-> internet(client)

#ports de l'interfaces

#Ici on autorise les amis

iptables -A INPUT -p tcp -s <ip ou de domaine du pote> -i ppp0 --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp -s <ip ou de domaine du pote> -i ppp0 --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp -o ppp0 --sport 21 -m state --state ESTABLISHED -j ACCEPT

#ports pour le transfert de fichier

iptables -A INPUT -p tcp -i ppp0 --dport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp -o ppp0 --sport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp -i ppp0 --sport 1024:65000 --dport 1024:65000 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp -o ppp0 --sport 1024:65000 --dport 1024:65000 -m state --state ESTABLISHED,RELATED -j ACCEPT

```

----------

## kopp

Merci, j'ai ajouté ça a la fin du how to

----------

## kwenspc

sympa le howto  :Cool: 

@kopp :  t'as mattés tes message privés?  :Wink: 

----------

## kopp

En fait, je me rends compte d'un petit problème.

Ceci marche bien quand on se connecte avec un client ftp, genre gFTP...

seulement quand on se connecte avec Firefox, je ne vois pas moyen d'acceder aux parties appartenant aux utilisateurs "privés"... 

Vous connaissez un moyen pour faire ça ?

----------

## obris

merci pour le Howto. C'est exactement ce que je cherchais.

----------

## kopp

Bon, en fait pour mon problème avec mozilla, il suffit de mettre dans la barre d'adresse : ftp://user@adresse_du_ftp et voilà

Problème, je viens de voir que pour les users qui ne sont pas dans le proftpd.conf, ben ça connecte en mettant directement  au repertoire du type... génant quand même tout ça....

Je vais essayer de voir si je trouve une méthode poru empecher ça... (autre que mettre tous les users dans le fichier de conf bien sûr  :Wink: )

----------

## DuF

Pour les users qui se connectent directement dans leur répertoire, il faut jouer avec la directive : DefaultRoot qu'il faut mettre dans la section globale pour qu'elle s'applique aux utilisateurs qui ne sont pas explicitement définis dans le fichier de conf de proftpd.

----------

## kopp

Effectivement c'est ça! Merci Duf

Je rajouterai ça au how-to ce soir

----------

## Ey

 *kopp wrote:*   

> Le serveur autorise les comptes de la machine n'ayant pas de compte dans ce fichier à se connecter, et à se ballader avec leurs droits normaux : si vous voulez les limiter à un certain endroit, ajoutez ceci :
> 
> ```
> DefaultRoot /home/ftp
> ```
> ...

 

Je penses qu'il faudrait que tu insistes plus sur le fait que FTP n'est absolument pas sécurisé (sauf utilisation de TLS) et que le mot de passe circule en clair et que l'on perd tout l'intérêt de se loguer en ssh sur la machine vu qu'il suffit d'écouter le trafique ftp pour voir passer les mots de passe...

Donc le defaultroot ne protège pas de grand chose, le mieux est d'interdire le login en user ou d'activer la crypto...

 *kopp wrote:*   

> 
> 
> Accès à un repertoire monté
> 
> Lorsqu'on se connecte avec un utilisateur, le repertoire de connection est considéré comme la racine, on ne peut donc pas remonter plus haut dans l'abrorescence réelle du disque. C'est bien joli, mais si on veut acceder à un autre endroit du disque, on ne peut pas.Et bien sur, les liens symboliques ne fonctionnent pas.
> ...

 

Euh ça peut se mettre dans le fstab tout ça...

```
/mnt/rep_source        /home/mon_user_mnt/rep_destination        none       bind         0 0
```

----------

## kopp

Lol, oui pas bête pour la remarque sur le fstab, j'vais pas réfléchi, j'avais juste suivi ce que kwenspc m'avait dit... pas bien de faire le mouton!!!!

Sinon, merci pour la remarque sur la sécurité, faudra que je jette un oeil sur l'utilisation d'une connection secure pour y rajouter.

D'ailleurs, à tous ceux qui ont des remarques ou astuces à fournir, ils sont les bienvenus, le but étant de donner le maximum d'info à celui qui voudra configurer son serveur ftp avec proftpd. J'ai pris l'initiative, mais comme vous pouvez le voir, je ne suis pas un pro  :Wink:  Donc toute aide est la bienvenue

----------

## Dais

On va me trouver anti-geek mais .. et gproftpd alors ?

----------

## kopp

Là, je reste sur le derrière lol! 

*cherche une excuse bidon*

*a trouvé une excuse bidon* --->

Ouais mais euh, ça fait pas l337 h4X0r le front end

Tant pi! Mais bon là on peut rajouter plus de trucs  :Smile:  Et y a les bonus  :Wink: 

<--*essaye de redonner de la valeur à son truc qui en a perdu d'un coup beaucoup*

Bon sinon pour continuer, assez souvent quand j'essaye de filer des trucs sur mon ftp à des utilisateurs non-avertis (comprennez des utilisateurs windows) ils arrivent pas à se connecter, en user ou en anonyme avec IE 

Celà vient-il de IE (ça ne m'étonnerait même pas, mais ne soyons pas mauvaise langue quand même) ? de sa configuration(ou celle de windows) ? du fait qu'on utilise une identification avec PAM ?

Vous avez une idée ?  A part le fait de leur conseiller Firefox, voir de changer d'OS ?  :Wink: 

----------

## ultrabug

merci pour le howto  :Smile: 

----------

## shingara

 *kopp wrote:*   

> 
> 
> ```
> #  echo "net-ftp/proftpd authunix" >> /etc/portage/package.use
> ```
> ...

 

Cet ajout de USE ne sert plus a rien, maintenant il n'y a plus ce USE, je pense qu'il a Ã©tÃ© remplacer par le USE noauthunix.

Je cite le changelog :

 *changelog wrote:*   

> *proftpd-1.2.10-r5 (08 Jun 2005)
> 
>   08 Jun 2005; Gustavo Felisberto <humpback@gentoo.org>;
> 
>   -proftpd-1.2.10-r4.ebuild, +proftpd-1.2.10-r5.ebuild:
> ...

 

Sinon, merci pour ce HOWTO, il m'a bien aidÃ©  :Smile: 

----------

## kopp

De rien  :Wink: 

Sinon, merci pour la remarque, c'est modifié dans le howto. (Désolé j'ai été un peu long à réagir, hier soir j'étais en mode flemme ON  :Smile: )

----------

## yesi

on oublie souvent le site lea-linux.org... :Smile: 

Duf, tu aurais pu te faire de la pub quand même!!!!

il a fallu que je le fasse! c'est malin!

http://lea-linux.org/cached/index/Reseau-partfic-proftpd.html

----------

## l.slysz

hmm j'ai cherché, mais sans resultat :

est il possible de specifier la plage de port autorisés pour les transferts de fichiers ? ( pour le mode passif plus precisement ?)

ça serait tres utile quand le pc n'est pas en direct sur le net , afin de configurer le routeur

merci d'avance  :Wink: 

----------

## naerex

Pour ceux qui sont interessé par un serveur ftp hyper simple, il y a oftpd dans portage.

il ne fait que ftp public chrooté sur /home/ftp

Je m'en sert depuis un moment, il est performant je trouve.

----------

