Tout est dévoilé !
Je suis tombé là-dessus et je me suis régalé ?️

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 :
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/Afin de pouvoir générer des fichiers Word en PHP (ou depuis n'importe quel autre langage), il existe une manière intéressante de créer des fichiers que Word peut ouvrir : une base HTML+CSS compatible Office !
Ce qui m'a permis de connaître ce site : une page sur StackOverflow
Afin de mettre à jour une vieille configuration de Bind+Apache que j'avais mis en place aux alentours de 2003 pour ma société Insitoo, voici comment gérer dynamiquement une infinité de sous-domaines, comme par exemple :
client1.exemple.com
gudule.exemple.com
ubu.exemple.com
etc.
Tout cela sans avoir à ajouter une ligne à la zone DNS et une configuration Apache pour chaque sous-domaine.
Commençons par le DNS du domaine principal (exemple.com ici), il faut ajouter la ligne suivante dans sa zone DNS :
*.exemple.com. A XX.XX.XX.XX ;IP du serveur destination
Le caractère * a la signification intuitive qu'un programmeur/admin attend : Bind va reconnaître TOUTES les demandes DNS ayant comme suffixe "exemple.com" et renvoyer l'adresse IP du serveur située après le A. La gestion de ce caractère par les serveurs DNS a son propre RFC.
Il reste à s'occuper d'Apache, qui va recevoir des requêtes HTTP pour ces sous-domaines, dont il faut s'occuper en ajoutant les lignes qui suivent dans le virtual host qui correspond au domaine principal :
ServerName exemple.com
ServerAlias *.exemple.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9_-]+)\.exemple\.com
RewriteRule (.*) /index.php?a=%1&b=$1 [L]
Ce qui permet de rediriger, silencieusement, la requête http://XXX.exemple.com/test vers une exécution du script http://exemple.com/index.php?a=XXX&b=test. Cela sans redirection HTTP bien sûr...
Note : le slash situé avant la référence à index.php sur la ligne de RewriteRule est très important ! Si cette configuration ne fonctionne pas, vérifiez sa présence...
Note 2 : d'après les specs, le caractère underscore ("_") est interdit dans les libellés des noeuds DNS. Or, les navigateurs usuels, Apache et même Bind gèrent ce caractère correctement. De même, un libellé de noeud DNS commençant par un chiffre est correctement géré, alors que ce cas n'est pas non plus permis par la spec. Je n'ai pas trouvé de correctif ou d'addendum expliquant cela.
Ayant eu besoin de rendre paramétrique un "icône" vectoriel pour une mise à jour de Batipad, j'ai intégré tout le code ici, afin que ça puisse servir à quelqu'un (peut-être) et surtout à moi !
Diaphragme |
|
|
|
|