Une relecture est en cours. FIche non validée !


Mise en place d'un serveur SFTP


Comment configurer le SFTP pour un serveur web racine de documents
Dernière mise à jour le 19 août 2020

Le SFTP est le préféré de nos jours en raison de son modèle de sécurité robuste et de sa configuration plus facile que le FTP et le FTPS traditionnels. Dans ce guide, nous allons configurer le SFTP pour permettre aux utilisateurs de télécharger des documents à la racine du serveur web.
Introduction

Ce guide suppose que la racine de votre document web est la racine par défaut pour Apache et Nginx dans /var/www/html. Si vous avez suivi l'un de nos guides précédents sur la mise en place d'hôtes virtuels, votre racine de document peut se trouver dans /var/www/example.com/public_html. Assurez-vous simplement que vous avez la bonne racine de document et que les commandes de mise à jour dans ce guide correspondent.

Ce guide a été testé sur les serveurs Ubuntu 20.04, 18.04 et 16.04, mais il devrait également fonctionner sans problème avec les autres distributions basées sur Debian. Si vous utilisez CentOS, remplacez simplement www-data dans ce guide par apache ou nginx. En cas de problème, veuillez me le faire savoir dans les commentaires.

J'ai fourni deux méthodes différentes dans ce guide pour configurer l'accès SFTP à la racine de votre document :

  • La première méthode est une configuration simple où vous ajoutez simplement votre utilisateur SFTP au groupe www-data.
  • La deuxième méthode est beaucoup plus sûre et est recommandée si vous souhaitez limiter les endroits où www-data a un accès en écriture. J'ai inclus une section spéciale pour les utilisateurs de WordPress et les meilleures pratiques de sécurité. Voir l'étape 5.5 : WordPress et www-data.

Quelle que soit la méthode que vous choisissez, les étapes 1, 2 et 3 ci-dessous sont les mêmes.

1. Installer SSH

SFTP est construit sur la couche de transport SSH et devrait être installé par défaut sur la plupart des distributions de serveurs Linux. Si ce n'est pas le cas, vous pouvez l'installer avec

sudo apt install openssh-server

2. Configurer les SSH

Changez le sous-système en internal-sftp dans sshd_config.

sudo nano /etc/ssh/sshd_config

Faites défiler jusqu'au bas du fichier et commentez la ligne Subsystem sftp en ajoutant # avant et ensuite ajoutez Subsystem sftp internal-sftp en dessous.
/etc/ssh/sshd_config

#Sous-système sftp /usr/lib/openssh/sftp-server
Sous-système sftp interne-sftp

Cela indique à sshd d'utiliser le code du serveur SFTP intégré à sshd au lieu de faire tourner le serveur sftp, qui est maintenant redondant et conservé uniquement pour une compatibilité ascendante.

Redémarrez le service sshd pour que les changements soient pris en compte.

redémarrage du service sudo sshd

3. Créer un utilisateur SFTP

Il n'est pas recommandé d'utiliser le compte racine ou tout autre compte ayant des privilèges sudo pour télécharger des fichiers à la racine du serveur web de documents. Pour cette raison, vous devez créer un nouvel utilisateur qui n'a qu'un accès SFTP à la racine du document.

Dans ce guide, nous appelons l'utilisateur SFTP webdev - vous pouvez l'appeler comme vous le souhaitez. Si vous envisagez de donner un accès SFTP à plusieurs utilisateurs à travers différentes racines de documents, envisagez un schéma de nommage comme nom d'utilisateur_domaine_com. Par exemple john_devanswers_co. Cela facilitera le suivi de tous vos utilisateurs SFTP.

Pour les besoins de ce guide, nous nommerons l'utilisateur SFTP webdev.

sudo adduser webdev

Générez un mot de passe et appuyez sur la touche Entrée pour accepter tous les paramètres par défaut.
Deux méthodes de configuration SFTP

