Commençons par installer le serveur FTP :

  1. ALBAN@bebeserv:~$ sudo -i
  2. Password:
  3. bebeserv:~# apt-get update
  4. [...]
  5. bebeserv:~# apt-get install vsftpd libdb3-util ftp
  6. [...]

L'installateur créé automatiquement un utilisateur « ftp » qui à le groupe « nogroup » et le dossier « /home/ftp » pour cet utilisateur. Nous allons changer tout ça, et de plus vu que de base « vsftp » autorise les connexions anonymes par défaut, même si « iptables » ne laissera rien passer, c'est un bon reflex de couper le serveur en attendant sa configuration finale.

  1. bebeserv:~# /etc/init.d/vsftpd stop
  2. [...]

Nous allons d'abord nettoyer un peu ce que « vsftpd » à créer automatiquement

  1. bebeserv:~# userdel ftp
  2. bebeserv:~# rmdir /home/ftp

Je vais conserver le groupe « nogroup » et utiliser l'utilisateur « nobody » qui existe déjà. Nous devons juste accorder cet utilisateur pour ce que nous voulons en faire. Ici j'anticipe un peu sachant que je vais créer des utilisateurs FTP virtuels pour mes sites internet.

  1. bebeserv:~# usermod -g nogroup -d /home/nobody -s /usr/sbin/nologin nobody
  2. bebeserv:~# useradd -g nogroup -d /home/nobody -s /usr/sbin/nologin anonymous
  3. bebeserv:~# mkdir /home/nobody
  4. bebeserv:~# chgrp nogroup /home/nobody
  5. bebeserv:~# chmod 2770 /home/nobody

Créons aussi le dossier de notre premier utilisateur virtuel :

  1. bebeserv:~# mkdir /home/nobody/test/
  2. bebeserv:~# chown nobody /home/nobody/test/

Une petite explication s'impose, nous donnons d'abord au dossier le bon groupe et nous le mettons un « setgid » dessus afin que tous fichiers et dossiers créés dans ce dossier appartiennent au groupe « nogroup », ensuite nous ne donnons aucun droit d'écriture sur le dossier sauf au propriétaire « root » car « vsftpd » accorde automatiquement les droits d'écriture dans le dossier en fonction de ces droits et nous ne souhaitons pas forcément que tous les utilisateurs puisse écrire dedans. Nous gérerons ces droits dans « vsftpd »

Maintenant nous allons configurer notre serveur FTP.

  1. bebeserv:~# nano /etc/vsftpd.conf

Je change les lignes suivantes :

  1. anonymous_enable=NO
  2. local_enable=YES
  3. write_enable=NO
  4. local_umask=022
  5. anon_upload_enable=NO
  6. anon_mkdir_write_enable=NO
  7. dirmessage_enable=NO
  8. chown_uploads=NO
  9. chown_username=nobody
  10. xferlog_file=/var/log/vsftpd.log
  11. xferlog_std_format=YES
  12. idle_session_timeout=300
  13. data_connection_timeout=60
  14. nopriv_user=anonymous
  15. ftpd_banner=Welcome to bebeserv.bebenet.local FTP service.
  16. chroot_local_user=YES

Et je rajoute celles-ci :

  1. guest_enable=YES
  2. guest_username=nobody
  3. max_clients=20
  4. max_per_ip=5
  5. force_dot_files=YES
  6. hide_ids=YES
  7. use_localtime=YES
  8. user_config_dir=/etc/vsftpd/user_conf
  9.  
  10. # Connection sécurisée
  11. #ssl_enable=YES
  12. #allow_anon_ssl=YES
  13. #force_local_data_ssl=YES
  14. #force_local_logins_ssl=YES
  15. #ssl_sslv2=YES
  16. #ssl_sslv3=YES
  17. #ssl_tlsv1=YES

Enregistrez et quittez. Maintenant configurons le fichier d'authentification PAM de « vsftpd » afin d'utiliser des utilisateurs virtuels :

  1. bebeserv:~# nano /etc/pam.d/vsftpd

Commentez toutes les lignes et mettez ceci à la fin du fichier :

  1. auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
  2. account required /lib/security/pam_userdb.so db=/etc/vsftpd/login

