FTP Serveur & Proxy







Vous disposez d'un serveur FTP avec OpenBSD installé (dans l'installation de base, pas dans les ports) mais inactif par défaut.
Toutefois celui-ci ne permet pas de contrôler finement les connexions, de gérer les utilisateurs à partir d'une base LDAP, ou d'un serveur SQL.


1 Serveur FTP par défaut.
2 Serveur Pure-ftpd.
3.Proxy-FTP

1 ftpd
1.1 Création d'un FTP anonyme

Création d'un compte ftp

Vous devez ajouter la ligne suivante dans /etc/shells en plus des lignes existantes :
/bin/sh
/bin/csh
/bin/ksh
/usr/bin/false

Puis créer un compte ftp avec la commande adduser avec
User Name: ftp
Full Name: FTP Anonyme
shell: false
Login Group : ftp
Invite to other Groups: No
Enter Password: Ne rien rentrer, vous validez simplement.
Set the password so that user cannot logon? (y/n) [n]: Répondre oui "y".

Ajouter alors un répertoire pub dans /home/ftp/pub afin de placer dedans les fichiers nécessaires et régler les droits :
mkdir /home/ftp/pub
chown -R root.wheel /home/ftp
chmod -R 555 /home/ftp


Contrôler les accès
Vous disposez alors de deux fichiers pour contrôler et chrooter les accès à votre ftp anonyme.
/etc/ftpusers : Liste les utilisateurs non autorisés.
/etc/ftpchroot : Liste les utilisateurs qui vous être confinés (chrootés) dans leur répertoire perso, /home/ftp, ici. Donc qui au moment de la connexion vont arriver directement à la racine du ftp. Si vous lancez le démon ftp avec -A, seuls les utilisateurs listés dans /etc/ftpchroot peuvent se connecter au ftp.

