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
Qui 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
© Philippe Chadefaux - philippe schwarz $Id: ftp.html,v 1.4 2003/09/11 09:15:30 phil Exp $-