Enregistrez et quittez. Maintenant allons créer notre base d'utilisateurs virtuels :

  1. bebeserv:~# mkdir /etc/vsftpd
  2. bebeserv:~# nano /etc/vsftpd/userdb

Créez l'utilisateur « test » correspondant au dossier que nous avons fait plus haut :

  1. test
  2. toto

Vérifiez toujours de bien mettre une ligne vide en fin de fichier ! La seconde ligne est le mot de passe de l'utilisateur ici donc « toto ». Le fichier doit être écrit strictement de la sorte (avec toujours une ligne vide à la fin) :

  1. user1
  2. pass1
  3. user2
  4. pass2
  5. user3
  6. pass3
  7. ...

Enregistrez et quittez. Maintenant formatons notre base de données au format « userdb ». pour ceci plutôt que de taper une ligne de commande fastidieuse et dont on ne se rappellera jamais, nous allons créer un petit script qui le fera pour nous.

Créons notre script :

  1. bebeserv:~# nano /etc/vsftpd/vsftpd-makedb

Écrivez les lignes suivantes :

  1. #!/bin/sh
  2. db3_load -T -t hash -f /etc/vsftpd/userdb /etc/vsftpd/login.db

Enregistrez et quittez. Maintenant donnons les bons droits à notre script :

  1. bebeserv:~# chmod 500 /etc/vsftpd/vsftpd-makedb

Ajoutons un lien symbolique afin d'avoir accès directement à cette nouvelle commande, comme toutes les autres commandes.

  1. bebeserv:~# ln -s /etc/vsftpd/vsftpd-makedb /usr/local/bin/

Maintenant et après chaque modification de la table « userdb » il faudra faire :

  1. bebeserv:~# vsftpd-makedb

Dorénavant notre utilisateur « test » existe pour « vsftpd » donnons lui des droits afin que « vsftp » sache ce qui lui est autorisé. Mais pour ceci, afin de nous rappeler des options en permanence, nous allons créer d'abord un fichier d'exemple :

  1. bebeserv:~# mkdir /etc/vsftpd/user_conf
  2. bebeserv:~# cd /etc/vsftpd/user_conf
  3. bebeserv:/etc/vsftpd/user_conf# nano example

Écrivez :

  1. # donne les droits de lecture
  2. download_enable=YES
  3. anon_world_readable_only=NO
  4.  
  5. # donne les droits d'écriture
  6. write_enable=YES
  7. anon_upload_enable=YES
  8. anon_mkdir_write_enable=YES
  9.  
  10. # donne le droit de renommer de supprimer
  11. anon_other_write_enable=YES
  12.  
  13. #donne le droit de faire des chmod
  14. chmod_enable=YES
  15. virtual_use_local_privs=YES
  16.  
  17. #affiche les fichier cachés
  18. force_dot_files=YES
  19.  
  20. # donne un home dans /home/nobody
  21. # exemple : local_root=test le home de l'utilisateur sera :
  22. # /home/nobody/test
  23. local_root=test
  24.  
  25. # droits des fichiers créés
  26. anon_umask=002

Enregistrez et quittez. Maintenant que nous avons un fichier d'exemple, créez celui de l'utilisateur « test » et modifiez les options si vous le souhaiter :

  1. bebeserv:/etc/vsftpd/user_conf# cp example test

Si ce n'est déjà fait ajoutez les lignes suivantes à votre fichier « /etc/network/iptables » :

  1. iptables -t filter -A INPUT -i eth0 -p tcp --dport 21 -d $MYIP -j ACCEPT
  2. iptables -t filter -A INPUT -i eth0 -p tcp --dport 20 -d $MYIP -j ACCEPT
  3.  
  4. iptables -t filter -A OUTPUT -o eth0 -p tcp --dport 21 -s $MYIP -j ACCEPT
  5. iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 20 -s $MYIP -j ACCEPT

Et à la fin du fichier rajoutez :

  1. modprobe ip_conntrack_ftp ports=21

Configurons « fail2ban » pour qu'il scanne les connexions FTP :

  1. bebeserv:/etc/vsftpd/user_conf# nano /etc/fail2ban/jail.conf

Modifiez cette ligne :

  1. [vsftpd]
  2. enabled = true

