Affinons la configuration

Pas de FTP anonyme

Pure-ftpd accepte par défaut les connexions anonymes, si un utilisateur nommé ftp existe, avec son répertoire /home/ftp. Si ces conditions ne sont pas remplies, il n'y aura pas d'accès anonyme possible. Cependant, mieux vaut signaler explicitement que l'on n'en veut pas, avec le paramètre -E.

Protéger la bande passante

Depuis l'avènement de l'internet à « haut débit » (1998 à peu près), le débit « upload » a toujours été inférieur au débit « download », considérant que l'internaute est un consommateur et pas un acteur (ce qui est hélas trop souvent vrai). Il nous faut nous contenter en moyenne de 100 Ko/s en upload, et il faut bien voir que notre upload sera le débit maximal de notre serveur FTP qui ne sera donc pas une bête de course. Qui plus est, si le serveur doit fonctionner alors qu'il y a des clients actifs sur notre réseau local, il faudra partager cette bande passante dérisoire.

Si nous voulons faire simple, nous pouvons limiter le débit du serveur avec le paramètre -T. Cette option peut limiter les débits «up » et « down ». Les limites sont données en Ko/s, séparés par un :. Par exemple, -T :60 ne limitera pas l'upload sur le serveur, mais limitera le download à 60 Ko/s.

Ce paramètre s'applique à tous les utilisateurs. Nous avons suggéré qu'il est possible de faire plus fin en définissant des limites à chaque utilisateur, avec la commande pure-pw.

Le lecteur attentif aura pu constater que, par défaut, le serveur accepte 50 clients simultanés. Il est sans doute judicieux de limiter ce nombre, avec le paramètre -c. De même qu'il est possible de limiter le nombre de connexions simultanées par client (paramètre -C).

Au final, notre ligne de commende pourrait être de la forme :

# pure-ftpd -j -l puredb:/etc/pure-ftpd/pureftpd.pdb -E -T :30 -c 3 -C 2

Les logs

Par défaut, pure-ftpd va envoyer ses logs sur le syslog. Si l'on souhaite récupérer ces logs dans un fichier séparé, il faudra donc configurer notre système de logs.

Il existe cependant le paramètre -O (déjà vu plus haut) qui permet de créer un fichier propre aux transferts. Par exemple -O clf:/var/log/pure-ftpd/transfer.log comme fait par défaut dans l'installation Debian. Dans ce cas, les transferts seront consignés dans ce fichier. Le reste des informations que pure-ftpd pourrait envoyer seront à rechercher dans les messages du syslog.

TLS

Pure-ftpd sait faire du FTPES (FTP over explicit TLS/SSL). Dans cette configuration, les connexions sont chiffrées par TLS, ce qui évite entre autres le passage de l'authentification en clair.

Le système est simple (et peu souple). Il faut créer un certificat x509 qui doit obligatoirement s'appeler pure-ftpd.pem et se trouver dans /etc/ssl/private/. Pour le construire, il faut bien sûr avoir installé openssl et utiliser la commande suivante :

# openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem 

Ce certificat auto-signé sera donc valide 7300 jours, c'est peut-être beaucoup…

Generating a 2048 bit RSA private key
....................................................................+++
..................................................................................................................+++
writing new private key to '/etc/ssl/private/pure-ftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:BdR
Locality Name (eg, city) []:Marseille
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IRP
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:ftp.nain-t.net
Email Address []:irp@nain-t.net

Il faudra aussi :

# chmod 600 /etc/ssl/private/pure-ftpd.pem

Enfin, le paramètre -Y spécifiera l'utilisation de TLS. Pour la suite des manipulations, nous adopterons -Y 1 qui laisse le choix au client d'utiliser ou non TLS. -Y 2 n'autorisera pas les connexions sans TLS.

Test

