Mise en place d’une restriction chroot jail sur un dossier n’appartenant pas au compte root

By | May 14, 2019

Il existe plusieurs raisons pour lesquelles il est nécessaire de restreindre une session SFTP d’un utilisateur à un dossier particulier sur un serveur Linux. Entre autres, la préservation de l’intégrité des fichiers, la protection contre les logiciels malveillants, et surtout la protection du système.
Pour restreindre les accès SFTP d’un utilisateur à un seul dossier, on peut avoir recours à un chroot jail.

Sur les systèmes d’exploitation basés sur Unix, un chroot jail est une fonctionnalité utilisée pour isoler un processus et ses enfants (child process) du reste du système d’exploitation. Pour des raisons de sécurité, c’est une fonctionnalité qui doit être employée exclusivement sur les processus n’utilisant pas le compte root.

Sur OpenSSH, l’option permettant de configurer les chroot jails est : ChrootDirectory.

Un coup d’oeil dans le manuel de OpenSSH nous apprend qu’au debut d’une nouvelle session, le démon sshd vérifie que tous les composants du chemin spécifié dans l’option ChrootDirectory appartiennent à l’utilisateur root et ne sont pas accessibles en écriture par les autres utilisateurs ou groupes.
En d’autres termes, pour que le chroot jail fonctionne, deux conditions doivent être remplies.
D’abord, il faudrait que tous les dossiers spécifiés dans le chemin inséré dans l’option ChrootDirectory appartiennent au compte root. Mais aussi, ces dossiers doivent ne doivent pas avoir la permission d’écriture sur les classes groupe et autre (group and other classes) !

Que faire alors si le dossier ciblé appartient à une application tierce comme Apache ?
Car, une modification sur la possession du dossier ou l’une des permissions entrainerait un dysfonctionnement de l’application.

Face à ce genre de situation, le moyen le plus simple de rendre accessible le dossier ciblé est d’utiliser les points de montage bind.

Dans la suite de ce billet, nous verrons comment mettre en place une telle configuration.




Soit le problème suivant :
Mr Kouassi Yao est un utilisateur qui doit pouvoir accéder à distance au dossier Apache dans le cadre de son travail. Des accès SFTP doivent lui être attribuées.
Le dossier /devfiles servira de répertoire de base (Home directory) à Yao.

Créeons ce dossier, puis assurons nous également que le propriétaire de ce dossier est bien root et que les permissions sont celles exigées par OpenSSH pour la config du chroot jail.
NB: Dans le répertoire de base, prenons le soin de créer un autre dossier www dans lequel sera monté plutard le répertoire d’Apache.

Créeons à présent le compte d’utilisateur yao à qui nous allons restreindre les accès SFTP. Son répertoire de base sera bien sûr /devfiles.

Passons à la configuration de l’application OpenSSH.
Il faudra commenter la ligne Subsystem sftp /usr/lib/openssh/sftp-server, puis ajouter la ligne Subsystem sftp internal-sftp, et la configuration chroot jail spécifique à l’utilisateur yao.

Redémarrons le serveur ssh.

# service sshd restart



Le moment est venu pour nous de configurer le point de montage bind.

Mais avant, essayons d’en savoir un peu plus sur ce point de montage spécifique.
Selon la documentation de mount, l’outil qui nous permettra de créer ce type de point de montage, l’option bind nous permettra de rendre un même contenu accessible dans deux endroîts différents.
En d’autres termes, cette option nous permettra de répliquer le contenu d’un répertoire dans un autre sans à avoir à copier manuellement quoi que ce soit.
De plus, n’importe quelle modification réalisée sur un côté est reflétée automatiquement dans l’autre.
Une autre chose aussi intéressante avec les bind mounts c’est que contrairement aux hard links ou soft links, ils n’affectent pas le stockage du système de fichiers. Ils ne sont disponibles que lorsque le système est opérationnel.

Ci-dessous les syntaxes pour créer les bind mounts:

# mount -o bind ancien-répertoire nouveau-répertoire
# mount --bind ancien-répertoire nouveau-répertoire
# mount -B ancien-répertoire nouveau-répertoire

NB: Notez que l’option bind ne peut être utilisée que par root.

A l’aide de la commande mount donc, créeons le point de montage auquel notre utilisateur yao aura accès.

Si vous souhaitez rendre ce point de montage permanent, insérez-le tout simplement dans la table des systèmes de fichiers (/etc/fstab) comme suit:


Suite à la configuration de la table des systèmes de fichiers, lorsque vous exécuterez la commande suivante, vous ne verrez aucun message d’erreur si la ligne insérée est correcte.

Ci-dessous le point de montage bind que nous venons de créer.

Notez que le dossier possède le même propriétaire et les mêmes permissions que le dossier original.
Aucun risque donc de pertubation de l’application Apache.
Ci-dessous le point de montage…

…Ici le dossier original.

Lorsque notre utilisateur yao se connecte, il n’a accès qu’aux dossiers et fichiers auquels nous lui avons donné accès…


…De plus aucune connexion ssh ne lui est autorisée.

Hopefully, cette astuce vous servira un jour ou l’autre.

🙂

mdestroy

2 thoughts on “Mise en place d’une restriction chroot jail sur un dossier n’appartenant pas au compte root

  1. Bruno

    Bonjour,

    C’est quand même bien compliqué alors qu’il suffit d’avoir un dossier parent qui appartient à root…
    Bref c”est à la base un problème de mauvaise organisation de votre arborescence qui est contourné en rendant cette arborescence encore plus complexe.

    Reply
    1. mdestroy Post author

      Il peut arriver que le dossier à partager soit très loin dans l’arborescence. Auquel cas, il faudrait que tous les dossiers parents aient pour propriétaire le compte root…Pourtant, une modif sur la possession et l’application ne fonctionne plus correctement. L’exemple n’est sûrement pas l’idéal, mais c’était ça l’idée. Désolé pour la confusion. 🙁

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *