Installation du serveur FTP : vsFTPd
#1 Analyse du besoin
Lorsque j'ai installé le serveur Apache, j'ai créé un hôte virtuel et aussi un répertoire tuto-dev-web.fr
qui est là pour accueillir les fichiers du site.
Pour le moment ce répertoire appartient à root et il a des droits d'accès par défaut. Ca peut fonctionner. Ce serait mieux d'organiser les choses surtout si ensuite le serveur vient à héberger plusieurs sites.
Ce qui serait bien ce serait d'attribuer un propriétaire et des droits à cette arborescence.
Donc, on va examiner le besoin au niveau de l'arborescence du site tuto-dev-web.fr
: (Illustration ci-dessous, besoins en orange)
- Apache doit pouvoir lire les fichiers. (Eventuellement écrire dans un répertoire si upload d'images ou de documents)
- Ftp doit pouvoir uploader et downloader des fichiers.
- Après connexion ssh, donc depuis un shell, je dois pouvoir lancer des commandes. Par exemple du git clone ou du composer install.
L'utilisateur apache existe déjà wwww-data
. Et il appartient au groupe de même nom www-data
.
La solution que je propose (Illustration ci-dessous, solution cadre jaune):
- C'est de créer un utilisateur système
www-tdwfr
(tdw pour tuto-dev-web). - De mettre cet utilisateur dans le groupe
www-data
. - De rendre cet utilisateur propriétaire de la sous-arborescence à partir de
tuto-dev-web.fr
. - De positionner les droits de la manière suivante :
- Pour le propriétaire
www-tdwfr
, je positionne les droits de lecture et d'écriture. Ca c'est pour wsFTPd et le shell de la connexion ssh. - Pour le groupe
www-data
, je mets le droit de lecture. Ca c'est pour l'utilisateurwww-data
du serveur Apache qui accèdera en lecture en tant que membre du groupe. - Pour les autres utilisateurs, je ne mets aucun droits.
- Pour le propriétaire
- Il faudra aussi que je gère les masques : umask 027 pour ssh (dans le .bash_profile) et pour vsftpd (dans son fichier de conf).
- Si j'ai besoin d'héberger un autre site, je crée un autre utilisateur. Je le mets propriétaire de l'arborescence de cet autre site. Les sites seront étanches. L'utilisateur d'un site ne pourra pas accéder à l'autre site.
#2 Installation de vsFTPd
Comme serveur ftp, j’ai choisi vsFTPd qui est un serveur qui a été développé par Chris Evans, chargé de la sécurité de Google Chrome. vsFTPd peut gérer ses propres utilisateurs (tout comme le serveur MySQL). Ce n'est pas la solution que je choisis.
#3 Création d'un utilisateur pour le site tuto-dev-web.fr
Je crée l'utilisateur www-tdwfr
.
- Je lui donne
/var/www/html/tuto-dev-web.fr
comme home directory. - Je le mets dans le même groupe que les utilisateurs apache soit
www-data
. - Enfin, il aura un bash.
Et je mets comme mot de passe pass_www_tdwfr
.
#4 Attribution d'un propriétaire et des droits à /var/www/html/tuto-dev-web.fr
Ci-dessous, j'attribue un propriétaire et un groupe www-twdfr:www-data
à l'arborescence tuto-dev-web.fr
Ci-dessous, j'attribue les droits.
#5 Première connexion à vsFTPd avec FileZilla
Je me connecte avec FileZilla.
FileZilla me dit que je ne suis pas crypté. Normal pour l'instant.
Je constate aussi que je peux me balader ou je veux dans l'arborescence du serveur. Je remonte jusqu'à la racine. Donc là ça craint. Il va falloir chrooter l'utilisateur www-tdwfr
. (Ca veut dire l'enfermer dans le sous-arbre qui part de son home directory).
Ci-dessous, pour info, le process vsftpd
qui accède à /var/www/html/tuto-dev-web.fr
appartient bien à www-tdwfr
(J'ai déjà expliqué pour le serveur Apache que la présence de plusieurs process est dû au modèle client/serveur Unix).
#6 On chroote les users de vsftpd
-
Il faut prendre le fichier de conf en édition.
-
En passant, je décommente la ligne. Ca n'a rien à voir avec le chrootage.
-
Ensuite je décommente.
-
Et j'ajoute.
-
Puis je recharge la conf.
-
Il me reste à reprendre FileZilla pour constater que je ne peux plus me balader en dehors du home directory. (J'ai aussi fait un test avec ftp en ligne de commande)
#7 Gestion des masques pour le shell et pour vsftpd
Je prends une console ssh et je me connecte avec www-tdwfr
.
Au niveau système, la commande umask gère la valeur d'un masque. Si je tape umask, j'ai la valeur courante du masque.
- Si je veux masquer le r, il me faut un 1.
- Si je veux masquer le w, il me faut un 2.
- Si je veux masquer le x, il me faut un 4.
- Si je veux masquer plusieurs droits, j'ajoute ces valeurs.
Qu'est-ce que je veux masquer ?
- Pour le propriétaire rien, donc 0.
- Pour le groupe le w, donc 2.
- Pour les autres tout, donc 7.
Je vais éditer le .bash_profile
et mettre la commande umask 027
.
Je me déconnecte et je me reconnecte puis je tape umask et je dois avoir 027.
Il me reste à faire un touch fic
pour vérifier les droits sur un fichier. Puis un mkdir test
pour vérifier les droits sur un répertoire.
Maintenant je passe à ftp.
Je prends le fichier de conf en édition.
Je cherche la ligne ci-dessous.
Je remplace le 022 par 027. Je recharge la conf.
Il me reste à tester tout cela avec Filezilla.
#8 Sécurisation SSL
Je me sers du certificat de Let's Encrypt que j'ai installé pour le https. J'avais pensé créer un certificat auto signé, mais ce n'est pas nécessaire.
Les emplacements des clés sont dans le fichier /etc/apache2/sites-available/tuto-dev-web.fr-le-ssl.conf