ubuntu-fr

Communauté francophone des utilisateurs d'Ubuntu

[[vsftpd]]

Piste: » vsftpd


Attention à cette documentation que je viens de suivre et qui présentait des failles de sécurité importantes (partie connexion depuis le web)! Je n'ai pas tout vérifier en détail mais je vous conseille de vérifier les paramètres données avec le man du site officiel!

Préambule : FTP et "FTP-Like" sécurisés

Au niveau des protocoles de transfert de fichiers, il y a le FTP classique: Tout y passe en clair (y compris les infos de login/mot de passe). Ce protocole utilise un canal de controle et un canal de données (par défaut, port 21 en destination pour le canal control).

Ce tutoriel explique les possibilités de sécurisation du FTP c'est a dire FTP sur SSL/TLS (parfois nommé FTPS).

Il est important de ne pas confondre cette évolution sécurisée de FTP, basée sur le protocole d'origine , avec SFTP.

La proximité des acronymes prete en effet a confusion!

En effet, SFTP n'est nullement basé sur FTP, mais sur SSH! Il fait d'ailleurs partie de OpenSSH server et n'utilise par défaut que l'unique port 22 de SSH.

SFTP peut être vu comme un SCP (comme le CP de fichiers classique, mais chiffré avec SSH) avec une interface de commande proche de FTP, les mêmes possibilités d'utilisation sur un lien peu fiable (une copie avortée par une perte de connection ne devra pas être reprise de zéro, mais reprendra de là ou elle en était une fois le lien ré-établi)... D'ailleurs la plupart des clients FTP classiques supportent SFTP (parfois dénommé FTP sous SSH2).

D'ou une possible confusion côté client: Si cela ne fonctionne pas, vérifier.

Autre corollaire: Ceux qui ont déjà OpenSSH Server sur leur machine peuvent éviter un doublon et préférer utiliser SFTP. Cependant, SFTP donnant accès à toute l'arborescence (A priori il y a une option pour changer cela dans le cvs ), il faudra souvent restreindre l'accès à l'utilisateur crée: Cet utilisateur sera crée avec un shell restreint (type rssh) ne donnant accès qu'aux commandes SFTP et/ou SCP. Il faudra par ailleurs lui créer un environnement chrooté pour le bloquer dans une sous-arborescence (son home par exemple). D'autres tutoriels traitent ces points.

Serveur FTP : Very secure FTPd

VsFTPd est un serveur FTP conçu avec la problématique d'une sécurité maximale. Contrairement aux autres serveurs FTP (ProFTPd, PureFTPd, etc.), aucune faille de sécurité n'a jamais été décelée dans VsFTPd. Ce serveur est notamment utilisé à grande échelle par des entreprises telles que Red Hat.

La configuration par défaut de VsFTPd est très restrictive :

  1. Seul le compte anonyme est autorisé à se connecter au serveur
  2. En lecture seule
  3. Les utilisateurs ne peuvent accéder à leur compte

Remarques

Aussi sécurisé que soit un serveur ftp, le protocole ftp en lui même n'est pas sûr ! En effet l'échange du nom d'utilisateur et du mot de passe transite en clair sur le réseau. Si vous utilisez ce serveur sur votre LAN pas de soucis, mais attention si vous comptez utiliser le serveur ftp depuis internet, de fait n'utilisez pas un compte qui a les droits sudo via ftp (en fait n'utilisez de l'extérieur ce compte QUE via ssh ou tout autre protocole sécurisé, POPs, etc.)

Installation

Configuration de vsftpd

La configuration de VsFTPd est centralisée dans un seul et même fichier /etc/vsftpd.conf. Choisissez votre éditeur de texte favori (en mode super utilisateur) et appliquez les modifications suivantes en fonction du mode de fonctionnement de VsFTPd.

  • Pour permettre à vos utilisateurs locaux (ceux qui ont un compte sur la machine) de se connecter au serveur et d'écrire.
