Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
vsftpd [Le 15/07/2015, 12:14] – [500 OOPS: vsftpd: refusing to run with writable root inside chroot()] 86.214.194.254 | vsftpd [Le 13/10/2020, 13:26] (Version actuelle) – L'Africain | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | <note warning> | ||
+ | Je n'ai pas tout vérifié en détail mais je vous conseille de vérifier les paramètres donnés avec le man du site officiel!</ | ||
+ | |||
+ | ====== Préambule : FTP et " | ||
+ | |||
+ | 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 contrôle et un canal de données (par défaut, port 21 en destination pour le canal contrôle). | ||
+ | |||
+ | 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' | ||
+ | |||
+ | La proximité des acronymes prête en effet à confusion ! | ||
+ | |||
+ | En effet, SFTP n'est nullement basé sur FTP, mais sur SSH ! Il fait d' | ||
+ | |||
+ | 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' | ||
+ | |||
+ | D'où 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' | ||
+ | |||
+ | ===== Serveur FTP : Very secure FTP daemon ===== | ||
+ | |||
+ | 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 majeure de sécurité n'a jamais été décelée dans VsFTPd. | ||
+ | |||
+ | Néanmoins deux [[http:// | ||
+ | |||
+ | Ce serveur est utilisé à grande échelle, notamment par des entreprises telles que Red Hat. | ||
+ | |||
+ | La configuration __par défaut__ de VsFTPd est très restrictive : | ||
+ | |||
+ | - Seul le compte **anonyme** est autorisé à se connecter au serveur | ||
+ | - En **lecture seule** | ||
+ | - Les **utilisateurs** ne peuvent pas accéder à leurs répertoires | ||
+ | < | ||
+ | Aussi sécurisé que soit un serveur ftp, le protocole ftp en lui même **n' | ||
+ | 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' | ||
+ | |||
+ | |||
+ | |||
+ | ===== Installation ===== | ||
+ | |||
+ | [[: | ||
+ | |||
+ | Il est parfois nécessaire de créer un compte ftp, l' | ||
+ | <code bash> | ||
+ | Pensez à redémarrer le service : | ||
+ | <code bash> | ||
+ | sudo systemctl enable vsftpd</ | ||
+ | Et à ouvrir les ports de votre pare-feu si nécessaire : | ||
+ | <code bash> | ||
+ | sudo ufw allow 21/tcp | ||
+ | sudo ufw status</ | ||
+ | ===== Configuration de vsftpd ===== | ||
+ | |||
+ | La configuration de VsFTPd est centralisée dans un seul et même fichier **/ | ||
+ | |||
+ | ==== Configuration de base ==== | ||
+ | * Vous pouvez personnaliser le texte de connexion au serveur : <file bash> | ||
+ | |||
+ | * Pour permettre des utilisateurs anonymes de se connecter au serveur en lecture seule : <file bash> | ||
+ | anonymous_enable=YES | ||
+ | anon_upload_enable=NO | ||
+ | anon_mkdir_write_enable=NO | ||
+ | anon_other_write_enable=NO | ||
+ | anon_world_readable_only=YES | ||
+ | anon_root=< | ||
+ | </ | ||
+ | * Pour permettre à vos utilisateurs locaux (ceux qui ont un compte sur la machine) de se connecter au serveur et d' | ||
+ | write_enable=YES | ||
+ | local_umask=022</ | ||
+ | * Pour permettre à vsftpd de charger une liste d' | ||
+ | Il faudra alors ajouter le nom des utilisateurs qui auront les accès dans le fichier **etc/ | ||
+ | |||
+ | * Vous pouvez « emprisonner » certains utilisateurs dans leur dossier personnel afin qu'il ne puissent pas naviguer dans le système de fichier. | ||
+ | Il faut créer le fichier dédié à la configuration de vsftpd **/ | ||
+ | |||
+ | Les identifiants des utilisateurs concernés doivent être renseignés dans /// | ||
+ | utilisateur_2 | ||
+ | ...</ | ||
+ | |||
+ | Il faut ensuite modifier la configuration générale (/ | ||
+ | <file bash> | ||
+ | # Pas besoin d' | ||
+ | chroot_local_user=NO | ||
+ | # Emprisonner dans son répertoire home les utilisateurs | ||
+ | chroot_list_enable=YES | ||
+ | # La lise des prisonniers | ||
+ | chroot_list_file=/ | ||
+ | # Evite l' | ||
+ | # Les prisonniers peuvent écrire dans leur propre répertoire | ||
+ | allow_writeable_chroot=YES | ||
+ | </ | ||
+ | <note important> | ||
+ | |||
+ | ==== Configuration avancée ==== | ||
+ | |||
+ | Si vous voulez changer le port pour transmettre les commandes qui est par défaut (21) : | ||
+ | < | ||
+ | |||
+ | * Pour avoir un monitoring | ||
+ | < | ||
+ | |||
+ | | ||
+ | <code bash>ps -aef | grep vsftpd</ | ||
+ | |||
+ | ou pour suivre les connexions en continu : | ||
+ | <code bash> | ||
+ | |||
+ | | ||
+ | |||
+ | * Monitoring d' | ||
+ | |||
+ | 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 / | ||
+ | |||
+ | Après chaque changement sur la configuration, | ||
+ | |||
+ | sudo service vsftpd reload | ||
+ | |||
+ | Plus d' | ||
+ | |||
+ | |||
+ | |||
+ | ==== 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' | ||
+ | ln pour faire un lien symbolique ne fonctionne pas : problème de droit.\\ | ||
+ | La commande à utiliser est mount avec l' | ||
+ | |||
+ | < | ||
+ | sudo mount --bind < | ||
+ | |||
+ | Si vous souhaitez monter ce dossier automatiquement au démarrage de l' | ||
+ | |||
+ | < | ||
+ | |||
+ | et y ajouter cette ligne : | ||
+ | |||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== vsftpd et SSL ===== | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | Le principal défaut du protocole FTP est que le couple nom d' | ||
+ | |||
+ | Le fichier **/ | ||
+ | |||
+ | === Création du certificat === | ||
+ | |||
+ | Il vous faut [[: | ||
+ | |||
+ | sudo openssl req -new -x509 -days 365 -nodes -out / | ||
+ | |||
+ | 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 autorité de certification et donc générer des certificats valides, une fois que vos clients ont reconnu votre autorité de certification : [[http:// | ||
+ | |||
+ | Un certificat (vsftpd.cert.pem) ainsi qu'une clé privée (vsftpd.key.pem) ont été générés dans le dossier / | ||
+ | Sécurisons-les : | ||
+ | sudo chown root:root / | ||
+ | sudo chmod 600 / | ||
+ | |||
+ | < | ||
+ | |||
+ | === Configuration de vsftpd.conf / Partie SSL === | ||
+ | |||
+ | À la fin de votre fichier **/ | ||
+ | |||
+ | < | ||
+ | # Options for SSL | ||
+ | # encrypted connections. | ||
+ | |||
+ | ssl_enable=YES | ||
+ | allow_anon_ssl=NO | ||
+ | force_local_data_ssl=NO | ||
+ | force_local_logins_ssl=YES | ||
+ | # require_ssl_reuse=NO # Certains clients FTP nécessitent cette ligne | ||
+ | |||
+ | ssl_tlsv1=YES | ||
+ | ssl_sslv2=YES | ||
+ | ssl_sslv3=YES | ||
+ | |||
+ | rsa_cert_file=/ | ||
+ | rsa_private_key_file=/ | ||
+ | </ | ||
+ | force_local_data_ssl=NO | ||
+ | A priori, un : | ||
+ | sudo service vsftpd reload | ||
+ | devrait bien se passer. | ||
+ | |||
+ | === Configuration du serveur pour un accès à partir d' | ||
+ | |||
+ | 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 **/ | ||
+ | |||
+ | < | ||
+ | pasv_enable=YES | ||
+ | pasv_promiscuous=NO | ||
+ | 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_enable** Utilisez cette option pour activer le mode passif. | ||
+ | |||
+ | **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 à cela est dans un environnement de tunnels sécurisés, | ||
+ | Défaut: NO | ||
+ | |||
+ | **pasv_address** Utilisez cette option pour écraser l' | ||
+ | |||
+ | [On peut toutefois lui donner un nom de domaine en lui ajoutant l' | ||
+ | pasv_addr_resolve=YES.] | ||
+ | |||
+ | Cette option est par défaut à NON: L' | ||
+ | |||
+ | **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' | ||
+ | |||
+ | sudo ufw allow proto tcp to any port 40000:40100 | ||
+ | sudo ufw allow proto udp to any port 40000:40100 | ||
+ | |||
+ | Il vous reste : | ||
+ | 1- à redémarrer le serveur avec la commande suivante | ||
+ | |||
+ | < | ||
+ | </ | ||
+ | |||
+ | 2- puis éventuellement configurez votre routeur (e.g. Freebox) pour que cette même plage de ports (TCP:40000 à TCP:40100) soit redirigée vers l' | ||
+ | |||
+ | 3- 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) | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | ===== 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 cela nous allons créer des dossiers afin d'y placer nos futurs fichiers de configuration: | ||
+ | |||
+ | < | ||
+ | sudo mkdir -p / | ||
+ | </ | ||
+ | |||
+ | Sauvegardons nos fichiers de configuration actuels : | ||
+ | |||
+ | < | ||
+ | sudo cp / | ||
+ | sudo cp / | ||
+ | </ | ||
+ | |||
+ | ====Créer la base de données des utilisateurs virtuels==== | ||
+ | |||
+ | <note tip>Vous allez avoir maintenant besoin d' | ||
+ | |||
+ | <note tip>Si les paquets sont introuvables, | ||
+ | |||
+ | Création du fichier PAM : | ||
+ | Il faut effacer le contenu du fichier **/ | ||
+ | |||
+ | < | ||
+ | auth required / | ||
+ | account required / | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | < | ||
+ | auth required / | ||
+ | account required / | ||
+ | </ | ||
+ | Sinon il risque d' | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | < | ||
+ | auth required / | ||
+ | account required / | ||
+ | </ | ||
+ | Sinon il risque d' | ||
+ | </ | ||
+ | |||
+ | Créons un fichier **login.txt** dans **/ | ||
+ | |||
+ | < | ||
+ | util1 | ||
+ | mdp1 | ||
+ | util2 | ||
+ | mdp2 | ||
+ | </ | ||
+ | |||
+ | Les 2 utilisateurs sont donc ici '' | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | Il faut maintenant le convertir au format " | ||
+ | |||
+ | < | ||
+ | sudo db4.8_load -T -t hash -f / | ||
+ | </ | ||
+ | |||
+ | on sécurise nos fichiers : | ||
+ | |||
+ | < | ||
+ | sudo chmod 600 / | ||
+ | </ | ||
+ | ====Configuration du fichier / | ||
+ | |||
+ | <file bash> | ||
+ | # Ceci configure vsFTPd en mode " | ||
+ | listen=YES | ||
+ | |||
+ | # On désactive les connexions anonymes | ||
+ | # et on active les non-anonymes(c' | ||
+ | anonymous_enable=NO | ||
+ | local_enable=YES | ||
+ | |||
+ | # Pour des raisons de sécurité on interdit toute action d' | ||
+ | write_enable=NO | ||
+ | anon_upload_enable=NO | ||
+ | anon_mkdir_write_enable=NO | ||
+ | anon_other_write_enable=NO | ||
+ | |||
+ | # ' | ||
+ | # ' | ||
+ | # l' | ||
+ | # correspondant: | ||
+ | guest_enable=YES | ||
+ | guest_username=ftp | ||
+ | |||
+ | # On veut que les utilisateurs virtuels restent chez eux: '/ | ||
+ | chroot_local_user=YES | ||
+ | |||
+ | # On défini le nombre maximum de sessions à 200(les nouveaux clients recevront | ||
+ | # un message du genre: " | ||
+ | # On défini le nombre maximum de sessions par IP à 4 | ||
+ | max_clients=200 | ||
+ | max_per_ip=4 | ||
+ | |||
+ | #################################### | ||
+ | # Debian customization | ||
+ | #################################### | ||
+ | # Some of vsftpd' | ||
+ | # default. | ||
+ | # | ||
+ | # This option should be the name of a directory which is empty. | ||
+ | # 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=/ | ||
+ | # | ||
+ | # 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=/ | ||
+ | |||
+ | |||
+ | ## Activer la configuration per-user | ||
+ | user_config_dir=/ | ||
+ | </ | ||
+ | |||
+ | Relançons le serveur : | ||
+ | |||
+ | < | ||
+ | sudo / | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | ==== 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' | ||
+ | |||
+ | Pour celà il faut créer un fichier de configuration pour chacun de vos utilisateurs dans le dossier **/ | ||
+ | Par exemple pour ' | ||
+ | |||
+ | Exemple de fichier : | ||
+ | |||
+ | < | ||
+ | ## l' | ||
+ | local_root=/ | ||
+ | |||
+ | ## on ne souhaite pas de lecture seule (Lecture seulement) | ||
+ | anon_world_readable_only=NO | ||
+ | |||
+ | ## droit d' | ||
+ | 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 | ||
+ | |||
+ | ## pour gérer le chmod de l' | ||
+ | ## activer l' | ||
+ | virtual_use_local_privs=YES | ||
+ | ## définir l' | ||
+ | local_umask=022 | ||
+ | anon_umask=022 | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | ## Activer la configuration per-user | ||
+ | user_config_dir=/ | ||
+ | à la fin du fichier / | ||
+ | 1 | ||
+ | ==== Script pour automatiser la création/ | ||
+ | |||
+ | < | ||
+ | sudo sh " | ||
+ | </ | ||
+ | |||
+ | Ce scripte 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=/ | ||
+ | |||
+ | ## Création du fichier de diff | ||
+ | diff / | ||
+ | db4.7_load -T -t hash -f / | ||
+ | chmod 600 / | ||
+ | |||
+ | ## Sauvegarde du fichier login.txt | ||
+ | cp / | ||
+ | |||
+ | ## Création du fichier db utilisateurs | ||
+ | rm / | ||
+ | db4.7_load -T -t hash -f / | ||
+ | chmod 600 / | ||
+ | |||
+ | ## Pour tous les noms figurant dans la base de données: | ||
+ | for user in ` db4.7_dump -p / | ||
+ | do | ||
+ | ## Création des répertoires personnels pour les utilisateurs virtuels | ||
+ | if [ ! -d / | ||
+ | echo ": ajout du répertoire personnel / | ||
+ | mkdir -p / | ||
+ | chmod 770 / | ||
+ | chown ftp:nogroup / | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | ## Mise en place chroot des utilisateurs virtuels | ||
+ | if ! grep -q " | ||
+ | echo ": on chroote ' | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | done | ||
+ | | ||
+ | ## Suppression des configurations personnelles pour les utilisateurs virtuels | ||
+ | for user in ` db4.7_dump -p / | ||
+ | do | ||
+ | echo ": suppression de la configuration personnelle pour l' | ||
+ | rm -rf / | ||
+ | done | ||
+ | |||
+ | ## Suppression des fichiers temporaires | ||
+ | rm / | ||
+ | rm / | ||
+ | </ | ||
+ | |||
+ | D' | ||
+ | [[http:// | ||
+ | |||
+ | ( Tuto " | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | ===Les clients qui supportent ssl=== | ||
+ | |||
+ | == Sous Windows== | ||
+ | * FileZilla ou smartFtP option : "FTP over TLS Explicit" | ||
+ | * Winscp | ||
+ | * CoreFTP Lite | ||
+ | * FlashFXP option : "Auth TLS" | ||
+ | |||
+ | == Sous Mac OS X == | ||
+ | * CyberDuck option " | ||
+ | * Transmit (SSL implicite ou TLS/SSL) | ||
+ | |||
+ | ==Sous Linux== | ||
+ | * ftp-ssl - Le client ftp avec chiffrement SSL ou TLS | ||
+ | * ftp (sans chiffrement) | ||
+ | * lftp [[http:// | ||
+ | * kasablanca - Kasablanca est un client graphique FTP. Parmi ses fonctions, on peut citer le support du chiffrement (par authentification TLS, et non SFTP),FXP (accès direct entre deux serveurs FTP,un gestionnaire de signets et un système de mise en queue. | ||
+ | | ||
+ | * Kftpgrabber (FTP utilisant TLS/SSL explicite et implicite) | ||
+ | * gftp sous Debian/ | ||
+ | Par contre, il supporte parfaitement le SFTP (selectionner SSH2 à la place de FTP), qui ne pose pas les problèmes de licence de SSL. | ||
+ | |||
+ | * FireFTP, extension pour Firefox | ||
+ | |||
+ | * Filezilla, | ||
+ | * Nautilus, | ||
+ | * gftp sous ubuntu, | ||
+ | * et... si vous en connaissez un autre ---> " | ||
+ | |||
+ | |||
+ | ===== Problèmes courants ===== | ||
+ | |||
+ | ==== 500 OOPS: vsftpd: refusing to run with writable root inside chroot() ==== | ||
+ | |||
+ | La version 2.3.5 de vsftpd contient une sécurité qui empêche l' | ||
+ | |||
+ | Une des raison de cette sécurité est décrite [[https:// | ||
+ | |||
+ | === Retirer l' | ||
+ | |||
+ | La solution préférable d'un point de vue sécurité consiste à suivre la recommandation de vsftp et de supprimer l' | ||
+ | |||
+ | Ainsi, pour la configuration proposée plus haut pour les utilisateurs virtuels, il suffit d' | ||
+ | |||
+ | $ ls -ld / | ||
+ | dr-xr-xr-x 3 ftp ftp 4096 févr. | ||
+ | |||
+ | $ ls -ld / | ||
+ | drwxr-xr-x 2 ftp ftp 4096 févr. | ||
+ | |||
+ | Les utilisateurs ne peuvent pas écrire dans le dossier racine / | ||
+ | |||
+ | === Forcer vsftp à passer outre la protection par défaut === | ||
+ | |||
+ | Il est possible de forcer vsftp à démarrer même avec une racine accessible en lecture via le fichier / | ||
+ | |||
+ | allow_writeable_chroot=YES | ||
+ | |||
+ | et redémarrer Vsftpd | ||
+ | |||
+ | $ service vsftpd restart | ||
+ | |||
+ | ====Voir aussi==== | ||
+ | * [[https:// | ||
+ | ---- | ||
+ | |||
+ | // | ||