Mise en place d'un serveur FTP
Ayant eu besoin d'installer un serveur FTP pour que ce type de transfert de fichiers soit permis aux utilisateurs d'une application web, je vais noter ici la bonne manière de mettre cette (immonde) chose en place. Pour information, je n'ai pas utilisé tout ce qui suit car nous avons préféré utiliser du SFTP, bien plus facile, sécurisé et stable que n'importe quel serveur FTP...
Mes objectifs étaient : utilisateurs virtuels, possibilité d'obliger tout le monde à utiliser du SSL (plus de mots de passe en clair) et performance. Tout d'abord, après analyse, il faut admettre que ce qui se rapproche le plus d'un serveur sécurisé et correcte est VSFTPd.
Ainsi, pour faire tout cela, il va falloir :
- installer les bons paquets auxiliaires sur le serveur : les BerkeleyDB, openssl etc.
- utiliser un fichier de config correct pour vsftpd
- ajouter un fichier à PAM pour que l'authentification se fasse facilement
Suivent 3 fichiers que vous devrez créer dans le même dossier pour ensuite exécuter setup.sh et tout sera mis en place.
Le fichier de configuration de VSFTPD (vsftpd.conf) :
#General
anonymous_enable=NO
local_enable=YES
write_enable=YES
connect_from_port_20=NO
idle_session_timeout=200
data_connection_timeout=30
chroot_local_user=YES
listen=YES
#
dirmessage_enable=YES
ftpd_banner=Bienvenue sur le serveur FTP de Megacorp !
#Logs
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
dual_log_enable=YES
log_ftp_protocol=YES
#Virtual users
guest_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd.virtualusers
user_sub_token=$USER
local_root=/var/ftproot/$USER
hide_ids=YES
force_dot_files=YES
guest_username=ftp_main_user
allow_writeable_chroot=YES
pasv_min_port=49000
pasv_max_port=49100
#SSL
ssl_enable=YES
allow_anon_ssl=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpdkey.pem
debug_ssl=YES
pasv_address=172.20.10.12
Le petit fichier pour PAM, vsftpd.virtualusers, à installer dans /etc/pam.d/ :
#%PAM-1.0
auth sufficient /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd_virtualusers
account sufficient /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd_virtualusers
#session required /lib/x86_64-linux-gnu/security/pam_loginuid.so
Note pour ce fichier : il faut bien vérifier que les librairies pam_userdb.so et pam_loginuid.so sont dans le dossier /lib/x86_64-linux-gnu/security. Sur un serveur ARM de test, la distribution étant assez spécifique, ces librairies n'étaient pas placées dans ce chemin.
Il vous faudra ensuite créer un fichier texte comme suit pour définir vos utilisateurs virtuels qui pourront utiliser votre FTP :
testuser1
password1
testuser2
password2
testuser3
password3
Finalement, le script qui permet d'installer automatiquement l'ensemble du serveur :
#!/bin/bash
###Vérif des paquets : pam, build-essential, openssl, db-util
###Permissions de tout !!!
wget --no-check-certificate "https://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz"
md5sum vsftpd-3.0.3.tar.gz | grep da119d084bd3f98664636ea05b5bb398 >/dev/null || (echo "Le hash MD5 de l'archive n'est pas valide, une erreur s'est produite" && exit 1)
tar xvzf vsftpd-3.0.3.tar.gz
cd vsftpd-3.0.3
sed -i.bak 's/#undef VSF_BUILD_SSL/#define VSF_BUILD_SSL/' builddefs.h
make
[[ `ldd vsftpd | grep libpam | wc -l` -ne 1 ]] && echo "VSFTPd n'a pas pu être compilé avec PAM. Il faudrait installer le paquet libpam0g-dev sur Debian." && exit 1;
[[ `ldd vsftpd | grep libssl | wc -l` -ne 1 ]] && echo "VSFTPd n'a pas pu être compilé avec le support SSL. Il faudrait installer le paquet libssl-dev sur Debian." && exit 1;
sudo mkdir -p /usr/local/man/man8
sudo mkdir -p /usr/local/man/man5
sudo make install
cd ..
#création de l'utilisateur ftp avec comme home /var/ftproot
sudo useradd -d /var/ftproot -m -s /bin/bash ftp_main_user
echo "ftp_main_user:Imsohappy" | sudo chpasswd
sudo cp vsftpd.conf /etc/
sudo cp vsftpd.virtualusers /etc/pam.d/
[[ `find / -name pam_userdb.so 2>/dev/null | wc -l` -ne 1 ]] && echo "Le fichier pam_userdb.so utilisé dans la configuration PAM pour le serveur FTP est introuvable && exit 1";
[[ `find / -name pam_loginuid.so 2>/dev/null | wc -l` -ne 1 ]] && echo "Le fichier pam_loginuid.so utilisé dans la configuration PAM pour le serveur FTP est introuvable && exit 1";
sudo mkdir -p /usr/share/empty #Important pour VSFTPd
#Une liste d'utilisateurs virtuels pour tester
db_load -T -t hash -f vusers.list vsftpd_virtualusers.db
sudo mv vsftpd_virtualusers.db /etc/
sudo chmod 0400 /etc/vsftpd_virtualusers.db
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout vsftpdkey.pem -out vsftpd.pem -subj "/C=FR/ST=France/L=MacronLyonParis/O=Megacorp/OU=IT Department/CN=www.megacorp.eu"
sudo mv vsftpdkey.pem vsftpd.pem /etc/ssl/private/
sudo chown root:root /etc/ssl/private/vsftpdkey.pem /etc/ssl/private/vsftpd.pem
sudo mkdir -p /var/ftproot/testuser1
sudo chown -R ftp_main_user:root /var/ftproot/