local_enable=YES
write_enable=YES
  • Pour permettre la configuration du chmod par défaut que prendront les fichiers et les dossiers.
local_umask=077
  1. Valeur 002 : permet d'avoir un chmod des dossiers en 775 et fichiers en 664
  2. Valeur 022 : permet d'avoir un chmod des dossiers en 755 et fichiers en 644
  3. Valeur 077 : permet d'avoir un chmod des dossiers en 700 et fichiers en 600
  • Vous pouvez personnaliser le texte de connexion au serveur
  ftpd_banner=Bienvenue sur le serveur ftp de René
  • Vous pouvez « emprisonner » certains utilisateurs dans leur dossier personnel grâce à la configuration suivante :
chroot_local_user=YES
chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list

Les identifiants des utilisateurs concernés doivent êtres renseignés dans /etc/vsftpd.chroot_list.

Si vous voulez changer le port par défaut (21) :

listen_port=222
  • Pour avoir un monitoring basic (voir les utilisateurs connectés) :
 setproctitle_enable=YES

Ensuite, pour voir la liste des utilisateurs il suffit de taper la commande suivante dans un terminal :

 ps -aef | grep vsftpd

ou pour suivre les connexions en continu :

 watch -n 1 'ps ax | grep vsftpd | grep -v grep'

Attention, tous les utilisateurs du système ayant accès à la commande "ps" pourront également visualiser la liste des utilisateurs connectés.

* Monitoring d'après le fichier de log

Aucun changement à effectuer dans vsftp.conf. Pas de problème de sécurité car la commande est accessible en mode super-utilisateur seulement. Tapez dans un terminal :

 sudo tail -f /var/log/vsftpd.log

Après chaque changement sur la configuration, pensez à relancer le serveur pour les prendre en compte :

 sudo /etc/init.d/vsftpd restart

Plus d'infos sur la configuration de vsftpd: Documentation vsFTPd

Note : Il est tout à fait possible d'utiliser vsftpd avec xinetd (xinetd se chargeant de lancer le serveur ftp uniquement quand une connexion est demandée).

Voici un lien avec une méthode très bien décrite sur la mise en place de vsftpd ainsi que de la création de compte avec des droits distincts : http://www.andesi.org/index.php?node=121

Partage de dossier et chroot

