ProFTPd est un serveur FTP libre. Son unique fichier de configuration, proftpd.conf, utilise une syntaxe similaire à celle d'Apache permettant ainsi d'homogénéiser les fichiers de configuration. La directive include permet cependant de répartir les directives de configuration dans différents fichiers pour les cas plus complexes.
Le logiciel permet de configurer plusieurs serveurs FTP virtuels et a la possibilité d'être utilisé dans un environnement dédié (chroot). Il peut être lancé comme un démon ou comme service inetd. Enfin, ProFTPd est compatible IPv6.
Son architecture est modulaire, ce qui a permis d'écrire des extensions pour le support de la cryptographie SSL/TLS (protocole FTPS) et l'extension de l'authentification via des bases RADIUS, LDAP ou SQL.
# Permet de choisir si le serveur est lancer par inetd ou de manière autonome. ServerType standalone #inetd pour gestion xinetd
# Permet de cacher le nom et la version de votre serveur FTP. ServerIdent on <nom afficher lors d'une connexion>
DefaultRoot ~ !admin
Chroot consiste tout simplement à enfermer l'utilisateur dans un répertoire précis, et de l'empêcher de se promener sur l'intégralité de votre disque dur en toute impunité. La directive suivante enfermera tous les utilisateurs dans leur répertoire personnel (défini ici par « ~ ») à l'exception des personnes appartenants au groupe admin.
MaxInstances 30
Afin d'éviter une attaque de type DOS, ou plus généralement une surcharge de votre serveur, vous devez limiter le nombre de connection total autorisé. Dans l'exemple ci-dessous, nous le limitons à 30, suffisant dans la majeure partie des cas.
# Autorise de résumer ces download et upload. AllowRetrieveRestart on AllowStoreRestart on
vi /etc/proftpd/proftpd.conf
# A basic anonymous configuration, no upload directories.
<Anonymous ~ftp>
User ftp
Group nogroup
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous ftp
# Cosmetic changes, all files belongs to ftp user
DirFakeUser on ftp
DirFakeGroup on ftp
RequireValidShell off
# # Limit the maximum number of anonymous logins
MaxClients 10
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayChdir .message
# Interdit l'écriture dans tout l'environnement chrooté d'anonymous.
<Limit LOGIN>
AllowAll
</Limit>
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
# Configuration par défaut pour les droits de fichiers :
# L'utilisateur et le groupe ont tout les droits, les autres RO
<Directory incoming>
Umask 022 022
# Autorise seulement le depot dans incoming
<Limit WRITE>
DenyAll
</Limit>
<Limit STOR>
AllowAll
</Limit>
</Directory>
</Anonymous>
<Limit LOGIN> DenyAll </Limit>

Le but est de pouvoir donne l'accès que sur l'interface public d'un serveur firewall.
Pour se faire, nous allons mettre en place une redirection NAT vers le serveur FTP grâce à IPTABLES !
ProFTPD sera utilisé soit en ACTIF soit en PASSIF.
Dynamiquement
aptitude install conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp
De façon définitive
vi /etc/rc.local
# File: /etc/rc.local # Module to track the state of connections modprobe ip_conntrack # Load the iptables active FTP module, requires ip_conntrack modprobe ip_conntrack_ftp # Load iptables NAT module when required modprobe iptable_nat # Module required for active an FTP server using NAT modprobe ip_nat_ftp
Les modules chargés pour le NAT FTP, reste à savoir si le client FTP se connectera en ACTIF ou en PASSIF car c'est lui qui décide du type de connexion.
Le mode actif est simple à configurer puisqu'il ne nécessite que les ports 20 et 21 du serveur vers le range 1024-65535 des clients.
vi /root/script/firewall
# FTP PAT IP_PUBLIQUE-DMZ:21 iptables -t nat -A PREROUTING -d 10.32.13.100 -p tcp --dport 21 -j DNAT --to-destination 192.168.2.100:21 iptables -t nat -A PREROUTING -d 10.32.13.100 -p tcp --dport 20 -j DNAT --to-destination 192.168.2.100:20 echo "NAT FTP REDIRECT : OK" # FTP FORWARD LAN-DMZ iptables -A FORWARD -i eth1 -o eth2 -p tcp -m multiport --dport 20,21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i eth2 -o eth1 -p tcp -m multiport --sport 20,21 -m state --state ESTABLISHED,RELATED -j ACCEPT echo "FTP WEB-DMZ : OK"
Dans le cas du mode passif, le serveur n'essayera pas de se connecter au client, il restera passif…. C'est le client qui effectue tout les tentatives de connexion. Un problème persiste cependant, si les 2 machines, cliente et serveur, sont derrière un firewall. Dans ce cas, il sera nécessaire de préciser au serveur les ports de communication qu'utilisera proftpd pour accepter les connexions du client.
vi /etc/proftpd/proftpd.conf
# In some cases you have to specify passive ports range to by-pass # firewall limitations. Ephemeral ports can be used for that, but # feel free to use a more narrow range. PassivePorts 55555 55655
Relancer le service PROFTPD suite à cette modification :
service proftpd restart
vi /root/script/firewall
# FTP PAT IP_PUBLIQUE-DMZ:21 iptables -t nat -A PREROUTING -d 10.32.13.100 -p tcp --dport 21 -j DNAT --to-destination 192.168.2.100:21 iptables -t nat -A PREROUTING -d 10.32.13.100 -p tcp --dport 20 -j DNAT --to-destination 192.168.2.100:20 echo "NAT FTP REDIRECT : OK" # FTP FORWARD LAN-DMZ iptables -A FORWARD -i eth1 -o eth2 -p tcp -m multiport --dport 20,21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i eth2 -o eth1 -p tcp -m multiport --sport 20,21 -m state --state ESTABLISHED,RELATED -j ACCEPT echo "FTP WEB-DMZ : OK" # FTP PASSIF iptables -A FORWARD -i eth1 -o eth2 -p tcp --dport 55555:55655 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i eth2 -o eth1 -p tcp --sport 55555:55655 -m state --state ESTABLISHED,RELATED -j ACCEPT echo "FTP PASSIF FORWARD : OK"
Dans le but de sécuriser le flux FTP, il est possible de le configurer au travers de TLSv1 (=SSLv3).
La documentation officielle pour plus de détails sur les directives : ici
openssl req -x509 -newkey rsa:2048 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt -nodes -days 365
- Crytpage 2048 bit soit 256 bits
- Le certificat proftpd.crt
- La clé privée proftpd.key
- Valable 365 jours
# This is used for FTPS connections Include /etc/proftpd/tls.conf
<IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSRSACertificateFile /etc/ssl/certs/proftpd.crt TLSRSACertificateKeyFile /etc/ssl/private/proftpd.key TLSOptions NoCertRequest EnableDiags TLSOptions AllowClientRenegotiations TLSVerifyClient off TLSRequired on TLSRenegotiate required off </IfModule>
/etc/init.d/proftpd restart
openssl s_client -connect 127.0.0.1:21 -starttls ftp