Je propose deux méthodes différentes dans ce guide parce que certaines personnes veulent simplement une méthode rapide et facile pour accéder à la racine du document avec SFTP, et d'autres veulent une configuration de sécurité plus avancée (que j'utilise). Il peut être utile de lire les deux méthodes pour voir laquelle répond à vos besoins.

  • Première méthode : Configuration rapide
    • Vous voulez juste une méthode rapide et simple pour donner à un ou plusieurs utilisateurs SFTP l'accès à la racine du document en les ajoutant au groupe www-data.
    • Vous avez déjà un site actif et occupé qui tourne sur la racine du document et vous ne voulez pas risquer de le supprimer accidentellement en définissant des permissions restrictives dans la deuxième méthode.
    • Vous devez installer un système de gestion de contenu à partir de zéro, tel que WordPress, avant de définir des autorisations plus restrictives dans la deuxième méthode.
  • Deuxième méthode : meilleure sécurité et gestion des utilisateurs SFTP
    • Vous voulez la meilleure sécurité possible pour votre racine de document.
    • Vous avez déjà installé et fait fonctionner votre CMS tel que WordPress, et vous voulez maintenant le verrouiller.
    • Vous voulez limiter les endroits où www-data peut écrire.
    • Vous avez plusieurs développeurs qui ont besoin d'un accès en écriture à plusieurs racines de documents hébergées sur votre serveur.

4. Première méthode : Installation rapide

En utilisant cette méthode avec le moins de configuration possible, nous allons créer une directive Match User dans la configuration SSH et ajouter votre utilisateur SFTP au groupe www-data.
4.1. Ajouter une directive "Match User" dans la configuration SSH

Limitez l'utilisateur webdev à la racine du document et désactivez également son accès SSH - nous voulons seulement qu'il puisse se connecter via SFTP. Nous pouvons le faire en ajoutant une directive "Match User" dans le fichier de configuration SSH.

Commencez par ouvrir sshd_config.

sudo nano /etc/ssh/sshd_config

Faites défiler vers le bas le fichier de configuration SSH et ajoutez votre nouvelle directive "Match User".

Assurez-vous que ChrootDirectory est le répertoire situé au-dessus de la racine de votre document. Par exemple, si la racine de votre document est /var/www/html/, alors le ChrootDirectory est /var/www/.

Si vous avez suivi un de nos précédents guides sur l'hébergement de domaines multiples sur Apache ou Nginx, la racine de votre document peut se trouver dans /var/www/mydomaine.com/public_html, dans ce cas, votre ChrootDirectory serait /var/www/mydomaine.com/.

Notez que vous pouvez ajouter ici plusieurs utilisateurs séparés par une virgule, par exemple Match User webdev, webdev2, webdev3
/etc/ssh/sshd_config

Faire correspondre l'utilisateur webdev

Sauvegarder et quitter (appuyer sur CTRL + X, appuyer sur Y et ensuite sur ENTRÉE)

Testez la configuration SSH avant de redémarrer.

sudo sshd -t

Si aucune erreur ne s'est produite, redémarrez le service sshd pour que les changements soient pris en compte.

redémarrage du service sshd sudo

4.2. Ajouter un utilisateur SFTP à www-data

Ajoutez votre webdev utilisateur SFTP au groupe www-data.

sudo usermod -a -G www-data webdev

Remarque : les groupes Linux ne prennent pas effet tant que l'utilisateur ne se déconnecte pas et ne se reconnecte pas. Si vous êtes déjà connecté en tant qu'utilisateur dans votre client FTP, fermez complètement le programme et connectez-vous à nouveau.
4.3. Définir les autorisations de répertoire