Pour tester TSL, mieux vaut créer dans le gestionnaire de sites de FileZilla : FTPES est donc un mode de transfert FTP explicitement sécurisé. Ce mode introduit des commandes supplémentaires qui dont définies dans les RFC 2228 : This document defines extensions to the FTP specification STD 9, RFC 959, “FILE TRANSFER PROTOCOL (FTP)” (October 1985). These extensions provide strong authentication, integrity, and confidentiality on both the control and data channels with the introduction of new optional commands, replies, and file transfer encodings.

La connexion suivant ce mode fera apparaitre : Si nous acceptons ce certificat, la connexion s'établit et dans la fenêtre du protocole nous observons :

Statut :	Connexion à 192.168.10.76:21...
Statut :	Connexion établie, attente du message d'accueil...
Réponse :	220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
Réponse :	220-You are user number 1 of 3 allowed.
Réponse :	220-Local time is now 17:32. Server port: 21.
Réponse :	220-This is a private system - No anonymous login
Réponse :	220-IPv6 connections are also welcome on this server.
Réponse :	220 You will be disconnected after 15 minutes of inactivity.
Commande :	AUTH TLS
Réponse :	234 AUTH TLS OK.
Statut :	Initialisation TLS...
Statut :	Vérification du certificat...
Commande :	USER test
Statut :	Connexion TLS/SSL établie.
Réponse :	331 User test OK. Password required
Commande :	PASS ********
Réponse :	230-Your bandwidth usage is restricted
Réponse :	230-User test has group access to:  ftpgroup  
Réponse :	230 OK. Current directory is /
Commande :	SYST
...
Le client FileZilla réclame une authentification TLS, qui lui est accordée, et la connexion TLS est établie avant le passage du mot de passe. Nous pouvons d'ailleurs vérifier avec notre wireshark habituel :
No.     Time        Source                Destination           Protocol Info
      1 0.000000    192.168.0.16          192.168.10.76         TCP      41198 > ftp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=348647 TSER=0 WS=7
      2 0.045419    192.168.10.76         192.168.0.16          TCP      ftp > 41198 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1368 TSV=106073221 TSER=348647 WS=5
      3 0.045442    192.168.0.16          192.168.10.76         TCP      41198 > ftp [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=348651 TSER=106073221
      4 0.101193    192.168.10.76         192.168.0.16          FTP      Response: 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
      5 0.101210    192.168.0.16          192.168.10.76         TCP      41198 > ftp [ACK] Seq=1 Ack=320 Win=6912 Len=0 TSV=348657 TSER=106073234
      6 0.101333    192.168.0.16          192.168.10.76         FTP      Request: AUTH TLS
      7 0.148394    192.168.10.76         192.168.0.16          TCP      ftp > 41198 [ACK] Seq=320 Ack=11 Win=5792 Len=0 TSV=106073246 TSER=348657
      8 0.150079    192.168.10.76         192.168.0.16          FTP      Response: 234 AUTH TLS OK.
      9 0.150989    192.168.0.16          192.168.10.76         FTP      Request: \026\003\002\000O\001\000\000K\003\002O\005\322\335\335d\2319U4\303[8\311\264\223\304\320\025\030\244\357\271d\202\330\361\373Rg)@\000\000$\0003\000E\0009\000\210\000\026\0002\000D\0008\000\207\000\023\000f\000/\000A\0005\000\204\000
     10 0.215860    192.168.10.76         192.168.0.16          FTP      Response: \026\003\001\000J\002\000\000F\003\001O\005\322\335H\315\246\005\351[\346.\263\033\301`\030\216"7\324gba|\021\350\307*+\201\267 \3648Y\335\257\204,.\334\253C\232x\f\217\265\2351.T0Vo\370\235\206\267I\333\231yY\0003\000\026\003\001\004V\v\000\004R\000\004O\000\004L0\202\004H0\202\0030\240\003\002\001\002\002\t\000\237s\0326\002\241\304y0
     11 0.218216    192.168.10.76         192.168.0.16          FTP      Response: \033\343:2 \374f\226%\360E\031\322j\240#\316\303\244\252\337\260\001\221\247U\363\224\223\030\302q\005HG\200\367\0166\2640\016\341\337M\2550\004\211$N\245\376E\227\302PK\332\270\006\250zL\211&-\346\263\264\022\377i\221\201\315\202\032z\253B\356y\233i\317IjU\337d\031'\016{\020G\022\246\351Y\317\210\276u\35395hC\001\000\001\323\345\000\021.\032l\332\214\3600x\025\255\300\327\374\342\343+\275\332\005\234\220!\376`\255\210\370\021"\243\301P\261gF#L\253\341\3465\313>\265FV\200Qs\365\253\274s\356D,X'
     12 0.218229    192.168.0.16          192.168.10.76         TCP      41198 > ftp [ACK] Seq=95 Ack=2071 Win=12544 Len=0 TSV=348669 TSER=106073260
     13 0.226760    192.168.0.16          192.168.10.76         FTP      Request: \026\003\001\000\206\020\000\000\202\000\200\b\322Xk\344O\275\330\251\032\257?\241\251\243!\361\250\001z9\342\342\205\346\241\0356\347V?\v\a\242\277\266+\027\242`}\300W\231\240\234&\357\v\3113\001v/&\211\023aRP
     14 0.226773    192.168.0.16          192.168.10.76         FTP      Request: \024\003\001\000\001\001
     15 0.227819    192.168.0.16          192.168.10.76         FTP      Request: \026\003\001\0000H\232_k%t\232=,\324\251\026\035\277\262F\224C\005\270>\355\225h\234R\221\177\266z\317\233W\310p\261\255\036\275l\367\212#\3378\323\271\027
     16 0.276986    192.168.10.76         192.168.0.16          TCP      ftp > 41198 [ACK] Seq=2071 Ack=240 Win=6880 Len=0 TSV=106073279 TSER=348670
     17 0.279681    192.168.10.76         192.168.0.16          FTP      Response: \024\003\001\000\001\001\026\003\001\0000\350%k\216\327\226|N\au\203o\272\033\333V\233b\2226Eg\002\332o\302`\206\230\032\tUKrR\217$u\254z9c\357\002\233K\f=
     18 0.281552    192.168.0.16          192.168.10.76         FTP      Request: \027\003\001\000\260\332\316[\341R`5\332\233\vU\365\275\033\306a.h\251A\0310\a\201\347rI<)b\312-0.r\361\200\266\255\254\276\367\323\a\332xe\365\331\206\334U\301\300#q:\342>\2525\243j\274J\336\220\022@\221b\373\240\202-C?,~\003VE\334\242
     19 0.331704    192.168.10.76         192.168.0.16          FTP      Response: \027\003\001\000@o\a+\303\333)l+XZ\260\260\243|)/f\304Kv\262S`\274\273\304\200\316\215u\264\tR\000\231\240\021v
     20 0.331923    192.168.0.16          192.168.10.76         FTP      Request: \027\003\001\001\020\2518:\203K:y\343:\t\016R\002?+_\340F F\005lO\267*\252\274\202p\325\2746Q$3\310\335\252\261\v\371\037\313\344e\207\027\3633\2244\334\021I\205gHVn\315*\bj\331\0230\203\314\200i\231\314u'-\315\321\271F#\336\243\353\242GT:\vy\235\251\032\216\324\202\026\t[\361\217/\020\a\376]\252\247\306\240\205\225\215K\350<\274\307K\301M\333\024/nn\342,\}k\247\360m\271\245G\372\216\222\021\336\264\251c\b\326\020\t\237\346\366u\217\257\305\201\034[{\\202\376H!w\332>\351\301
     21 0.389619    192.168.10.76         192.168.0.16          FTP      Response: \027\003\001\000@B\314\337\266\312\225\027\f\220U\265fx\244\026\330Y\307\240\213n\251\272\300\002\372\307\232I\355\360T\317\301{,\320\265\006\225T\002'h\000\220\361k\270\337.\330\276\2309F\203)\366\336\246e\310]
     22 0.391778    192.168.10.76         192.168.0.16          FTP      Response: \027\003\001\000P\023\326\265\242\326V\0005\360\235g\003\323\331x\3370\376\335\036\234S-,\342\310y\224\262/!Pv\232\250|\350\3538ue\341\257\006-i\232o\v\260\265\177\372\322n\265$2\235\a,\320\245\024\005I\306\335?\366t\250\324u\221\326\200\354x\231
     23 0.393748    192.168.10.76         192.168.0.16          FTP      Response: \027\003\001\000@\244\377\364\215\375\212\346\241\306\257\224\326\307\321\346\242n\271!K?^\244\220i]\276\312\\340\316N(\017 G\220j\177\004M\334D\177\267\324\027\312\t\203\351\036\344c\240M\314\300\364Tt&\341\245
     24 0.394575    192.168.0.16          192.168.10.76         TCP      41198 > ftp [ACK] Seq=751 Ack=2422 Win=12544 Len=0 TSV=348686 TSER=106073307
     25 0.394665    192.168.0.16          192.168.10.76         FTP      Request: \027\003\001\000@\315>k\375\375*\357\035\262^~\224\311M\322\332\270uW\307\035\356P\b\256\317\313\000\b\215}\322\273?\300kN\f\244h\376g(O\334VeU\322\310\262\236O\323\027\374g\323M):\254\265\177
     26 0.444358    192.168.10.76         192.168.0.16          FTP      Response: \027\003\001\0000-\216#1H\234\266\355\244\036\311\f?\320\237x\226\246\005\330p\252(\035\223\2420\243S\316\372\b~'[\325r\302\361\322\254\034\002\243\215\361\300\377
     27 0.444560    192.168.0.16          192.168.10.76         FTP      Request: \027\003\001\000\240\3166\351\033\372a\271\025\177,\213\255\020\206\000Z\344\334\243\2631\035\236o]\365\222`\233V
     28 0.493829    192.168.10.76         192.168.0.16          FTP      Response: \027\003\001\0000\212y\017\v\245\237\252O\246\zh*0\364\037\233\241`%a\261\321I\f}9z\354-QMH\236K\222#\336I\326H\212~/\227\026X
     29 0.493986    192.168.0.16          192.168.10.76         FTP      Request: \027\003\001\000\340\024d,D\244;\250\236{\326\217h-H+\240\206eA\307\375u\027\311\216\232\363\202\243\246\377\343\371\263\003Z\033Fj\326\363X]\272\265\241=;\257|\226\350\351P\320\215Q-\200]\004\256q\2206?\350\370ca\257\246'{\223j\v\003\300\311\274\033\217\025\346k\216\353$\251V\327\355\240\262\261Q\236\377H\341\370\022\312\3333\340\212LI\000\212\354\370 H\373\342\035\2756\336&?\372k\232:\231\266\372qQ\206"N\345qzv2\344bR\342\375\242E\226$
     30 0.544508    192.168.10.76         192.168.0.16          FTP      Response: \027\003\001\000P\004u\357\003\344\262\232\252\3209vZL\024\222\016\260\270>5\016\256\271Z\274\251\376p\344FU\236-\263\211\210u\301\035\206C\361_-\237\225\351]\271FR\017\027\222\201\032\225@\317\351tN@\252\337]hH\266\243\312\360\340:k\3600
     31 0.577128    192.168.0.16          192.168.10.76         TCP      41198 > ftp [ACK] Seq=1214 Ack=2613 Win=12544 Len=0 TSV=348705 TSER=106073345
A partir du moment où Response: 234 AUTH TLS OK, tous les échanges FTP sont chiffrés.

Il faut s'en souvenir… Dans le cas d'un mode passif, la Commande : PORT 192,168,0,16,159,10 va être chiffrée. Si ça ne pose pas de problème au client FTP qui sait le déchiffrer, le conntrack de Netfilter risque d'avoir plus de mal s'il est sollicité.