Démarrer le serveur ftp
Vous pouvez maintenant lancer le serveur ftp. Il est possible de le lancer avec inetd ou comme un démon. Dans ce cas de figure, dans rc.conf remplacez la ligne ftpd_flags=No par ftpd_flags="-DllUSA"
Votre ftp sera lancé au reboot de la machine, sinon lancer /usr/libexec/ftpd -DllUSA.
D : Pour le lancer comme un démon et non pas avec inetd.
ll : log tous les accès au ftp, ainsi que les commandes get, put..
U: log dans le fichier /var/run/utmp
S: Log tous les downloads anonyme dans /var/log/ftpd (vérifiez qu'il est bien créé).
A: Autorise la connexion que si l'utilisateur est dans le fichier ftpchroot. Fortement conseillé pour éviter les failles en cas de d'oubli.
n: Ne permet pas les connexions anonymes.

Ajoutez des messages de bienvenue
/etc/ftpwelcome Ajoutez dedans le message de bienvenue avant l'authentification.
/etc/motd Ajoutez dedans le message de bienvenue juste après l'authentification.
/etc/.message Ajoutez ce ficheir dans chaque répertoire, afin d'avoir un message au moment ou la personne rentre dans le répertoire.

Contrôler les connexions
Voilà les limites de ce serveur ftp, qui ne permet pas cela. Il faut donc utiliser un autre serveur FTP.

Help ! Ca ne fonctionne pas..
C'est normal, vous avez installé un FireWall sur la machine... Le protocole FTP est un des plus anciens et surtout l'un des plus mal foutus de l'Internet.
Par conséquent, vous allez devoir ouvrir grand une brèche dans votre beau FireWall...
Ajoutez, ceci par exemple :
pass in log quick on $EXT_IF proto tcp from any to $MON_IP port { 60000 >< 61000 } flags S/SA keep state
Q
ui va faire un beau trou en entrée de pf en TCP sur les ports compris entre 60000 et 61000.

Vous devrez alors réduire l'intervalle de ports à l'écoute du démon ftp, sinon il risque de tomber en dehors de cette fourchette:
sysctl -w net.inet.ip.porthilast = 60000
sysctl -w net.inet.ip.porthifirst = 61000
Attention, ne réduisez pas trop l'intervalle, un unique client FTP mange beaucoup de connexions simultanées.

1.2 Créer un serveur FTP Privé
Absolument identique au FTP Anonyme :
Les deux différences correspondent à la création de l'utilisateur :
On lui donnera un vrai shell et pas un faux : shell: bash au lieu de shell: false

On lui permettra de se connecter en lui attribuant un mot de passe.
Bien entendu, on n'oubliera pas de le rajouter dans /etc/ftpchroot , pour lui permettre de se connecter.


1.3 Créer un miroir sur votre serveur FTP
Vous pouvez pour cela utiliser mirror (port dans /usr/ports/net/mirror) ou la commande rsync.
Documentation complémentaire ici pour mirror.

2 Pure-ftpd

2.1 Installation.

Il existe plusieurs serveurs ftp capables de gérer les connexions. Toutefois pure-ftpd est le seul dans les ports d'OpenBSD.
Pour l'installer, aller dans /usr/ports/net/pure-ftpd, faire un make && make install.
Toutefois si vous souhaitez utiliser une base SQL ou LDAP, vous devez lui indiquer.
Pour cela faire un export FLAVOR="ldap no_banner" par exemple pour LDAP. Rien ne vous empêche d'ajouter MySQL et par la suite d'authentifier soit sur LDAP, soit sur MySQL.
no_banner pour .... je vous laisse deviner !?

2.2 Démarrer pure-ftpd en mode serveur anonymous.

Il n'y a pas de fichier de config, tout se passe sur la ligne de commande, au lancement du démon.
La création du compte ftp est identique, avec le serveur de base d'OpenBSD.
On n'utilise pas ici inetd, bien que cela soit possible.
La ligne pour le démarrer sera donc :
pure-ftpd -B -4 -A -e -c 10 -C 2 -T 50 -B -O clf:/var/log/ftpd -F /etc/ftpwelcome -p 60000:61000

-B

Pour le lancer comme démon, sinon vous devez utiliser inetd.

-A

pour chrooter les utilisateurs.

-c 10

Nombre de clients pouvant se connecter.

-C 2

Maximum de connexion avec la même adresse IP

-T 50

Maximum de la bande passante pouvant être utilisée par un même utilisateur

-O cfg:/var/log/ftpd

Pour loguer dans /var/log/ftpd au format apache

-F /etc/ftpwelcome

Pour avoir un message de bienvenue, le nom du fichier n'est pas important.

-p 60000:61000

Pour forcer le serveur à échanger avec le client entre les ports 60000 et 61000.

-4

Pour forcer IPV4. Par défaut il est en IPV6.



2.3 Démarrer pure-ftpd avec authentification des utilisateurs

Voir la doc ici http://linux-village.org/reseau/pureftpd.php3


Problème du FTP : Une réponse: ftp-proxy
    Le protocole FTP pose un certain nombre de problèmes. En effet lorsque vous contactez un serveur FTP distant, celui-ci dispose de deux méthodes pour établir l'échange : le FTP actif et le FTP passif.

    Dans les deux cas, pour établir un échange vous devez commencer par vous authentifier. Cela se fait sur le port 21. Le client utilise un port supérieur à 1024 pour se connecter au serveur distant qui lui écoute sur le port 21. Une fois l'authentification réalisée, l'échange des données se fait alors soit dans le mode actif, soit dans le mode passif.

Mode actif :
Le cas le plus pénible, puisque votre station, qui normalement est un client devient serveur, sur un port supérieur à 1024 et négocié entre le client et le serveur. Certain serveur FTP limite la plage d'adresse, mais tout de même cela veut dire que vous devez laisser entrer sans le connaître à l'avance les connexions supérieurs à 1024. Pour résoudre ce problème, on peut toujours se dire que le serveur est capable de passer dans le mode passif, sinon point de salut, ou bien utiliser le ftp-proxy, disponible avec OpenBSD.

Mode passif :
Celui qu'il faut privilégier. Une fois l'authentification réalisée sur le port 21, le serveur se place à l'écoute sur un port supérieur à 1024. Le client quant à lui utilise le port +1 qu'il a utilisé pour la connexion. Cette situation est plus intéressante pour le client, pas obligatoirement pour le serveur.

Le principe du ftp-proxy est le suivant. On utilise un serveur mandataire entre votre client et votre serveur, afin de résoudre le problème du ftp actif.
ftp-proxy est lancé par /etc/inetd, il faut donc ajouter la ligne suivante dans ce fichier (pensez à relancer inetd):
127.0.0.1:8021 stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy
On peut ici ajouter des options :
-n permet d'utiliser NAT
-V mode de debug
-D3 niveau de debug de 0 à 3
-u nobody l'utilisateur sous lequel tourne ftp-proxy (par défaut l'utilisateur proxy)
-m le port le plus bas utilisable
-M le port le plus haut. Cela permet de limiter l'intervalle.
-t Le timeout en secondes
Ce qui peut donner la ligne suivante :
ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy -n -V -D3 -u nobody -m 55000 -M 57000 -t 300

ftp-proxy est à l'écoute sur le port 8021. Pensez donc à ajouter dans /etc/services ftp-proxy 8021/tcp
Il vous faut rediriger le trafic de votre client ftp vers se proxy. Pour cela ajouter dans le fichier /etc/nat.conf la ligne suivante :
rdr on fxp0 proto tcp from any to any port 21 -> 127.0.0.1 port 8021
Ce qui en clair indique que les demandes de connexion arrivant sur le port 21 depuis n'importe ou, sont dirigées vers le port 8021 sur localhost.

Petite ouverture à faire encore sur les règles de pf. Autoriser les connexions entre (dans mon exemple le port 55000 et 57000)
pass in quick on fxp0 proto tcp from any port 20 to fxp0 port { 55000 >< 57000 } flags S keep state


Quelques remarques :
    Notez bien que ftp-proxy est surtout utilisé sur une passerelle NAT. Sur un routeur ne faisant pas de NAT (pour ceux qui acheteraient les blocs 8IP publiques chez Nerim, par ex.), le proxy ftp parait peu utile en regard des soucis qu'il cause :
- Pas d'entrée dans la table d'état de pf.
- Sacré trou à créer dans vos règles de filtrages entrants.

Si vous désirez vous passer du proxy ftp, la seule contrainte sera de mettre vos clients ftp en mode passif (le mode par défaut sous OpenBSD, mais ftp -p sous Debian). En revanche un petit trou sur les ports 20 et 21 suffira.


© Philippe Chadefaux - philippe schwarz $Id: ftp.html,v 1.4 2003/09/11 09:15:30 phil Exp $-