FTP
Un article de Diablotins.org.
|
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 !
