FTP

Un article de Diablotins.org.


Image:brush.png

Un serveur FTP vous sera très utile pour échanger vos données avec le vaste monde.





Pour cela, FreeBSD propose un dæmon dans sa base mais je vous conseille d'utiliser un serveur plus évolué: ProFTP.


Sommaire

ProFTP

ProFTPd est un démon qui répond à tous les besoins d'un serveur FTP .
C'est le serveur utilisé par la majorité des FAI.

Installer


ProFTP est un port, installez le à partir de “ftp/proftp”. Une fois l'installation terminée, configurez le script RC, si nécessaire:

  # mv /usr/local/etc/rc.d/proftpd.sh.sample \
/usr/local/etc/rc.d/proftpd.sh

Assurez vous que le script RC soit exécutable:

  # chmod 750 /usr/local/etc/rc.d/proftpd.sh

Et indiquez dans /etc/rc.conf:

proftpd_enable="YES"

Puis vérifions l'interconnexion avec PAM, /etc/pam.conf:

  ftpd auth required pam_unix.so try_first_pass
  ftpd account required pam_unix.so try_first_pass
  ftpd session required pam_permit.so

Ou dans /etc/pam.d/ftpd.

Configuration

Il ne reste plus qu'à éditer le fichier de configuration de la bête, “/usr/local/etc/proftpd.conf”:

ServerName "Mon serveur FTP"
ServerType standalone
DefaultServer on
TimeoutLogin 30
DefaultRoot / wheel
DefaultRoot /usr/ftp/ staff
RequireValidShell off
Port 21
Umask 022
MaxInstances 30
User nobody
Group nogroup
AllowOverwrite on

Parefeu

Pour que votre service soit accessible de l'extérieur, définissez une plage de ports pour les connexions en mode passif:

PassivePorts 60000 65535   

Et ouvrez cette plage dans votre pare-feu.

Inet

Vous pouvez demander à inet de gérer le fonctionnement du service; en ce cas, après avoir défini

ftp     stream  tcp     nowait  root    /usr/local/sbin/proftpd proftpd

dans /etc/inetd.conf, changer le type de serveur dans protftp.conf:

ServerType                      inetd

Piloter

Lancement du service :

  # /usr/local/etc/rc.d/proftpd.sh start

Premier essai:

  # ftp localhost

ArrĂŞt du service :

  # /usr/local/etc/rc.d/proftpd.sh stop

serveur du monde

Ce dæmon est assez simple à mettre en œuvre, soit par inet en dé-commentant l'entrée ftp de /etc/inetd.conf ou en ajoutant dans /etc/rc.conf l'entrée:

ftpd_enable="YES"

Interdisez l'accès aux utilisateurs listés dans /etc/ftpusers, et indiquez les utilisateurs chrootés dans /etc/ftpchroot.

Protéger

Ce protocole requiert quelques astuces pour être protégé derrière un pare-feu. En particulier, vous devrez ouvrir une plage d'adresses définies aléatoirement par le serveur, ainsi que le port 21 pour l'identification.
La situation se complique dès lors que le pare-feux ne se trouve pas sur le serveur et doit rediriger les requêtes, mais surtout connaître la plage de données.

Packet filter

Ce parefeu a une astuce expliquée ici.
Notez les instructions et démarrez le démon «ftp-proxy»:

/etc/rc.d/ftp-proxy


Attention, actuellement, cette solution serait une l'impasse.
Attendons des précisions de la liste dédiée.


Sinon, utilisons une méthode plus classique dont voici des extraits:
Dans cet exemple, le serveur se trouve dans une jail, ces premières règles sont inutiles si la pare-feu se trouve sur la même interface que le serveur.

#  Go To jail
nat on $ext_if inet from $ftp_server -> ($ext_if)
rdr on $ext_if proto tcp from any to any port 21 -> $ftp_server \
    port 21
rdr on $ext_if proto tcp from any to $ext_if port 60000:65535 -> $ftp_server port 60000
no rdr on { lo0, lo1 } from any to any

Ici, on redirige vers le serveur FTP le trafic venant de l'extérieur consacré au protocole FTP.
Soit sur le port 21 pour l'identification et sur la plage des ports de 60000 à 65535, pour les données.

# WAN filtering
block log all
pass in on $ext_if proto tcp from any to any port { 21 } \
     keep state 
pass in on $ext_if proto tcp from any to any port { 60000><65000 } \
     keep state 
pass out on $ext_if all

Ouverture du trafic sur les ports précités.

# Lan Filtering: none
pass in  on $int_if all
pass out on $int_if all

Enfin, ouverture totale du trafic sur le serveur.

Police, menottes, prison!

Voici un exercice intéressant, enfermons notre serveur ftp dans une Jail.
Ainsi, ce service sera entierement isolé du système central.

Batissons un mur

Créons l'architecture du confinement:

mkdir -p /home/j/ /home/j/stlazare
cd /usr/src && make world DESTDIR=/home/j/stlazare \
&& make distribution DESTDIR=/home/j/stlazare
mount_devfs devfs /home/j/stlazare/dev

Pour Proftd

cd /usr/ports/ftp/proftpd && make DESTDIR=/home/j/stlazare

Éditez «/usr/local/etc/proftpd.conf» et commentez la ligne

#UseIPv6                                off

Les portes du pénitentier

Voici la topologie de mon réseau:

  • Une carte «rl0» qui donne accès Ă  l'extĂ©rieur et configurĂ©e par DHCP
  • Une carte «xl0» qui donne accès au rĂ©seau interne et configurĂ©e par ifconfig en 192.168.0.1

Création de l'accès à la prison:

ifconfig xl0 inet alias 192.168.0.2 netmask 255.255.255.255

Accès par /etc/hosts:

less /etc/hosts
192.168.0.2     stlazare.dmarec.local stlazare
192.168.0.2     stlazare.dmarec.local.

Vu de la prison:

less /home/j/stlazare/etc/hosts
::1                     localhost localhost.my.domain
127.0.0.1               localhost localhost.my.domain
192.168.0.2             stlazare  stlazare.dmarec.local
192.168.0.1             david     david.dmarec.local

La prison

Création et mise en service:

#jail /home/j/stlazare stlazare.dmarec.local /bin/sh
#sh /etc/rc

Créez un utilisateur

# adduser chirac

Oui, dans ce monde virtuel, chirac est en prison. Lancement du service

# /usr/local/etc/rc.d/proftpd forcestart 

Depuis l'hĂ´te

$ ftp stlazare
Connected to stlazare.dmarec.local.
220 ProFTPD 1.3.2rc2 Server (ProFTPD Default Installation)   [192.168.0.2]
Name (stlazare:david):   

Et c'est parti !

Récupérée de « http://diablotins.org/index.php/FTP »
Projets :
Boîte à outils