Name : BETA-TESTERS
Project name : ZW3B-API-BETA-TESTERS
Authorized. - 200 - Client API Name and Origin Wildcard OK
Installer un serveur FTP en mode sécurisé. Le protocole FTP transmet sur Internet votre mot de passe en clair. Utiliser le mode SSL ou TLS des serveurs... Je met un mémo rapide en attandant, de faire un article plus complet. La toute première remarque c'est que ; étant sous Debian, j'ai fait en premier apt-get install pure-ftpd puis je me suis rendu compte que je n'avais pas accés aux liens symboliques en me connectant avec un utilisateur chrooté. Donc recompilation en bonne éduforme :)
On récupère les sources de pure-ftpd vs 1.0.51 et on opte pour les options de compilations :
Script avec 1 ligne
001./configure --prefix=/usr --sysconfdir=/etc/pure-ftpd/ --with-everything --with-paranoidmsg --without-capabilities --with-virtualchroot --with-tls --with-peruserlimits --with-sysquotas --with-welcomemsg --with-boring --without-inetd --without-sendfile --with-extauth --with-largefile
Si vous avez une erreur lors de la configuration à propos du SSL (-with-tls
) faites un p'tit apt-get install libssl-dev
--with-altlog
Permet de loguer les informations dans des formats spécifiques afin d'être utilisé par des analyseurs de logs (webalizer, Analog, etc)
--with-brokenrealpath
Permet de garder une compatibilité avec certains systèmes solaris.
--with-cookie
Affiche un fortune ou une bannière customisée quand un utilisateur se logue.
--with-diraliases
Support des alias pour le parcours des répertoires.
--with-everything
Compilation avec toutes ces options : altlog, cookies, throttling, ratios, ftpwho, upload script, virtual users (puredb), quotas, virtual hosts, directory aliases et external authentication.
--with-extauth
Support pour les authentifications par des modules externes.
--with-ftpwho
Support de la commande pure-ftpwho.
--with-language=french
Support de la langue française.
--with-largefile
Support des fichiers de plus de 2 go.
--with-ldap
Support de LDAP.
--with-minimal
Compilation avec un minimum d'options (déconseillé).
--with-mysql
Support de MySQL.
--with-nonroot
Permet de lancer le serveur sans être root. Vous n'aurez cependant pas accès à toutes les possibilités de pure-ftpd (déconseillé).
--with-pam
Support de PAM (pluggable authentification modules).
--with-paranoidmsg
Permet de supprimer les messages user-friendly.
--with-peruserlimits
Permet de limiter le nombre de sessions qu'un utilisateur peut ouvrir.
--with-pgsql
Support de PostgreSQL.
--with-probe-random-dev
Permet d'utiliser /dev/arandom
, /dev/urandom
ou /dev/random
pour la génération des nombres aléatoires.
--with-puredb
Support des utilisateurs virtuels.
--with-quotas
Support des quotas.
--with-ratios
Support des ratios.
--with-sysquotas
Support des quotas du système et non des quotas propre a pure-ftpd.
--with-throttling
Support de la gestion de la bande passante.
--with-uploadscript
Support du programme pure-uploadscript.
--with-virtualchroot
Permet de suivre les liens symboliques. Une utilisation courante est le pointage vers un dossier d'uploads commun à tous les utilisateurs.
--with-virtualhosts
Support des virtual hosts. Les virtual hosts permettent notamment d'avoir plusieurs espaces sur votre ftp selon l'adresse IP spécifiée.
--with-welcomemsg
Permet d'utiliser un fichier welcome.msg à la place de .banner.
--with-boring
Affiche les messages à aspect professionnel.
--with-privsep
Permet D'utiliser deux processus par client. Cela réduit les performances mais augmente la sécurité.
--without-ascii
Désactive le support des transferts en mode ASCII. (Déconseillé).
--without-banner
Désactive l'affichage de la bannière d'accueil.
--without-capabilities
Ignore la librairie Libcap.
--without-globbing
Désactive les expressions régulières (tel que ls *.rpm) (déconseillé).
--without-inetd
Désactive le support du mode de démarrage inetd.
--without-iplogging
Désactive le logue des IP.
--without-nonalnum
Désactive le support des caractères non alphanumériques. (Déconseillé).
--without-sendfile
Permet de garder une compatibilité avec les systèmes de fichier réseau (comme NFS).
--without-shadow
Ignore les shadow password. (Déconseillé).
--without-standalone
Désactive le mode de démarrage standalone.
--without-usernames
Affiche les uid ou gid plutôt que les noms des utilisateurs.
Une fois que la configuration est effectuée, compiler et installer
Script avec 1 ligne
001make && make install
Voilà c'est installé et les ln -s
de mes Home's seront visibles (--with-virtualchroot
).
Donc maintenant on va ajouter des utilisateurs à notre serveur. Plusieurs solutions d'authentification s'offrent à nous et en même temps. C'est à dire que l'on peut avoir des utilisateurs systèmes (ceux qui sont dans notre fichier /etc/password
) ou créer des utilisateurs virtuels (qui auront accés à notre machine que par ce FTP). Les utilisateurs virtuels peuvent être authentifiés par différents moyens ; grâce à une base MySQL, grâce à une base PostgreSQL; grâce à un annuaire LDAP ou encore grâce à une base Pure-ftpd.
On va travailler avec la base pure-ftp (celle qui ne demande aucun serveur à côté)
Pour exemple, on va tout de même créer un groupe et un user au système.
Script avec 2 lignes
001groupadd ftpgrp 002useradd -g ftpgrp -d /dev/null -s /bin/false ftpusr
on crée un groupe ftpgrp pour nos futurs utilisateurs ; et un utilisateur ftpusr sans homeDirectory
(/dev/null
) ni shell (/bin/false
).
Il faut auparavant ajouté fake shell /dev/false
au fichier /etc/shells
Puis on ajoute notre 1er utilisateur (virtual) - un utilisateur normal.
Script avec 1 ligne
001pure-pw useradd mon_user -u ftpusr -g ftpgrp -d /home/mon_user/ -m
on change son mot de passe :
Script avec 1 ligne
001pure-pw passwd mon_user -m
on modifie notre utilisateur pour lui attribuer (dans cet exemple) le compte de l'utilisateur UID:1000 et GID:1000 (pour qu'il puisse modifier ses fichiers - c'est la même personne)
Script avec 1 ligne
001pure-pw usermod mon_user -u 1000 -g 1000 -m
Par exemple, après avoir fixer entre 9h00 et 10h31 l'heure possible de connection au serveur FTP pour l'utilisateur mon_user, par cette commande :
Script avec 1 ligne
001pure-pw usermod mon_user -z 0900-1031 -m
vous pouvez supprimer, la restriction d'heure (Time restrictions) d'accés comme ceci :
Script avec 1 ligne
001pure-pw usermod mon_user -z -m
La commande pour appliquer les changements c'est : pure-pw mkdb
mais vous pouvez remarquez le -m
à chaque fois ; cela permet d'appliquer les changement automatiquement dans la base pure-ftp.
Pour lister les utilsateurs virtuels :
Script avec 1 ligne
001pure-pw list
ou seulement notre utilisateur :
Script avec 1 ligne
001pure-pw show mon_user
Savoir si des utilisateurs sont loggués sur la machine en FTP :
Script avec 1 ligne
001pure-ftpwho -v
qui nous affiche son pseudo, son IP, son fichier en cours de DL/UP, la vitesse de DL/UP, et le % effectué.
Sans oublier pure-pw --help
pour connaître toutes les options ;)
Il faut openssl bien sûr : apt-get install openssl si cela n'est pas déjà fait.
Script avec 1 ligne
001openssl req -x509 -days 365 -nodes -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem && chmod 600 /etc/ssl/private/*.pem
Pour l'instant je le démare comme cela :
Script avec 1 ligne
001pure-ftpd -B -1 -k 95% -A -c 50 -C 5 -E -w -Y 1 -O clf:/var/log/pure-ftpd/transfer.log -l puredb:/etc/pure-ftpd/pureftpd.pdb -U 113:002 -D -b -j -p 40000:50000
dans l'ordre rapidement :
-B
== daemon serveur -k 95%
== Arrête les uploads si le pourcentage d'espace libre spécifié est dépassé. -A
Chroot tout le monde sauf root. -c 50
== Nombre maximum de client. 50 par défaut. -C 5
== Nombre maximum de client par IP. Augmente la sécurité.-E -e
== Le serveur n'acceptera pas les connexions anonymes. -w
== Support du protocole FXP pour les utilisateurs authentifiés. -Y 1
== Désactive le ssl/tls (0), Accepte les deux standard (1), ou refuse les connexions n'utilisant pas le ssl/tls (2). -l pam
== (on peut en mettre plusieurs) users system peuvent se loguer -l
on peut le changer ou en ajouter ex: -l pam
pour les users system etc. (avec ldap ou mysql..)-D
== Affiche les fichiers caché sans que le client ne spécifie l'option -a
.-b
== Assure une compatibilité avec certains clients ftp. -j
== Créer le répertoire maison de l'utilisateur automatiquement si cela n'est pas déjà fait. -p 40000:50000
== Permet de laisser la connection choisir les ports à utiliser entre 40000 et 50000 (histoire que les sniffers n'aient pas que le port 21 à snorter).-N
== Force le mode ACTIF. -H
== Le serveur ne cherche pas à transformer les IPs en noms dans les logs. -r
== Renomme les fichiers existant lors de l'upload. -K
== Autorise les utilisateurs a résumer ou uploader des fichiers, mais pas de les effacer ou renommer. -t
== Active la limitation de la bande passante pour les utilisateurs anonymes.-T
== Active la limitation de la bande passante pour les utilisateurs authentifiés.-U
: == Active le umask différent de default (133:022). Exemple : pour que nos fichiers et dossiers uploadés soient modifiable pour le groupe utiliser un umask 113:002et d'autres.. ;)
Script avec 1 ligne
001killall -9 pure-ftpd
Nétant pas un as en matière de script bash j'ai fais un script rapide qui prend en 3ème argument la valeur de l'option -Y (tls) soit 0 ou 1 ou 2 qui permet de démarer le serveur en mode SSL ou pas.
Script avec 1 ligne
001vi /etc/init.d/pure-ftp
Script avec 95 lignes
001#!/bin/bash 002 003### BEGIN INIT INFO 004# Provides: ftp-server 005# Required-Start: $network $remote_fs $syslog 006# Required-Stop: $network $remote_fs $syslog 007# Default-Start: 2 3 4 5 008# Default-Stop: 0 1 6 009# Short-Description: Pure FTP server 010# Description: Secure and efficient FTP server 011# Free, secure, production-quality and standard-conformant FTP server. 012# Features include chrooted home directories, 013# virtual domains, built-in 'ls', anti-warez system, configurable ports for 014# passive downloads, FXP protocol, bandwidth throttling, ratios, 015# fortune files, Apache-like log files, fast standalone mode, atomic uploads, 016# text / HTML / XML real-time status report, virtual users, virtual quotas, 017# privilege separation, SSL/TLS and more. 018### END INIT INFO 019 020#####-------------------------- VARIABLES ----------------------------###### 021 022# 0 : Désactive les connexions ssl/tls. 023# 1 : Accepte les deux standard de connexions. 024# 2 : Refuse les connexions n'utilisant pas le ssl/tls. 025 026MODE_PAR_DEFAULT=2 027 028#####-------------------------- VARIABLES ----------------------------###### 029 030#####-------------------------- FONCTIONS ----------------------------###### 031 032function server_mode() 033{ 034 if [ $1 ]; then 035 case "$1" in 036 1) 037 MODE=$1 038 ;; 039 2) 040 MODE=$1 041 ;; 042 0) 043 MODE=$1 044 ;; 045 *) 046 MODE=$MODE_PAR_DEFAULT 047 ;; 048 esac 049 else 050 MODE=$MODE_PAR_DEFAULT 051 fi 052} 053 054function echo_server() 055{ 056 if [ $MODE = 1 ]; then 057 echo "Accepte les deux standard de connexions..." 058 elif [ $MODE = 2 ]; then 059 echo "Refuse les connexions n'utilisant pas le ssl/tls." 060 else 061 echo "Désactive les connexions ssl/tls..." 062 fi 063} 064 065function start_server() 066{ 067 pure-ftpd -B -1 -k 95% -A -c 50 -C 5 -E -w -Y $MODE -O clf:/var/log/pure-ftpd/transfer.log -l puredb:/etc/pure-ftpd/pureftpd.pdb -U 113:002 -D -b -j -p 40000:50000 068} 069 070#####-------------------------- FONCTIONS ----------------------------###### 071 072#####-------------------------- START / STOP ----------------------------###### 073 074case "$1" in 075 076start|restart) 077$0 stop 078 echo -n "Starting pure-ftp 1.0.51 server... " 079 server_mode $2 080 echo_server 081 start_server 082;; 083 084stop) 085 echo "Stopping pure-ftp 1.0.51 server... " 086 killall -9 pure-ftpd 087;; 088 089*) 090echo "usage : $0 (start|stop|restart) (0|1|2)" 091;; 092 093esac 094 095#####-------------------------- START / STOP ----------------------------######
Attribuer les droits executables au fichier :
Script avec 1 ligne
001chmod +x /etc/init.d/pure-ftp
Démarer, arrêter, redémarer le serveur (un peu louche ce chiffre mais bon..) :
Script avec 1 ligne
001/etc/init.d/pure-ftp start|stop|restart 0|1|2
Script avec 1 ligne
001update-rc.d pure-ftp defaults
Et on vérifie que les fichiers sont bien présent dans les rc
(runlevels) :
Script avec 8 lignes
001find /etc/rc* -name "*pure*" -type l -exec ls -l {} ; 002lrwxrwxrwx 1 root root 18 sept. 8 15:18 /etc/rc0.d/K01pure-ftp -> ../init.d/pure-ftp 003lrwxrwxrwx 1 root root 18 sept. 8 15:18 /etc/rc1.d/K01pure-ftp -> ../init.d/pure-ftp 004lrwxrwxrwx 1 root root 18 sept. 8 15:18 /etc/rc2.d/S01pure-ftp -> ../init.d/pure-ftp 005lrwxrwxrwx 1 root root 18 sept. 8 15:18 /etc/rc3.d/S01pure-ftp -> ../init.d/pure-ftp 006lrwxrwxrwx 1 root root 18 sept. 8 15:18 /etc/rc4.d/S01pure-ftp -> ../init.d/pure-ftp 007lrwxrwxrwx 1 root root 18 sept. 8 15:18 /etc/rc5.d/S01pure-ftp -> ../init.d/pure-ftp 008lrwxrwxrwx 1 root root 18 sept. 8 15:18 /etc/rc6.d/K01pure-ftp -> ../init.d/pure-ftp
OK, donc, le serveur FTP se lancera au boot de la machine.
Il faut donc ouvrir le port TCP 21
et les ports TCP pour le mode passif (plus sécurisé) de 40000
à 50000
.
Pour faire simple de cette façon (si vous êtes sur le serveur lui-même) :
Script avec 2 lignes
001iptables -A INPUT -p tcp --dport 21 -j ACCEPT 002iptables -A INPUT -p tcp --dport 40000:50000 -j ACCEPT
Salutations,
Romain
J'ajoute un sujet de discussion que j'ai posté sur Debian-FR.org : Pure-FTPd - TLS/SSL Error? si çà peut vous intéressez.