Le SFTP est très strict en ce qui concerne les permissions du répertoire chroot et si elles ne sont pas correctement définies, vous ne pourrez pas vous connecter.

  • Le répertoire chroot et tous ses parents ne doivent pas avoir de capacités d'écriture de groupe ou de monde. En d'autres termes, vous devez vous assurer que /var/www/ est réglé sur 755. (et non pas 775, qui donne des autorisations d'écriture de groupe).
  • Le répertoire chroot et tous ses parents doivent être détenus par la racine.

En supposant que votre chroot est /var/www/, assurez-vous que le répertoire est défini à 755.

sudo chmod 755 /var/www/

Assurez-vous que votre répertoire chroot appartient à la racine.

sudo chown root:root /var/www/

Pour vérifier les autorisations pour ce répertoire :

sudo ls -ld /var/www/

Sortie :

drwxr-xr-x 14 racine racine 4096 Jun 3 14:28 /var/www/

Assurez-vous que la racine du document est définie sur 775, ce qui permettra aux groupes d'écrire dans ce répertoire.

sudo chmod 775 /var/www/html

Assurez-vous que la racine de votre document et tout son contenu sont la propriété de www-data.

sudo chown -R www-data:www-data /var/www/html*

Remplacez tous les répertoires de la racine du document par 775. Cela permettra au propriétaire (www-data) et à son groupe (auquel appartiennent les utilisateurs SFTP) de lire, écrire et exécuter des dossiers.

sudo find /var/www/html/ -type d -exec chmod 775 {} \ ;

Changez tous les fichiers de la racine du document à 664, cela permettra au propriétaire et au groupe de lire, d'écrire et d'exécuter des fichiers.

sudo find /var/www/html/ -type f -exec chmod 664 {} \ ;

Assurez-vous que tous les nouveaux fichiers ou dossiers créés par les utilisateurs SFTP héritent du groupe www-data.

sudo find /var/www/html -type d -exec chmod g+s {} \ ;

Maintenant, connectez-vous à SFTP avec votre client FTP préféré et assurez-vous que vous pouvez créer, modifier et supprimer des fichiers et des dossiers.

Si vous ne pouvez pas vous connecter, vérifiez les 50 dernières entrées dans le journal d'authentification.

sudo tail -n 50 /var/log/auth.log

4.4. Ajout de nouveaux utilisateurs SFTP

Si vous devez fournir à d'autres utilisateurs SFTP un accès en écriture à la racine du document, ajoutez simplement leurs noms d'utilisateur séparés par une virgule, par exemple Match User webdev, webdev2, webdev3 dans sshd_config (étape 4.1) et ajoutez ensuite l'utilisateur SFTP au groupe www-data (étape 4.2) .
5. Deuxième méthode : amélioration de la sécurité et de la gestion des utilisateurs SFTP

Dans cette méthode, nous établirons des autorisations plus restrictives pour la racine de votre document et utiliserons des groupes d'utilisateurs Linux pour gérer les utilisateurs SFTP. C'est la méthode que j'utilise personnellement pour gérer plusieurs hôtes virtuels, les installations de WordPress et les utilisateurs SFTP sur un seul serveur.

Même si vous n'hébergez qu'un seul site web sur votre serveur, je vous recommande vivement cette configuration si vous souhaitez obtenir la meilleure sécurité possible pour la racine de votre site web.

Cette méthode supprime l'accès en écriture de www-data à la racine entière du document. Imaginez un scénario dans lequel un script PHP ou un plugin WordPress est piraté, l'attaquant pourrait obtenir un accès en écriture à toute la racine de votre document. Pour atténuer ce problème, il suffit de donner à www-data (et donc à WordPress) un accès en écriture aux répertoires où il n'a besoin que de lui pour fonctionner correctement.

Si vous n'avez pas encore installé votre CMS, vous devez d'abord appliquer la première méthode, télécharger et installer votre CMS, puis suivre la deuxième méthode pour verrouiller le CMS.
5.1. Créer un nouveau groupe d'utilisateurs Linux

Avec cette méthode, nous allons créer un groupe d'utilisateurs Linux avec l'accès nécessaire à la racine du document et ensuite ajouter nos utilisateurs SFTP à ce groupe.

Si vous hébergez plusieurs sites web sur le même serveur avec Apache ou Nginx, vous devez nommer ces groupes afin qu'ils correspondent à votre nom de domaine. Par exemple, sftp_example1_com et sftp_example2_org. Cela facilitera grandement le suivi de vos groupes s'ils devaient s'étendre dans le temps.

Cependant, pour les besoins de ce guide, nous appellerons simplement le groupe sftp_users et nous limiterons ce groupe à la racine du document par défaut /var/www/html.

Ajouter un nouveau groupe :

sudo groupadd sftp_users

5.2. Ajouter un utilisateur SFTP au groupe

Ajoutez votre webdev utilisateur SFTP (ou quel que soit le nom que vous lui donnez) au groupe sftp_users.

sudo usermod -a -G sftp_users webdev

Remarque : les groupes ne prennent pas effet tant que l'utilisateur ne se déconnecte pas et ne se reconnecte pas. Si vous êtes déjà connecté en tant qu'utilisateur dans votre client FTP, fermez complètement le programme et connectez-vous à nouveau.
5.3. Ajouter la directive "Match Group" dans SSH Config

Dans la première méthode, nous avons utilisé la directive "Match User", mais en utilisant la directive "Match Group", vous pouvez gérer plusieurs utilisateurs et documenter les racines de manière beaucoup plus efficace.

Cela vous permet de restreindre un groupe entier à une racine de document particulière, puis vous ajoutez simplement vos utilisateurs SFTP à ce groupe sans configuration supplémentaire. Cela peut vous faire gagner beaucoup de temps.

Commencez par ouvrir sshd_config

sudo nano /etc/ssh/sshd_config

Faites défiler le fichier de configuration SSH vers le bas et ajoutez votre nouvelle directive sur le groupe de correspondance.

Assurez-vous que ChrootDirectory est le répertoire situé au-dessus de la racine de votre document. Par exemple, si la racine de votre document est /var/www/html/, alors le ChrootDirectory est /var/www/.

Si vous avez suivi l'un de nos guides précédents sur la configuration de plusieurs domaines, votre document racine peut se trouver dans /var/www/mydomaine.com/public_html, dans ce cas, votre ChrootDirectory serait /var/www/mydomaine.com/.
/etc/ssh/sshd_config

Groupe de matchs sftp_users

Sauvegarder et quitter (appuyer sur CTRL + X, appuyer sur Y et ensuite sur ENTRÉE)

Testez la configuration SSH avant de redémarrer.

sudo sshd -t

Si aucune erreur ne s'est produite, redémarrez le service sshd pour que les changements soient pris en compte.

redémarrage du service sshd sudo

5.4. Définir les autorisations de répertoire

Le SFTP est très strict en ce qui concerne les permissions du répertoire chroot et si elles ne sont pas correctement définies, vous ne pourrez pas vous connecter.

  • Le répertoire chroot et tous ses parents ne doivent pas avoir de capacités d'écriture de groupe ou de monde. En d'autres termes, vous devez vous assurer que /var/www/ est réglé sur 755. (et non pas 775, qui donne des autorisations d'écriture de groupe).
  • Le répertoire chroot et tous ses parents doivent être détenus par la racine.

En supposant que votre chroot est /var/www/, assurez-vous que le répertoire est défini à 755.

sudo chmod 755 /var/www/

Assurez-vous que votre répertoire chroot appartient à la racine.

sudo chown root:root /var/www/

Pour vérifier les autorisations pour ce répertoire :

sudo ls -ld /var/www/

Sortie :

drwxr-xr-x 14 racine racine 4096 Jun 3 14:28 /var/www/

Assurez-vous que la racine du document est définie sur 775, ce qui permettra aux groupes d'écrire dans ce répertoire.

sudo chmod 775 /var/www/html

Assurez-vous que la racine de votre document et tout son contenu sont la propriété de la racine et du groupe sftp_users.

sudo chown -R root:sftp_users /var/www/html*

Remplacez tous les répertoires de la racine du document par 775. Cela permettra au groupe sftp_users de lire, écrire et exécuter des dossiers.

sudo find /var/www/html/ -type d -exec chmod 775 {} \ ;

Changez tous les fichiers de la racine du document en 664, cela permettra au groupe sftp_users de lire, d'écrire et d'exécuter des fichiers.

sudo find /var/www/html/ -type f -exec chmod 664 {} \ ;

Assurez-vous que tout nouveau fichier ou dossier créé par l'utilisateur SFTP hérite du groupe de la racine du document, dans cet exemple le groupe sftp-users.

sudo find /var/www/html -type d -exec chmod g+s {} \ ;

Maintenant, connectez-vous à SFTP avec votre client FTP préféré et assurez-vous que vous pouvez créer, modifier et supprimer des fichiers et des dossiers dans la racine du document.

Si vous ne pouvez pas vous connecter, vérifiez les 50 dernières entrées dans le journal d'authentification.

sudo tail -n 50 /var/log/auth.log

Si vous devez fournir à d'autres utilisateurs SFTP un accès en écriture à la racine du document, il vous suffit de les ajouter au groupe d'utilisateurs sftp (étape 5.2).
5.5. WordPress et www-data

www-data n'a plus d'accès en écriture à la racine de votre document, ce qui est la configuration de sécurité préférée. Cependant, vous devrez peut-être donner à www-data un accès en écriture à certains fichiers et répertoires pour que WordPress fonctionne correctement.
.htaccess et Apache

Si vous obtenez une erreur Apache après avoir défini les autorisations dans les étapes précédentes "Vous n'avez pas la permission d'accéder à cette ressource. Server unable to read htaccess file, denying access to be safe", vous devrez peut-être donner à www-data et au groupe sftp-users la propriété de .htaccess.

sudo chown www-data:sftp_users /var/www/html/.htaccess

Répertoire des téléchargements WordPress

Si vos utilisateurs ont besoin de télécharger des fichiers via la médiathèque de WordPress, vous devrez donner à www-data un accès en écriture au répertoire uploads dans /var/www/html/wp-content/uploads.

sudo chown -R www-data:sftp_users /var/www/html/wp-content/uploads*

Cela donnera à WordPress et à tous vos utilisateurs SFTP un accès en écriture au répertoire des téléchargements.
Répertoire de cache de WordPress

Si vous utilisez un plugin de mise en cache tel que le plugin W3 Total Cache, vous devez donner à www-data un accès en écriture au répertoire de cache dans /var/www/html/wp-content/cache.

sudo chown -R www-data:sftp_users /var/www/html/wp-content/cache*

En plus de ce qui précède, si vous utilisez W3 Total Cache, donnez à www-data un accès en écriture au dossier w3tc-config.

sudo chown -R www-data:sftp_users /var/www/html/wp-content/w3tc-config*

WordFence

Si vous utilisez WordFence, vous devez donner à www-data un accès en écriture à /wp-content/wflogs/.

sudo chown -R www-data:sftp_users /var/www/html/wp-content/wflogs*

Mises à jour de WordPress et installation/mise à jour de plugins

WordPress utilise normalement www-data afin de se mettre à jour et d'ajouter/mettre à jour des plugins. C'est l'installation la plus courante mais ce n'est pas la plus sûre car tout plugin malveillant pourrait compromettre l'ensemble de votre installation WordPress.

Vous devriez plutôt télécharger le plugin SSH SFTP Updater Support dans votre répertoire de plugins WordPress et l'activer dans WordPress.

Une fois activé, si vous devez mettre à jour WordPress ou ajouter/mettre à jour des plugins, vous serez invité à indiquer votre nom d'utilisateur SFTP et votre mot de passe/clé SSH. Vous pouvez enregistrer ce mot de passe ou cette clé SSH dans le gestionnaire de mots de passe de votre navigateur afin de ne pas avoir à les saisir à chaque fois.

Si le plugin SSH SFTP Updater Support ne vous demande pas d'entrer votre mot de passe lorsque vous essayez de mettre à jour WordPress ou de modifier les plugins, ajoutez une entrée dans votre fichier wp-config.php pour define('FS_METHOD', 'ssh2'). Assurez-vous qu'il n'y a pas d'autres entrées pour FS_METHOD dans le fichier de configuration.
Mais WordPress peut-il se mettre à jour ?

C'est ce que certains considèrent comme une restriction de l'endroit où www-data peut écrire. Si un correctif de sécurité critique est publié, WordPress n'aura pas les permissions appropriées pour appliquer ce correctif lui-même.

Cependant, si vous êtes sérieux à propos de la sécurité de WordPress, vous devriez de toute façon maintenir et mettre à jour votre installation de WordPress de manière proactive et fréquente. Et dans l'éventualité où une faille de sécurité critique serait découverte dans le noyau de WordPress, un pirate ne pourra toujours pas accéder en écriture à l'ensemble de la racine de votre documentation.

Vous pouvez être averti des correctifs de sécurité critiques pour WordPress et les plugins par e-mail en utilisant un plugin tel que WordFence, puis mettre à jour WordPress vous-même en utilisant le plugin SSH SFTP Updater Support comme mentionné précédemment. C'est la méthode que j'utilise personnellement pour toutes mes installations de WordPress.