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 | ||
| logiciel:reseau:ftp:serveur:vsftpd:start [2024/09/21 13:41] – supprimée - modification externe (Unknown date) 127.0.0.1 | logiciel:reseau:ftp:serveur:vsftpd:start [2024/09/21 13:41] (Version actuelle) – ↷ Liens modifiés en raison d'un déplacement. admin | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | {{tag> | ||
| + | ====== VSFTPd - un serveur FTP sécurisé avec des utilisateurs virtuels ====== | ||
| + | |||
| + | **vsftpd** est un serveur FTP stable, sécurisé et rapide. | ||
| + | |||
| + | Nous allons l' | ||
| + | * Seuls les utilisateurs locaux sont autorisés à se connecter au serveur | ||
| + | * En lecture seule | ||
| + | * Les utilisateurs ne peuvent pas accéder à leurs répertoires | ||
| + | * Les options seront réglées utilisateur par utilisateur | ||
| + | * les utilisateurs seront restreints à leur répertoire d' | ||
| + | * les transmissions seront cryptées avec un certificat auto-signé SSLTLS. | ||
| + | * nous utiliserons le paramétrage par **utilisateurs virtuels**, avec une base de données de type **Berkeley**.\\ Chaque enregistrement n’est constitué que d'un login et d'un mot de passe.\\ Pour créer un nouvel utilisateur, | ||
| + | * une entrée dans la base Berkeley | ||
| + | * et un fichier de configuration personnel. | ||
| + | |||
| + | Quatre scénarios illustreront les possibilités. | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | Le protocole FTP en lui même n'est pas sûr ! | ||
| + | |||
| + | L' | ||
| + | |||
| + | N' | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | Nous supposons que le serveur sera sur le disque $DISQUE=**/ | ||
| + | </ | ||
| + | |||
| + | ===== Pré-requis ===== | ||
| + | |||
| + | ===== Installation ===== | ||
| + | |||
| + | < | ||
| + | - **Mettez à jour** :<cli prompt=' | ||
| + | - **Installez les paquets** :<cli prompt=' | ||
| + | - **Vérifiez** avec le programme **ftp** : | ||
| + | - Acceptez le nom d' | ||
| + | - Pour sortir du ftp : **bye** | ||
| + | - Avec la configuration d' | ||
| + | - avec un utilisateur (**pi**) disposant réellement d’un compte sur la machine serveur | ||
| + | - mais **pas en anonyme** (impossible de se connecter avec l' | ||
| + | - un ls confirme que le dossier racine est le home (**/ | ||
| + | Connected to localhost. | ||
| + | 220 (vsFTPd 3.0.3) | ||
| + | <cli prompt=': | ||
| + | 331 Please specify the password. | ||
| + | Password: </ | ||
| + | 230 Login successful. | ||
| + | Remote system type is UNIX. | ||
| + | Using binary mode to transfer files. | ||
| + | <cli prompt='> | ||
| + | 200 PORT command successful. Consider using PASV. | ||
| + | 150 Here comes the directory listing. | ||
| + | ... | ||
| + | drwxr-xr-x | ||
| + | ... | ||
| + | 226 Directory send OK. | ||
| + | ftp> bye</ | ||
| + | 221 Goodbye. | ||
| + | <cli prompt=' | ||
| + | - **depuis un PC du réseau**, en vous connectant avec un logiciel comme FileZilla, avec un user/ | ||
| + | - vous pouvez : | ||
| + | - vous déplacer dans toute la machine serveur, y compris la racine | ||
| + | - télécharger un fichier depuis le serveur | ||
| + | - mais pas : | ||
| + | - y écrire ou téléverser un fichier | ||
| + | - ni créer un répertoire | ||
| + | - ni effacer un fichier ou un répertoire | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | < | ||
| + | - **L' | ||
| + | ftp: | ||
| + | - Si ce n'est pas le cas, créez-les :<cli prompt=' | ||
| + | - Si l' | ||
| + | - **Et l' | ||
| + | www-data: | ||
| + | </ | ||
| + | </ | ||
| + | ===== Configuration ===== | ||
| + | |||
| + | Le fichier de configuration du serveur est **[[logiciel: | ||
| + | |||
| + | Voir la page de man **[[logiciel: | ||
| + | |||
| + | < | ||
| + | - **Créez le répertoire / | ||
| + | USER@MACHINE: | ||
| + | - **Sauvegardez les fichiers de configuration** originaux :<cli prompt=' | ||
| + | USER@MACHINE: | ||
| + | USER@MACHINE: | ||
| + | - **créez un emplacement pour la racine du serveur** : | ||
| + | - **Créez le répertoire < | ||
| + | - **Éditez avec les droits d' | ||
| + | - **Montez /srv** :<cli prompt=' | ||
| + | </ | ||
| + | |||
| + | ==== Configuration par défaut ==== | ||
| + | |||
| + | Éditez avec les droits d' | ||
| + | < | ||
| + | - **Paramètres généraux** :<code - / | ||
| + | ... | ||
| + | ########## Paramètres personnalisés ########## | ||
| + | ftpd_banner=Bienvenue sur le serveur FTP de ... | ||
| + | |||
| + | # un message apparaît chaque fois | ||
| + | # qu'un utilisateur ouvre un répertoire avec un fichier .message | ||
| + | dirmessage_enable=YES | ||
| + | |||
| + | # heure locale de l' | ||
| + | use_localtime=YES | ||
| + | |||
| + | # Nombre maximum de connexions simultanées | ||
| + | # | ||
| + | # " | ||
| + | max_clients=200 | ||
| + | # Nombre maximum de connexions venant de la même IP | ||
| + | max_per_ip=4 | ||
| + | |||
| + | # journalisation des transferts | ||
| + | xferlog_enable=YES | ||
| + | </ | ||
| + | - **Utilisateurs virtuels** :<code - / | ||
| + | # Activation des utilisateurs virtuels | ||
| + | guest_enable=YES | ||
| + | # nom de l' | ||
| + | # tous les utilisateurs virtuels -> utilisateur ftp avec son home /srv/ftp | ||
| + | ftp_username=ftp | ||
| + | guest_username=ftp | ||
| + | nopriv_user=ftp | ||
| + | |||
| + | # Fichier de config PAM | ||
| + | pam_service_name=vsftpd | ||
| + | </ | ||
| + | - **Connexion et contrôle d' | ||
| + | # Pas d' | ||
| + | # (dont les utilisateurs virtuels, mappés sur un utilisateur local) | ||
| + | # les vrais utilisateurs locaux sont désactivés avec le fichier user_list | ||
| + | anonymous_enable=NO | ||
| + | local_enable=YES | ||
| + | |||
| + | # On refuse les utilisateurs du fichier / | ||
| + | # un utilisateur par ligne | ||
| + | userlist_enable=YES | ||
| + | userlist_deny=NO | ||
| + | userlist_file=/ | ||
| + | |||
| + | # Les utilisateurs locaux restent chez eux | ||
| + | chroot_local_user=YES | ||
| + | allow_writeable_chroot=YES | ||
| + | </ | ||
| + | - **Permissions** :<code - / | ||
| + | # Interdiction de toute action d' | ||
| + | # On spécifiera les droits utilisateur par utilisateur. | ||
| + | write_enable=NO | ||
| + | anon_mkdir_write_enable=NO | ||
| + | anon_other_write_enable=NO | ||
| + | anon_upload_enable=NO | ||
| + | anon_world_readable_only=NO | ||
| + | |||
| + | # droits par défaut des fichiers uploadés | ||
| + | anon_umask=002 | ||
| + | |||
| + | # Autoriser les utilisateurs locaux | ||
| + | # à changer les permissions des fichiers | ||
| + | chmod_enable=YES | ||
| + | virtual_use_local_privs=YES | ||
| + | |||
| + | # On n’autorise pas les utilisateurs à se faire passer pour d’autres | ||
| + | chown_uploads=NO | ||
| + | chown_username=nobody | ||
| + | |||
| + | # Cacher les informations sur le propriétaire des fichiers (utilisateur et groupe) | ||
| + | hide_ids=YES | ||
| + | |||
| + | # Activation de la configuration utilisateur par utilisateur | ||
| + | user_config_dir=/ | ||
| + | </ | ||
| + | - **Sécurisation des transmissions avec SSL/TLS** :<code - / | ||
| + | rsa_cert_file=/ | ||
| + | rsa_private_key_file=/ | ||
| + | ssl_enable=YES | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Utilisateurs virtuels ==== | ||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | Nous allons créer trois utilisateurs virtuels : | ||
| + | < | ||
| + | - **admin**, qui aura accès à tout **/srv** sous l' | ||
| + | - **user**, qui ne pourra que télécharger sous l' | ||
| + | - **admiweb**, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | - **Éditez avec les droits d' | ||
| + | admin | ||
| + | MotDePasseAdmin | ||
| + | user | ||
| + | MotDePasseUser | ||
| + | admiweb | ||
| + | MotDePasseAdmiweb | ||
| + | |||
| + | </ | ||
| + | - **Créez la base de données** :<cli prompt=' | ||
| + | - **Protégez ces fichiers** contre une intrusion :<cli prompt=' | ||
| + | Pour ajouter, modifier ou supprimer un utilisateur il faut éditer le fichier login.txt puis relancer la création de la base avec la commande du paragraphe 2. | ||
| + | </ | ||
| + | - **Éditez avec les droits d' | ||
| + | auth required pam_userdb.so db=/ | ||
| + | account required pam_userdb.so db=/ | ||
| + | </ | ||
| + | - **Redémarrez** le serveur :<cli prompt=' | ||
| + | - **Vérification** : | ||
| + | - pi ne peut plus se connecter :<cli prompt=' | ||
| + | Connected to localhost. | ||
| + | 220 Bienvenue sur le serveur FTP de xxx | ||
| + | <cli prompt=': | ||
| + | 331 Please specify the password. | ||
| + | Password: </ | ||
| + | 530 Login incorrect. | ||
| + | Login failed. | ||
| + | <cli prompt='> | ||
| + | 221 Goodbye.</ | ||
| + | - mais admiweb le peut :<cli prompt=' | ||
| + | Connected to localhost. | ||
| + | 220 Bienvenue sur le serveur FTP de xxx | ||
| + | <cli prompt=': | ||
| + | 331 Please specify the password. | ||
| + | Password: </ | ||
| + | 230 Login successful. | ||
| + | Remote system type is UNIX. | ||
| + | Using binary mode to transfer files. | ||
| + | <cli prompt='> | ||
| + | 221 Goodbye.</ | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip 60%> | ||
| + | **Deux scripts pour se faciliter la vie** | ||
| + | < | ||
| + | - **txt2db.sh** régénère le fichier .db et crée un fichier de config vide s'il n' | ||
| + | #!/bin/sh | ||
| + | if [ $# = " | ||
| + | rm -f $2 | ||
| + | db_load -T -t hash -f / | ||
| + | chmod 600 / | ||
| + | echo "Base créée" | ||
| + | lignes=$(cat $1) | ||
| + | nb=1 | ||
| + | for ligne in $lignes | ||
| + | do | ||
| + | if [ $(($nb%2)) -ne 0 ]; | ||
| + | then | ||
| + | if [ ! -e / | ||
| + | then | ||
| + | touch / | ||
| + | echo " | ||
| + | fi | ||
| + | fi | ||
| + | nb=$(($nb+1)) | ||
| + | done | ||
| + | else | ||
| + | echo "Il faut donner le fichier d’entrée et le fichier de sortie" | ||
| + | fi | ||
| + | </ | ||
| + | ...@...:~$ sudo ./txt2db.sh login.txt login.db</ | ||
| + | - Le script **cleanconf.sh** supprime tous les fichiers qui n'ont pas de login associé (utilisateurs supprimés) :<code bash ~/ | ||
| + | fichiers=$(ls / | ||
| + | users="" | ||
| + | lignes=$(cat / | ||
| + | nb=1 | ||
| + | for ligne in $lignes | ||
| + | do | ||
| + | if [ $(($nb%2)) -ne 0 ]; | ||
| + | then | ||
| + | | ||
| + | fi | ||
| + | nb=$(($nb+1)) | ||
| + | done | ||
| + | for conf in $fichiers | ||
| + | do | ||
| + | found=0 | ||
| + | for user in $users | ||
| + | do | ||
| + | if [ $conf = $user ]; | ||
| + | then | ||
| + | found=" | ||
| + | fi | ||
| + | done | ||
| + | if [ $found != " | ||
| + | then | ||
| + | rm -f / | ||
| + | echo " | ||
| + | fi | ||
| + | done | ||
| + | </ | ||
| + | ...@...:~$ sudo ./ | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Personnalisation pour chaque utilisateur ==== | ||
| + | |||
| + | Par défaut les utilisateurs virtuels n'ont aucun droit. | ||
| + | |||
| + | Il faut donc les définir pour chacun d' | ||
| + | |||
| + | Chaque fichier contient des paramètres (les mêmes que ceux de vsftpd.conf) qui remplaceront ceux de vsftpd.conf. | ||
| + | |||
| + | Généralement, | ||
| + | |||
| + | Voici quelques exemples. | ||
| + | < | ||
| + | - utilisateur **admin** :<code - / | ||
| + | # Racine | ||
| + | local_root=/ | ||
| + | |||
| + | # Lecture autorisée | ||
| + | download_enable=YES | ||
| + | anon_world_readable_only=NO | ||
| + | |||
| + | # Écriture autorisée | ||
| + | write_enable=YES | ||
| + | anon_upload_enable=YES | ||
| + | anon_mkdir_write_enable=YES | ||
| + | |||
| + | # Renommage et suppression autorisés | ||
| + | anon_other_write_enable=YES | ||
| + | |||
| + | # changement des droits autorisé | ||
| + | chmod_enable=YES | ||
| + | virtual_use_local_privs=YES | ||
| + | |||
| + | # Définit à qui appartiendront les fichiers téléversés | ||
| + | guest_username=pi | ||
| + | |||
| + | # Affichage des fichiers cachés | ||
| + | # | ||
| + | force_dot_files=YES | ||
| + | |||
| + | # masque local (002 -> droits 775) | ||
| + | local_umask=002 | ||
| + | anon_umask=002 | ||
| + | </ | ||
| + | - utilisateur **admiweb** :<code - / | ||
| + | # Racine | ||
| + | local_root=/ | ||
| + | |||
| + | # Lecture autorisée | ||
| + | download_enable=YES | ||
| + | anon_world_readable_only=NO | ||
| + | |||
| + | # Écriture (upload) autorisée | ||
| + | write_enable=YES | ||
| + | anon_upload_enable=YES | ||
| + | anon_mkdir_write_enable=YES | ||
| + | |||
| + | # Renommage et suppression autorisés | ||
| + | anon_other_write_enable=YES | ||
| + | |||
| + | # changement des droits autorisé | ||
| + | chmod_enable=YES | ||
| + | virtual_use_local_privs=YES | ||
| + | |||
| + | # Définit à qui appartiendront les fichiers téléversés | ||
| + | guest_username=www-data | ||
| + | chown_uploads=YES | ||
| + | chown_username=www-data | ||
| + | |||
| + | # Affichage des fichiers cachés | ||
| + | # | ||
| + | force_dot_files=YES | ||
| + | |||
| + | # masque local (002 -> droits 775) | ||
| + | file_open_mode=0777 | ||
| + | local_umask=002 | ||
| + | anon_umask=002 | ||
| + | </ | ||
| + | - utilisateur **user** : | ||
| + | * Créez le répertoire **< | ||
| + | * puis le fichier <code - / | ||
| + | local_root=/ | ||
| + | </ | ||
| + | - utilisateur **adminftp** :<code - / | ||
| + | ## l' | ||
| + | # en commentant cette ligne, on autorise tout le site | ||
| + | # | ||
| + | |||
| + | ## droit de lecture(download) | ||
| + | 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' | ||
| + | # | ||
| + | ## définir l' | ||
| + | # | ||
| + | # | ||
| + | write_enable=YES | ||
| + | anon_upload_enable=YES | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Redémarrez le serveur pour valider les modifications :<cli prompt=' | ||
| + | |||
| + | ==== Tests ==== | ||
| + | |||
| + | < | ||
| + | - **admin** :<cli prompt=' | ||
| + | Connected to localhost. | ||
| + | 220 Bienvenue sur le serveur FTP de framboise 4. | ||
| + | <cli prompt=': | ||
| + | 331 Please specify the password. | ||
| + | Password: </ | ||
| + | 230 Login successful. | ||
| + | Remote system type is UNIX. | ||
| + | Using binary mode to transfer files. | ||
| + | <cli prompt='> | ||
| + | 221 Goodbye.</ | ||
| + | - connexion possible | ||
| + | - peut lister le répertoire, | ||
| + | - à partir de la racine **/srv** | ||
| + | - **admiweb** :<cli prompt=' | ||
| + | Connected to localhost. | ||
| + | 220 Bienvenue sur le serveur FTP de framboise 4. | ||
| + | <cli prompt=': | ||
| + | 331 Please specify the password. | ||
| + | Password: </ | ||
| + | 230 Login successful. | ||
| + | Remote system type is UNIX. | ||
| + | Using binary mode to transfer files. | ||
| + | <cli prompt='> | ||
| + | 221 Goodbye.</ | ||
| + | - connexion possible | ||
| + | - peut lister le répertoire, | ||
| + | - à partir de la racine **/ | ||
| + | - les fichiers téléversés appartiennent à **www-data** | ||
| + | - **user** :<cli prompt=' | ||
| + | Connected to localhost. | ||
| + | 220 Bienvenue sur le serveur FTP de framboise 4. | ||
| + | <cli prompt=': | ||
| + | 331 Please specify the password. | ||
| + | Password: </ | ||
| + | 230 Login successful. | ||
| + | Remote system type is UNIX. | ||
| + | Using binary mode to transfer files. | ||
| + | <cli prompt='> | ||
| + | 221 Goodbye.</ | ||
| + | - connexion possible | ||
| + | - ne peut que télécharger | ||
| + | - à partir de **/ | ||
| + | - connexion **impossible** pour : | ||
| + | - un **utilisateur réel** de la machine (pi) :<cli prompt=' | ||
| + | ... | ||
| + | <cli prompt=': | ||
| + | 331 Please specify the password. | ||
| + | Password: | ||
| + | 530 Login incorrect. | ||
| + | Login failed.</ | ||
| + | <cli prompt='> | ||
| + | 221 Goodbye.</ | ||
| + | - ni en **anonyme** | ||
| + | </ | ||
| + | |||
| + | ==== Cinq exemples de configuration ==== | ||
| + | |||
| + | Voir la page **[[logiciel: | ||
| + | |||
| + | ===== Utilisation ===== | ||
| + | |||
| + | ==== Gestion du service ==== | ||
| + | |||
| + | Via systemctl :<cli prompt=' | ||
| + | < | ||
| + | - **start** : Démarrer le serveur | ||
| + | - **stop** : Arrêter le serveur | ||
| + | - **restart** : Redémarrer le serveur | ||
| + | - **status** : État du serveur | ||
| + | </ | ||
| + | |||
| + | ==== Se connecter en utilisant le serveur FTP comme un simple dossier ==== | ||
| + | |||
| + | === Sous Ubuntu === | ||
| + | |||
| + | < | ||
| + | - Raccourcis (menu en haut) | ||
| + | - Se connecter à un serveur : | ||
| + | - **type de service** : ftp (avec identification) | ||
| + | - **l' | ||
| + | - **le nom d' | ||
| + | - et < | ||
| + | </ | ||
| + | |||
| + | On peut aussi cocher la case pour créer un signet en le nommant. | ||
| + | |||
| + | On se retrouve avec un dossier distant dans lequel on peut naviguer. | ||
| + | |||
| + | Ne pas oublier de se déconnecter (démonter) | ||
| + | |||
| + | === Sous Windows === | ||
| + | |||
| + | < | ||
| + | - Double-clic sur Favoris réseau | ||
| + | - puis sur Ajouter un favori réseau | ||
| + | - cliquer sur Suivant deux fois de suite | ||
| + | - saisir, dans le champ Adresse réseau ou Internet, la ligne ftp:// | ||
| + | - Suivant | ||
| + | - taper l' | ||
| + | - Suivant | ||
| + | - Terminer. | ||
| + | </ | ||
| + | |||
| + | Désormais, on peut se connecter directement sur le serveur FTP, en : | ||
| + | < | ||
| + | - double-cliquant sur Favoris réseau | ||
| + | - puis sur l' | ||
| + | - et ainsi accéder aux dossiers et fichiers qu'il contient dans la limite des droits accordés. | ||
| + | </ | ||
| + | |||
| + | ===== Désinstallation ===== | ||
| + | |||
| + | < | ||
| + | - **Désinstallation partielle** : Pour désinstaller le serveur vsftpd, en gardant les fichiers de configuration :<cli prompt=' | ||
| + | - **Pour tout remettre à plat** :<cli prompt=' | ||
| + | USER@MACHINE: | ||
| + | USER@MACHINE: | ||
| + | </ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | La remise à plat supprime définitivement des données de votre disque dur ! | ||
| + | |||
| + | Si vous n' | ||
| + | </ | ||
| + | |||
| + | ===== Problèmes connus ===== | ||
| + | |||
| + | ===== Voir aussi ===== | ||
| + | |||
| + | * **(fr)** [[https:// | ||
| + | |||
| + | < | ||
| + | - **VSFTPD** | ||
| + | - Documentation spécifique dans le répertoire **/ | ||
| + | - **(fr)** [[http:// | ||
| + | - **(fr)** [[https:// | ||
| + | - **(fr)** [[https:// | ||
| + | - **(fr)** [[http:// | ||
| + | - **(fr)** [[http:// | ||
| + | - **(en)** [[http:// | ||
| + | - **(en)** Page consacrée à vsFTPd sur freshmeat : [[http:// | ||
| + | - **vsftpd.conf** | ||
| + | - **(en)** Page de manuel : [[http:// | ||
| + | - **(fr)** principales options de vsftpd.conf : [[http:// | ||
| + | - **(fr)** Toutes les directives traduites en français : http:// | ||
| + | - **VSFTPD sur un Raspberry Pi** | ||
| + | - **(en)** [[https:// | ||
| + | - **(fr)** [[http:// | ||
| + | - **(en)** [[https:// | ||
| + | - **Utilisateurs virtuels** | ||
| + | - **(fr)** [[http:// | ||
| + | - **(fr)** Les pages de supinfo : [[http:// | ||
| + | - **(en)** Pour gérer votre db Berkeley : [[http:// | ||
| + | - **(fr)** un mémo, complété d' | ||
| + | - **(fr)** configuration d'un ftp avec utilisateurs virtuels : [[http:// | ||
| + | - **Didacticiels** | ||
| + | - **(fr)** [[http:// | ||
| + | - **(en)** [[ftp:// | ||
| + | - FAQ : | ||
| + | - **(en)** [[ftp:// | ||
| + | - **(fr)** [[logiciel: | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | //Basé sur << [[https:// | ||