Procédure pour créer un serveur FTP sécurisé SSL forcé avec usager virtuels sous Ubuntu Linux avec vsFTPd
linux logiciel-libre securite tutoriels unix
Je ne sais pas si vous êtes comme moi mais je n'aime pas laisser non crypté l'accès a un service qui me demande un mot de passe. Je devait monter un serveur cette semaine qui doit avoir les accès FTP.
J'ai pris l'initiative de sécuriser la machine avec du SSL car je crois qu'aujourd'hui c'est notre devoir de faire ce genre de chose. Ce n'est pas la première fois que je configure un serveur FTP over SSL mais je n'avait jamais pris de notes vraiment à ce jour. Je l'ai fait cette fois-ci!
Ce que cette procédure fait...
- Pouvoir créer des comptes FTP sans avoir a créer un utilisateur local (donc pas accès shell (SSH)).
- Permet les connections FTP over SSL de façon EXPLICITE sur un port non standard (cet exemple utilisera le port 6123)
- Ne permet pas d'utilisateur ni de connexions anonymes
- Bannit les hôtes qui tentent de se connecter (LOGIN FAILED) via fail2ban
- Utilise le system PAM interne pour l'authentification
- Ne requiert pas d'usager local (pas de risque de tentative de connection SSH, usager séparés)
- Le serveur FTP roule sur son propre usager
Procédure
- Vérifier quelle version de serveur FTP est installé
# dpkg --list | grep ftp ~ ii ftp 0.17-19 The FTP client ii lftp 3.7.15-1ubuntu2 Sophisticated command-line FTP/HTTP client p ii vsftpd 2.2.0-1ubuntu1 lightweight, efficient FTP server written fo
Note vsftpd est ce qu'on veut. Dans ce cas-ci il est déjà installé (ii). - Assurer que les prérequis sont installés
# aptitude install vsftpd libpam-pwdfile openssl
- Modifier le fichier de config vsftpd.conf.
Note Modifiez pour ces valeurs (ci-bas) et conservez les autres valeurs par défaut.
# vi /etc/vsftpd.conf ~ anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 chroot_local_user=YES ftpd_banner=Un nom Quelconque FTP nopriv_user=vsftpd
renoirboulanger.com 2010-04-29 we will force usage on an other port
#connect_from_port_20=YES
- Ajouter ou corriger (étaient pas présents lorsque j'ai crée la procédure)
# 2010-04-28 accès usager virtual_use_local_privs=YES guest_enable=YES user_sub_token=$USER local_root=/home/ibottin/FTP/$USER hide_ids=YES
Note Ajuster le local_root a l'endroit ou envoyer les fichiers. - Activer le SSL
- Créer le certificat
# cd /etc/ssl # /usr/bin/openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem
- Ajouter au /etc/vsftpd.conf
# vi /etc/vsftpd.conf ~ # renoirboulanger.com 2010-04-30 SSL configuration listen_port=6123 ftp_data_port=6122 pasv_min_port=6000 pasv_max_port=6100
ssl_enable=YES
Allow anonymous users to use secured SSL connections
allow_anon_ssl=YES
All non-anonymous logins are forced to use a secure SSL connection in order to
send and receive data on data connections.
force_local_data_ssl=NO
All non-anonymous logins are forced to use a secure SSL connection in order to send the password.
force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=YES ssl_sslv3=YES rsa_cert_file=/etc/ssl/vsftpd.pem
- Créer le certificat
- Remplacer le contenu du fichier pam.d/vsftpd
# vi /etc/pam.d/vsftpd ~ auth required pam_pwdfile.so pwdfile /etc/vsftpd.passwd account required pam_permit.so
Note Il est important de remplacer le reste du fichier par ce contenu ci-haut. - Modifier permissions sur le fichier .pem
# chown vsftpd /etc/ssl/vsftpd.pem
- Redémarrer vsftpd
# /etc/init.d/vsftpd restart
- Créer le unix user qui va rouler le démon
# adduser --system --no-create-home --disabled-login -s /usr/sbin/nologin --home /var/ftp vsftpd
- Modifier les permissions pour l'utilisateur qui roule vsftpd (ajuster)
# chown -R ftp:ftp /var/ftp/ # chmod -R 740 /var/ftp
- Ajouter un utilisateur FTP
- Ajuster fail2ban
Ajuster le bloc [vsftpd]
# vi /etc/fail2ban/jail.conf ~ [vsftpd]
Note par defaut enabled est a false... il faut l'activer.enabled = true
- Redémarrer vsftpd
# /etc/init.d/vsftpd restart * Stopping FTP server: vsftpd ...done. * Starting FTP server: vsftpd ...done. # ps aux|grep vsftpd vsftpd 18771 0.0 0.0 28904 1300 ? Ss 17:09 0:00 /usr/sbin/vsftpd vsftpd 18772 0.0 0.0 29100 1608 ? S 17:09 0:00 /usr/sbin/vsftpd ftp 18773 0.0 0.0 28928 924 ? S 17:09 0:00 /usr/sbin/vsftpd root 18795 0.0 0.0 22628 1712 ? S 17:14 0:00 /usr/sbin/vsftpd ...
Note les deux premiers vsftpd est le résultat attendu - Nous allons forcer le FTP over SSL sur le port 6122, pour ça il faut autoriser le Firewall
# iptables -A INPUT -m state --state ESTABLISHED,RELATED # iptables -A INPUT -m tcp -p tcp --dport 6122 -j ACCEPT # iptables -A INPUT -m state --state NEW,ESTABLISHED # iptables -A INPUT -m tcp -p tcp --dport 6123 -j ACCEPT # iptables -A INPUT -p tcp --dport 6000:6100 -j ACCEPT
Source: vsftpd SSL and iptables - Sauvegarder le Firewall
# iptables-save > /etc/iptables.rules
- Tester de l'extérieur avec un client FTP (Filezilla, etc)
Voir les options suivantes a la connection
- port: 6123
- Forcer le SSL
Ajouter un utilisateur FTP
On utilise le truc simple de htpasswd pour l'authentification. Pas de gossage :-)Créer un nouveau compte
- Créer le premier compte, sinon, passer a la directive suivante! ou Utiliser mon script Script pour créer un compte utilisateur
# htpasswd -c /etc/vsftpd.passwd ftpuser New password: Re-type new password: Adding password for user ftpuser
Note l'option -c est pour créer le fichier la première fois. - Voir les directives de *Script pour créer un compte utilisateur
Ajouter ou modifier un utilisateur
- Utiliser le script evo-vsftpd-user
$ sudo evo-vsftpd-user foo Création d'un nouvel usager dans /etc/vsftpd.passwd ... New password: Re-type new password: Adding password for user foo ... OK * Création du dossier /home/ibottin/FTP/foo ... OK * Changement des permissions du dossier ... OK Terminé!
Voir les directives de Script pour créer un compte utilisateur
Script pour créer un compte utilisateur
- Créer le fichier
# vi /usr/sbin/evo-vsftpd-user
- Coller le contenu
#!/bin/bash if [ -z $1 ]; then echo "Aucun argument usager fourni" echo "usage: sudo evo-vsftpd-user foo" exit 1; fi
if [ "$(whoami)" != 'root' ]; then echo "Vous n'avez pas les permisions utilisateur requises." exit 1; fi
echo "Création d'un nouvel usager dans /etc/vsftpd.passwd ... " htpasswd /etc/vsftpd.passwd $1 echo " ... OK " echo -n " Création du dossier /home/ibottin/FTP/$1 ... " mkdir /home/ibottin/FTP/$1 echo " OK" echo -n " Changement des permissions du dossier ... " chown -R ftp:ftp /home/ibottin/FTP/$1 chmod -R 740 /home/ibottin/FTP/$1 echo " OK" echo "Terminé!"
- Rendre exécutable
# chmod +x /usr/sbin/evo-vsftpd-user
Tester
- Installer le paquet pour tester
# aptitude install ftp-ssl
- Tester
# ftp-ssl someserver.net 6123 Connected to someserver.net. 220 Un nom Quelconque FTP Name (someserver.net:renoirboulanger): ftpuser 234 Proceed with negotiation. [SSL Cipher DES-XXXX-SHA] 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
Note [SSL Cipher DES-XXXX-SHA] est ce qu'on attend :-)
Pour déboguer
Le feedback est assez difficile a avoir de la part de vsftpd, mais pour en voir plus:- Pour le debug
# vi /etc/vsftpd.conf ~ # for debuging log_ftp_protocol=YES