Bonjour à tous, aujourd’hui je vous propose de découvrir les « chroot jails » qui sont notamment utilisées par les hébergeurs, pour leurs solutions de stockages mutualisés. En effet, si vous êtes un sysadmin Linux, il est probable que vous deviez accorder l’accès SFTP à certains utilisateurs pour que ceux-ci puissent téléverser des fichiers dans leurs répertoires personnels. Par défaut sous linux, les utilisateurs peuvent parcourir l’ensemble du système de fichiers y compris les répertoires des autres utilisateurs à travers les 3S (ndlr : protocoles SSH, SFTP, SCP). Cela peut ne pas être un problème si ces utilisateurs sont dignes de confiance, mais dans une démarche ZTNA (Zero Trust Newtorking Access) vous devrez restreindre l’accès des utilisateurs à leur répertoire personnel en créant une « prison virtuelle » ou chaque utilisateur sera isolé dans sa propre cellule.

Dans ce didacticiel, vous verrez donc comment configurer un environnement SFTP Chroot Jail pour un groupe d’users (sftpjail). Les utilisateurs auront uniquement un accès SFTP, l’accès SSH sera désactivé.

Toutes les commandes ci-dessous seront éxécutées par l’intermédiaire de l’utilisateur root.

Environnement et prérequis :

  • Une machine Ubuntu 20.04.x LTS faisant office de serveur et de client, avec le logiciel Filezila d’installé.

I. Création d’un groupe SFTP

Au lieu de configurer le serveur OpenSSH pour chaque utilisateur individuellement, nous allons créer un nouveau groupe et ajouter tous nos utilisateurs « chrootés » à ce groupe.

addgroup sftpjail

ndlr : Vous pouvez nommer le groupe comme vous le souhaitez.

II. Ajout d’utilisateurs au groupe SFTP

L’étape suivante consiste à ajouter un ou plusieurs utilisateurs à ce groupe. Dans le cadre de la démonstration, je vais réaliser mes tests par l’intermédiaire du compte Tintin.

adduser tintin 

Créez ensuite le groupe sftpjail, et ajoutez tintin au groupe en question :

usermod -a -G sftpjail tintin

Fixez les droits pour le dossier /home/tintin (créé automatiquement avec la commande adduser) Ce répertoire doit appartenir à l’utilisateur root. Oui je sais cela peut paraitre bizarre… Explication ici :

https://unix.stackexchange.com/questions/598520/client-loop-send-disconnect-broken-pipe-for-chroot-sftp-user-with-correct-p/646660#646660

chown -R root: /home/tintin
chmod 755 -R /home/tintin

Étant donné que le répertoire /home/tintin appartient à l’utilisateur root, Tintin ne pourra pas créer de fichiers et de répertoires dans son répertoire personnel. Pour cela, vous devrez créer de nouveaux répertoires auxquels l’utilisateur aura un accès complet. Par exemple, vous pouvez créer les dossiers « classique » suivants :

mkdir -p /home/tintin/{Desktop,Documents,Downloads,Musics,Public,Templates,Videos,public_html}
chmod 700 -R /home/tintin/{Desktop,Documents,Downloads,Musics,Public,Templates,Videos,public_html}
chown tintin:tintin -R /home/tintin/{Desktop,Documents,Downloads,Musics,Public,Templates,Videos,public_html}

III. Configuration de SSH

SFTP est un protocole sous-jacent de SSH et prend donc en charge tous les mécanismes d’authentification SSH.

Ouvrez le fichier de configuration SSH /etc/ssh/sshd_config

nano /etc/ssh/sshd_config

Dirigez-vous, vers la fin du fichier, et ajoutez les lignes suivantes :

#Subsystem      sftp    /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group sftpjail
  ChrootDirectory %h
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

N’oubliez pas de commenter la ligne #Subsystem sftp /usr/lib/openssh/sftp-server, sans quoi OpenSSH vous retournera une erreur lors de son redémarrage.

Je pense que toutes les directives sont explicites, sauf ChrootDirectory. Celle-ci spécifie le chemin d’accès au répertoire exclusif de l’utilisateur /home/x. On utilise %h, car c’est une variable d’environnement qui désigne l’ensemble des répertoires personnels pour les futurs prisonniers (comprendre utilisateurs) de notre jail.

Une fois que vous avez terminé, enregistrez le fichier et redémarrez le service SSH pour appliquer les modifications :

systemctl restart ssh

IV. Test de la configuration

Maintenant, vous pouvez essayer de vous connecter à la machine distante via SFTP en utilisant les informations d’identification de l’utilisateur chrooté.

Ouvrez une connexion SFTP à l’aide de la commande sftp suivie du nom d’utilisateur du serveur distant et de l’adresse IP ou du nom de domaine du serveur :

sftp [email protected]

Exécutez la commande pwd, comme indiqué ci-dessous, le retour de la commande vous indiquera que vous êtes à la racine de votre système (comprendre cellule).

sftp> pwd
Remote working directory: /

Vous pouvez également lister les fichiers et répertoires :

sftp> ls -alt

Comme vous pouvez le constater, les dossiers {Desktop,Documents,Downloads, etc.} sont propriétaires de 1001 et 1002, qui sont des identifiants se rapportant à l’utilisateur Tintin et à son groupe par défaut Tintin. Si-vous ne comprenez pas cette phrase, consulter l’article ci-dessous.

« Chaque utilisateur doit faire partie au moins d’un groupe, son groupe primaire. Celui-ci est défini au moment de la création du compte, et par défaut, l’utilisateur appartient à un nouveau groupe créé, portant son nom. » – N. Grassa

Pour plus d’informations : http://n.grassa.free.fr/cours-linux/comptes-utilisateurs.html

Les autres fichiers/dossiers sont propriétaires de root, car ce sont des fichiers créés par défaut lors de l’instanciation de l’utilisateur tintin, et qui ont hérités des droits que nous avons fixés au dossier parent /home/tintin. (cf plus haut)

Reprenons, si vous souhaitez accéder à toutes les commandes disponibles, je vous laisse le soin de taper la commande help

V. Connexion depuis un client SFTP (Filezila)

Initier une connexion SFTP à votre serveur SFTP, depuis un client graphique SFTP. Dans mon cas j’utilise Filezila.

Par défaut à la racine de la cellule de l’utilisateur, vous n’avez pas de droit d’écriture. Mais, vous disposez de tous les droits (RWX) pour les sous-répertoires que nous avons créés en amont :

  • Desktop
  • Documents
  • Downloads
  • Musics
  • Public
  • Templates
  • Videos
  • public_html

Pour vérifier cela, dirigez-vous vers un des sous-dossiers que je viens d’énumérer et essayez de créer un dossier ainsi qu’un fichier. Vous verrez que cette fois-ci vous pourrez réaliser cette action.

Voilà c’est tout pour cette fois-ci. Maintenant, il vous manque plus qu’à réaliser un script bash pour automatiser tout cela, dans le cas où vous devez gérer un nombre d’users important ^^

À bientôt !

++

Geoffrey


Geoffrey Sauvageot-Berland

Ingénieur diplômé par l’état en Informatique et Cybersécurité. Généraliste, à l'origine administrateur systèmes et réseaux, j’occupe actuellement un poste d’auditeur en sécurité offensive. J’apprécie également la programmation/automatisation. Fondateur du blog : "Le Guide du SecOps", anciennement "Le Guide du SysOps"