Serveur Debian - vsftpd
Par Seza le samedi 2 juin 2007, 18:28 - Serveur Debian - Lien permanent
CHAPITRE 3 : FTP
Commençons par installer le serveur FTP :
ALBAN@bebeserv:~$ sudo -i Password: bebeserv:~# apt-get update [...] bebeserv:~# apt-get install vsftpd libdb3-util ftp [...]
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.
bebeserv:~# /etc/init.d/vsftpd stop [...]
Nous allons d'abord nettoyer un peu ce que « vsftpd »
à créer automatiquement
bebeserv:~# userdel ftp 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.
bebeserv:~# usermod -g nogroup -d /home/nobody -s /usr/sbin/nologin nobody bebeserv:~# useradd -g nogroup -d /home/nobody -s /usr/sbin/nologin anonymous bebeserv:~# mkdir /home/nobody bebeserv:~# chgrp nogroup /home/nobody bebeserv:~# chmod 2770 /home/nobody
Créons aussi le dossier de notre premier utilisateur virtuel :
bebeserv:~# mkdir /home/nobody/test/ 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.
bebeserv:~# nano /etc/vsftpd.conf
Je change les lignes suivantes :
anonymous_enable=NO local_enable=YES write_enable=NO local_umask=022 anon_upload_enable=NO anon_mkdir_write_enable=NO dirmessage_enable=NO chown_uploads=NO chown_username=nobody xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES idle_session_timeout=300 data_connection_timeout=60 nopriv_user=anonymous ftpd_banner=Welcome to bebeserv.bebenet.local FTP service. chroot_local_user=YES
Et je rajoute celles-ci :
guest_enable=YES guest_username=nobody max_clients=20 max_per_ip=5 force_dot_files=YES hide_ids=YES use_localtime=YES user_config_dir=/etc/vsftpd/user_conf # Connection sécurisée #ssl_enable=YES #allow_anon_ssl=YES #force_local_data_ssl=YES #force_local_logins_ssl=YES #ssl_sslv2=YES #ssl_sslv3=YES #ssl_tlsv1=YES
Enregistrez et quittez.
Maintenant configurons le fichier d'authentification PAM de « vsftpd »
afin d'utiliser des utilisateurs virtuels :
bebeserv:~# nano /etc/pam.d/vsftpd
Commentez toutes les lignes et mettez ceci à la fin du fichier :
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login account required /lib/security/pam_userdb.so db=/etc/vsftpd/login
Enregistrez et quittez. Maintenant allons créer notre base d'utilisateurs virtuels :
bebeserv:~# mkdir /etc/vsftpd bebeserv:~# nano /etc/vsftpd/userdb
Créez l'utilisateur « test »
correspondant au dossier que nous avons fait plus haut :
test 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) :
user1 pass1 user2 pass2 user3 pass3 ...
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 :
bebeserv:~# nano /etc/vsftpd/vsftpd-makedb
Écrivez les lignes suivantes :
#!/bin/sh db3_load -T -t hash -f /etc/vsftpd/userdb /etc/vsftpd/login.db
Enregistrez et quittez. Maintenant donnons les bons droits à notre script :
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.
bebeserv:~# ln -s /etc/vsftpd/vsftpd-makedb /usr/local/bin/
Maintenant et après chaque modification de la table « userdb »
il faudra faire :
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 :
bebeserv:~# mkdir /etc/vsftpd/user_conf bebeserv:~# cd /etc/vsftpd/user_conf bebeserv:/etc/vsftpd/user_conf# nano example
Écrivez :
# donne les droits de lecture download_enable=YES anon_world_readable_only=NO # donne les droits d'écriture write_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES # donne le droit de renommer de supprimer anon_other_write_enable=YES #donne le droit de faire des chmod chmod_enable=YES virtual_use_local_privs=YES #affiche les fichier cachés force_dot_files=YES # donne un home dans /home/nobody # exemple : local_root=test le home de l'utilisateur sera : # /home/nobody/test local_root=test # droits des fichiers créés 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 :
bebeserv:/etc/vsftpd/user_conf# cp example test
Si ce n'est déjà fait ajoutez les lignes suivantes à votre fichier « /etc/network/iptables »
:
iptables -t filter -A INPUT -i eth0 -p tcp --dport 21 -d $MYIP -j ACCEPT iptables -t filter -A INPUT -i eth0 -p tcp --sport 20 -d $MYIP -j ACCEPT iptables -t filter -A OUTPUT -o eth0 -p tcp --dport 21 -s $MYIP -j ACCEPT iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 20 -s $MYIP -j ACCEPT
Et à la fin du fichier rajoutez :
modprobe ip_conntrack_ftp ports=21
Configurons « fail2ban »
pour qu'il scanne les connexions FTP :
bebeserv:/etc/vsftpd/user_conf# nano /etc/fail2ban/jail.conf
Modifiez cette ligne :
vsftpd] enabled = true
Enregistrez et quittez.
Maintenant que tout est prêt, redémarrez « iptables »
et « vsftpd »
:
bebeserv:/etc/vsftpd/user_conf# /etc/init.d/vsftpd start [...] bebeserv:/etc/vsftpd/user_conf# /etc/init.d/iptables-conf restart [...]
Faisons un petit test de connexion :
bebeserv:/etc/vsftpd/user_conf# ftp localhost 21 Connected to localhost. 220 Welcome to bebeserv.bebenet.local FTP service. Name :
Loguez vous avec l'utilisateur « test »
avec le mot de passe « toto »
.
La connexion réussi votre serveur ftp fonctionne.
Quittez :
ftp> quit 221 Goodbye. 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.
bebeserv:/etc/vsftpd/user_conf# apt-get install openssl [...]
Maintenant générons un certificat pour « vsftpd »
:
bebeserv:/etc/vsftpd/user_conf# cd /etc/ssl/certs 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 :
Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:France Locality Name (eg, city) []:Paris Organization Name (eg, company) [Internet Widgits Pty Ltd]:bebenet.local Organizational Unit Name (eg, section) []:bebenet.local Common Name (eg, YOUR name) []:ftp.bebenet.local 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 :
bebeserv:/etc/ssl/certs# chmod 0600 vsftpd.pem
Maintenant décommentez les lignes suivantes dans « /etc/vsftpd.conf »
:
# Connection sécurisée ssl_enable=YES allow_anon_ssl=YES force_local_data_ssl=YES force_local_logins_ssl=YES ssl_sslv2=YES ssl_sslv3=YES ssl_tlsv1=YES
Enregistrez et quittez.
Rechargez la configuration de « vsftpd »
:
bebeserv:/etc/ssl/certs# /etc/init.d/vsftpd reload [...]
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.
bebeserv:/etc/ssl/certs# exit logout ALBAN@bebeserv:~$
Commentaires
Salut Seza... petite correction ou du moins chez moi sa marche pas ... au moment de créer la commande vsftpd-makedb, si on suit ton processus tu créer ton fichier sur ~ ce qui est le dossier par defaut
mais il faudrait le créer dans /etc/vsftpd/ ou alors faire un cp vsftpd-makedb /etc/vsftpd... sinon sa marchait pas ...
Hello,
Merci pour ce tuto.. je l'ai suivi à la lettre, mon serveur ftp fonctionne très bien mais j'ai un problème, je n'arrive pas à me connecter depuis l'extérieur, en local pas de problème..
J'ai la Freebox, j'ai rediriger les ports 21 et 20 ..
L'erreur que j'ai :
Réponse : 227 Entering Passive Mode (192,168,0,100,238,86)
Statut : Le serveur a retourné une adresse non routable, remplacée par l'adresse du serveur.
Commande : LIST
Voilà..
Salut!
J'ai suivi ton excellent tuto il y a quelques temps et tout était nickel. J'ai du réinstaller ma bête entre temps, et je reviens installer mon ftp. Seulement là : plus de libdb3-util!!! (apt-get ne connait plus)
Je suis en testing...
Quelque chose peut remplacer? Car du coup, je n'ai plus la commande db3_load... C'est dommage...
Hello Castrogne, mois je l'ai installé hier libdb3-util
deb http://ftp.fr.debian.org/debian/ etch main
deb-src http://ftp.fr.debian.org/debian/ etch main
avec ces sources... t'as fait un apt-get update && apt-get upgrade?
Matthieu > Tu utilise ton client FTP en mode passif ( commande PASV ) alors qu'il faut l'utiliser en mode actif (commande PORT ). Tu trouvera ceci dans les paramétrage de ton client FTP.
Si toutefois ta freebox bloque la connection. Une solution existe (moins belle certe) :
Dans le fichier /etc/vsftpd.conf ajoute ceci :
port_enable=YES
pasv_enable=YES
pasv_min_port=62000
pasv_max_port=63000
Redémarre vsftp ave la commande /etc/init.d/vsftpd restart
ajoute les règles iptables suivantes (voir mon tuto iptables) :
iptables -t filter -A INPUT -i eth0 -p tcp --dport 62000:63000 -d $MYIP -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p udp --sport 62000:63000 -s $MYIP -j ACCEPT
Il te reste à ouvrir les ports 62000 à 63000 de ta freebox =)
Voilà tu pourras utiliser ton FTP comme bon te semble et le mode passif fonctionnera tout comme le mode actif.
Pour le paramétrage de la freebox je ne peux t'aider mais quelques me dis qu'en cherchant du côté des aides des logiciels P2P comme emule ou shareazaa tout trouvera toutes les explications nécessaires.
Ok je vais testé ça, pour le paramétrage de la Freebox, pas de soucis je sais faire ^^ !
Je te tiens au courant !
Merci :)
Castrogne,
Ce sont les aléas du testing ! Néanmoins puisque le testing est sensé devenir le futur debian stable autant se renseigner de suite.
Les paquets utilisant la base de donnée berkeley évolue, aujourd'hui dans la version testing de debian on trouve les versions 4.3 à 4.6. http://packages.debian.org/lenny/db...
Je me suis ensuite renseigné sur PAM (le système d'authentification) car c'est lui qui est charger de lire cette petite base berkeley. http://packages.debian.org/source/l... qui en est donc à sa version 0.99.7.1-6 actuellement. (celle que tu dois donc avoir sur ton serveur si tu te tiens à jour)
L'information qu'il faut trouver c'est : quelle version de base berkeley utilise le module pam_userdb dans cette version ?
Je vais donc voir le changelog du paquet PAM : http://packages.debian.org/changelo... . Il ne reste plus qu'à lire... enfin faire une recherche texte est plus rapide. En cherchant les termes "berkeley", "pam_userdb", "userdb" ceci n'a pas été très concluant mais en cherchant le terme "db4" je trouve dans le changelog de la version 0.99.7.1-2 datant du 26 aout 2007 ceci : " Migrate from db4.3 to db4.6; once again, no administrator action should be needed for upgrading on-disk database formats. "
J'en conclu que la version actuelle de berkeley pour PAM est la 4.6.
installe donc le paquet " db4.6-util ". Tu y trouvera une commande comme " db3_load " qui s'appelle " db4.6_load ". Tiens moi au courant que ça fonctionne ou pas.
Merci !
Re.. c'est bon en ouvrant les ports de 62000 a 63000 en udp et TCP ça fonctionne, Merci à toi :)
Salut,
Merci, ça marche impec avec la ligne de commande db4.6_load. En fait j'avais cherché via "apt-cache search" une commande dont le nom approchait, mais je sais pas pourquoi, je l'avais pas vu :).
Je vais essayer de mieux comprendre ta recherche, afin que je sois cappable de la refaire. N'oublies pas de signaler la modif au cas ou dans l'article.
Merci bien!!
Bonne nouvelle Castrogne !
Les commentaires sont là pour montrer les variantes =) Je mettrai le tuto à jour quand la version stable sera mise à jour pour rester cohérent avec le reste des autres tutoriels.
Merci pour les nouvelles :)