Enregistrez et quittez. Maintenant que tout est prêt, redémarrez « iptables » et « vsftpd » :

  1. bebeserv:/etc/vsftpd/user_conf# /etc/init.d/vsftpd start
  2. [...]
  3. bebeserv:/etc/vsftpd/user_conf# /etc/init.d/iptables-conf restart
  4. [...]

Faisons un petit test de connexion :

  1. bebeserv:/etc/vsftpd/user_conf# ftp localhost 21
  2. Connected to localhost.
  3. 220 Welcome to bebeserv.bebenet.local FTP service.
  4. Name :

Loguez vous avec l'utilisateur « test » avec le mot de passe « toto ». La connexion réussi votre serveur ftp fonctionne.

Quittez :

  1. ftp> quit
  2. 221 Goodbye.
  3. bebeserv:/etc/vsftpd/user_conf#

Dans cette configuration néanmoins les utilisateurs locaux ne peuvent pas se connecter en FTP classique. ce qui est en même temps un bonne chose car le FTP classique peut être remplacer par du SFTP (FTP par SSH) vous n'avez rien à changer pour que ceci fonctionne. ATTENTION ne confondez pas SFTP ET FTPS (FTP par SSL).

Afin de sécurisé aussi nos comptes virtuels nous allons faire en sorte qu'ils puisse se connecter en FTPS. Pour ceci nous allons avoir besoin de « open-ssl » pour générer les certificats adéquats et la connexion SSL.

  1. bebeserv:/etc/vsftpd/user_conf# apt-get install openssl
  2. [...]

Maintenant générons un certificat pour « vsftpd » :

  1. bebeserv:/etc/vsftpd/user_conf# cd /etc/ssl/certs
  2. bebeserv:/etc/ssl/certs# openssl req -x509 -nodes -days 730 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem

Aux questions répondez comme ceci par exemple; le plus important étant le « Common Name » qui doit être l'adresse IP exact ou le nom de domaine exact du service), sachant que nous configurerons plus tard un sous domaine nommé « ftp » sur notre domaine « bebenet.local » j'utiliserai celui çi : « ftp.bebenet.local ».

Voici ce que j'ai répondu :

  1. Country Name (2 letter code) [AU]:FR
  2. State or Province Name (full name) [Some-State]:France
  3. Locality Name (eg, city) []:Paris
  4. Organization Name (eg, company) [Internet Widgits Pty Ltd]:bebenet.local
  5. Organizational Unit Name (eg, section) []:bebenet.local
  6. Common Name (eg, YOUR name) []:ftp.bebenet.local
  7. Email Address []:alban@bebenet.local

Vous venez de créer un certificat valide pendant deux ans. Maintenant sécurisez votre certificat avec des droits correct :

  1. bebeserv:/etc/ssl/certs# chmod 0600 vsftpd.pem

Maintenant décommentez les lignes suivantes dans « /etc/vsftpd.conf » :

  1. # Connection sécurisée
  2. ssl_enable=YES
  3. allow_anon_ssl=YES
  4. force_local_data_ssl=YES
  5. force_local_logins_ssl=YES
  6. force_anon_data_ssl=YES
  7. force_anon_logins_ssl=YES
  8. ssl_sslv2=YES
  9. ssl_sslv3=YES
  10. ssl_tlsv1=YES

Enregistrez et quittez. Rechargez la configuration de « vsftpd » :

  1. bebeserv:/etc/ssl/certs# /etc/init.d/vsftpd reload
  2. [...]

Vous pouvez régler le client de votre utilisateur virtuel pour se connecter en FTPS (FTP with SSL auth SSL explicit) ou (FTP with SSL auth TLS explicit).

Pensez à régler votre client en mode actif sans quoi il n'ira pas plus loin que la connexion. En effet sans SSL le serveur est régler pour géré le mode actif comme passif sans problème, seulement SSL empêche la gestion du mode passif. Pour contrer ceci nous pourrions limité la plage de ports passif sous « vsftpd » et ouvrir dans « iptables » ces ports mais cette idée je ne l'implémenterai pas ici. Un petit rappel, une fois le SSL activer, les clients ne pourront plus se connecter sans mode SSL. pour les utilisateurs locaux SFTP (SSH) fonctionne toujours correctement.

Voilà pour ce chapitre.

  1. bebeserv:/etc/ssl/certs# exit
  2. logout
  3. ALBAN@bebeserv:~$