Les utilisateurs étant chrootés dans leur home (ce n'est pas obligatoire mais conseillé) il faut trouver un moyen de leur permettre de naviguer dans un dossier a l'exterieur de leur home.
ln pour faire un lien symbolique ne fonctionne pas : problème de droit.
La commande à utiliser est mount avec l'option –bind

sudo mount --bind dossier_source dossier_ftp

Pour l'avoir au boot éditer /etc/fstab et ajouter :

home/serveur/Bureau/cod4/dossier_ftp_source /dossier_ftp_cible    none  bind,defaults,auto     0    0

vsftpd et SSL

Principale source d'informations

Un des défauts principal du protocole ftp est que les couples nom d'utilisateur / mot de passe transitent en clair sur le réseau...

Mais il est possible de mettre une couche supplementaire, ssl pour chiffrer les echanges d'authentification et/ou de données

Je vous invite à lire le fichier /usr/share/doc/vsftpd/README.ssl qui vient avec vsftpd. Pour les mises en garde de sécurité.

Création du certificat

Il vous faut le paquet openssl

 mkdir ~/SSL-cert-vsftpd && cd ~/SSL-cert-vsftpd 
 openssl req -x509 -nodes -days 730 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem

Openssl va vous poser quelques questions, la plus critique est celle ci :

Common Name (eg, YOUR name) []:

Il faut écrire le nom ou l'ip que les clients utiliseront. Il est possible de faire un certificat signé par sa propre authorité de certification et donc générer des certificats valides, une fois que vos clients ont reconnu votre authorite de certification : Creating and Using a self signed SSL Certificates in debian

Un certificat, vsftpd.pem, a été généré dans le dossier SSL-cert-vsftpd de votre dossier personnel.

Copions le dans /etc/ssl/certs/ :

sudo cp ~/SSL-cert-vsftpd/vsftpd.pem /etc/ssl/certs/

Sécurisons le :

sudo chown root:root /etc/ssl/certs/vsftpd.pem
sudo chmod 600 /etc/ssl/certs/vsftpd.pem

Note : vsftp s'execute avec les droits de l'utilisateur nobody mais il se lance en tant que root et donc lit le certificat en tant que root.

Configuration de vsftpd.conf / Partie SSL

A la fin de votre fichier /etc/vsftpd.conf


# Options for SSL
# encrypted connections.

ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=NO  <--- vous pouvez mettre à "YES" si vous utilisez kasablanca
force_local_logins_ssl=YES

ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES

rsa_cert_file=/etc/ssl/certs/vsftpd.pem

A priori un :

sudo /etc/init.d/vsftpd restart

devrait bien se passer.

Configuration du serveur pour un accès à partir d’Internet

Si vous voulez accéder à votre serveur FTP depuis internet, ou si celui-ci se trouve derrière un firewall ou un routeur, il est nécessaire de rajouter les lignes suivantes dans votre fichier /etc/vsftpd.conf

pasv_promiscuous=NO
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address=XX.XX.XX.XX ou domaine.com avec pasv_addr_resolve=YES
port_promiscuous=NO

pasv_promiscuous Si vous voulez désactiver le contrôle de sécurité PASV qui assure que la connexion de données provienne de la même adresse IP que le contrôle de connexion. Utilisez si vous savez ce que vous faites! Le seul usage légitime à celà est dans un environnement de tunnels sécurisés, ou peut-être pour faciliter l'utilisation de FXP. Défaut: NO

pasv_address Utilisez cette option pour écraser l'adresse IP à laquelle vsftpd répondra à la commande PASV. Fournissez une adresse IP numérique.

[On peut toutefois lui donner un nom de domaine en lui ajoutant l'option de résolution DNS: pasv_addr_resolve=YES.]

Cette option est par défaut à NON: L'adresse est reprise de la précèdente socket .

port_promiscuous Utilisez cette option si vous voulez désactiver le PORT contrôle de sécurité qui garantit que les connexions de données sortantes peuvent uniquement se connecter au client. A modifier si vous savez ce que vous faites! Défaut: NO

pasv_min_port et pasv_max_port correspondent respectivement au port d'écoute mini et maxi du serveur ftp en mode passif (les valeurs saisies ici sont arbitraires, vous pouvez en saisir d'autres). Cette plage de port doit être ouverte sur votre pare-feu (udp et tcp) et redirigée vers votre serveur FTP.

Il vous reste à redémarrer le serveur avec la commande suivante

  sudo /etc/init.d/vsftpd restart

et à configurer votre client ftp de façon à ce que celui-ci réalise des connexions en mode passif (mode passif dans les paramètres du pare-feu de filezilla par exemple)

Configurer VSFTPD pour utiliser des utilisateurs virtuels

Nous allons configurer VSFTPD pour utiliser seulement des utilisateurs virtuels et non pas les utilisateurs locaux de votre machine. Pour celà nous allons créer des dossiers afin d'y placer nos futurs fichiers de configuration:

sudo mkdir /etc/vsftpd
sudo mkdir /etc/vsftpd/vsftpd_user_conf

Sauvegardons nos fichiers de configuration actuels :

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.default.bak
sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.default.bak

Créer la base de données des utilisateurs virtuels

sudo apt-get install libdb4.4 db4.4-util db4.4-doc

Création du fichier PAM : Il faut effacer le contenu du fichier /etc/pam.d/vsftpd et le remplacer par:

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login

Créons un fichier "login.txt" dans /etc/vsftpd , avec vos utilisateurs et mots de passe :

util1
mdp1
util2
mdp2

Les 2 utilisateurs sont donc ici 'util1' et 'util2' et leurs mots de passe respectifs 'mdp1' et 'mdp2'.

Attention : le fichier login.txt doit impérativement se terminer par un saut de ligne pour que db4.4_load le lise et l'interprête correctement.

Il faut maintenant le convertir au format "db":

sudo db4.4_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

on sécurise notre fichier :

sudo chmod 600 /etc/vsftpd/login.db

Configuration du fichier /etc/vsftpd.conf

# Ceci configure vsFTPd en mode "standalone"
listen=YES

# On désactive les connexions anonymes
# et on active les non-anonymes(c'est le cas des utilisateurs virtuels):
anonymous_enable=NO
local_enable=YES

# Pour des raisons de sécurité on interdit toute action d'écriture:
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

# 'guest_enable' est très important: cela active les utilisateurs virtuels!
# 'guest_username' fait correspondre tous les utilisateurs virtuels à
# l'utilisateur 'ftp' que nous avons défini plus haut, et au home
# correspondant: '/home/ftp/'.
guest_enable=YES
guest_username=ftp

# On veut que les utilisateurs virtuels restent chez eux: '/home/ftp/'
chroot_local_user=YES

# On défini le nombre maximum de sessions à 200(les nouveaux clients recevront
# un message du genre: "erreur: serveur occupé").
# On défini le nombre maximum de sessions par IP à 4
max_clients=200
max_per_ip=4

####################################
# Debian customization             #
####################################
# Some of vsftpd's settings don't fit the Debian filesystem layout by
# default.  These settings are more Debian-friendly.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/vsftpd.pem


## Activer la configuration per-user
user_config_dir=/etc/vsftpd/vsftpd_user_conf

Relançons le serveur :

sudo /etc/init.d/vsftpd restart
attention après un "YES" ou "NO" dans fichier de configuration il faut bien un retour a la ligne seul et ne pas laisser trainer un espace suivit du retour a la ligne. Vous arriverez peu être à relancer le démon mais à la connexion ça fera une erreur du style "500 OOPS: bad bool value in config file for:" suivi du nom de l'option ou il y a l'espace en fin de ligne, en le supprimant tout revient dans l'ordre.

Gérer les droits des utilisateurs virtuels

Par défaut les utilisateurs virtuels n'ont aucun droit, il faut donc les définir pour chacun d'entre eux :

Pour celà il faut créer un fichier de configuration pour chacun de vos utilisateurs dans le dossier /etc/vsftpd/vsftpd_user_conf/
Par exemple pour 'util1' il faut configurer le fichier /etc/vsftpd/vsftpd_user_conf/util1

Exemple de fichier :

## l'utilisateur est enfermé dans un dossier déterminé
local_root=/chemin_du_dossier/

## droit de lecture(download)
anon_world_readable_only=NO

## droit d'écriture(upload)
write_enable=YES
anon_upload_enable=YES

## créer des dossiers
anon_mkdir_write_enable=YES

## droit de renommer, supprimer...
anon_other_write_enable=YES

Script pour automatiser la création/suppression d'utilisateurs virtuels

Pour utiliser ce script, il suffit de modifier votre fichier /etc/vsftpd/login.txt afin de rajouter ou de supprimer des utilisateurs virtuels puis de l'exécuter:

sudo sh "nom_du_script"

Ce script donne tous les droits à chacun de vos utilisateurs virtuels et ne supprime pas le dossier d'un utilisateur lors de sa suppression de la base de données.
Libre à vous de modifier ce script ou de changer les droits utilisateurs dans vos fichiers de configuration.

#!/bin/bash

USER_CONFIG_DIR=/etc/vsftpd/vsftpd_user_conf

## Création du fichier de diff
diff /etc/vsftpd/.login_tmp.txt /etc/vsftpd/login.txt | grep "<"|tr -s "<" " "  >> /etc/vsftpd/login_diff.txt
db4.4_load -T -t hash -f /etc/vsftpd/login_diff.txt /etc/vsftpd/login_diff.db
chmod 600 /etc/vsftpd/login_diff.db

## Sauvegarde du fichier login.txt
cp /etc/vsftpd/login.txt /etc/vsftpd/.login_tmp.txt

## Création du fichier db utilisateurs
rm /etc/vsftpd/login.db
db4.4_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
chmod 600 /etc/vsftpd/login.db

## Pour tous les noms figurant dans la base de données:
        for user in ` db4.4_dump -p /etc/vsftpd/login.db | sed -n 's/^ //p' | sed -n '1,${p;n;}' `
          do
          ## Création des répertoires personnels pour les utilisateurs virtuels
          if [ ! -d /home/ftp/$user ]; then
              echo "$0: ajout du répertoire personnel /home/ftp/$user pour l'utilisateur virtuel '$user'"
              mkdir -p /home/ftp/$user/
              chmod 770 /home/ftp/$user/
	      chown ftp:nogroup /home/ftp/$user/
          else
              echo "$0[warning]: /home/ftp/$user: omission, ce répertoire existe déja."
          fi
          ## Chrootage des utilisateurs virtuels
          if ! grep -q "^local_root=" $USER_CONFIG_DIR/$user 2>/dev/null; then
              echo "$0: on chroote '$user'"
              echo "local_root=/home/ftp/$user" >> $USER_CONFIG_DIR/$user
	      echo "anon_world_readable_only=NO" >>  $USER_CONFIG_DIR/$user
	      echo "write_enable=YES" >>  $USER_CONFIG_DIR/$user
              echo "anon_upload_enable=YES" >>  $USER_CONFIG_DIR/$user
              echo "anon_mkdir_write_enable=YES" >>  $USER_CONFIG_DIR/$user
              echo "anon_other_write_enable=YES" >>  $USER_CONFIG_DIR/$user
          else
              echo "$0[warning]: $USER_CONFIG_DIR/$user: '$user' est déjà chrooté."
          fi
        done
    
## Suppression des configurations personnelles pour les utilisateurs virtuels
for user in ` db4.4_dump -p /etc/vsftpd/login_diff.db | sed -n 's/^ //p' | sed -n '1,${p;n;}' `
            do
                echo "$0: suppression de la configuration personnelle pour l'utilisateur virtuel '$user'"
                rm -rf /etc/vsftpd/vsftpd_user_conf/$user
            done

## Suppression des fichiers temporaires
rm /etc/vsftpd/login_diff.txt
rm /etc/vsftpd/login_diff.db

( Tuto "utilisateurs virtuels" librement inspiré par http://www.andesi.org/index.php?node=121#A11 )

man officiel

Les clients qui supportent ssl

Sous Windows

FileZilla ou smartFtP option : "FTP over TLS Explicit"

FlashFXP option : "Auth TLS"

Sous MacOS X

CyberDuck option "FTP-SSL (FTP over SSL/TLS)"

Sous Linux

ftp-ssl - Le client ftp avec chiffrement SSL ou TLS ftp (sait gérer avec et sans chiffrement)

kasablanca - Kasablanca est un client graphique FTP. Parmi ses fonctions, on peut citer le support du chiffrement (par autentification TLS, et non SFTP),FXP (accès direct entre deux serveurs FTP,un gestionnaire de signets et un système de mise en queue. - Tourne sous Kde (mais aussi sous gnome avec les lib Kde) home page

Kftpgrabber (FTP utilisant TLS/SSL explicite et implicite)

gftp sous Debian/Ubuntu ne supporte pas ssl bug report Par contre, il supporte parfaitement le SFTP (selectionner SSH2 à la place de FTP), qui ne pose pas les problèmes de license de SSL.

FireFTP, extension pour Firefox

Filezilla, ftp-ssl sous ubuntu, et... si vous en connaissez un autre —> "Editer" :-D


Contributeur : ju,sginer,placisfos,snoopy_p


vsftpd.txt · Dernière modification: Le 26/05/2008, à 10:08 par 82.233.119.142, 213.95.41.13
Le contenu de ce wiki est sous double licence : CC BY-SA et GNU FDL