Emprisonnez un utilisateur, ou un progamme dans une geôle!
On ne juge la solidité d'une chaîne que par la résistance de son maillon le plus faible. C'est ainsi que dans l'univers informatique, le maillon est représenté par l'utilisateur. Bien sûr, on peut établir plusieurs classements, mais il est plus simple de considérer que toute personne introduite sur un système peut provoquer des dommages irréparables. Depuis quelques années maintenant, des recherches sont effectuées afin de séparer l'utilisateur du système qu'il utilise. Différentes méthodes ont été testées et employées, limitation des droits des usagers, mise en place d'access lists, limitation d'utilisation, emprisonnement dans un répertoire, déplacement de la racine, emprisonnement d'un espace et de ses processus et pour finir, mise en place d'un système totalement dédié. Il est important de noter que les systèmes tels que les *BSD ont une nette avance dans cette matière. Je ne saurais donc que vous conseiller d'utiliser ces systèmes si vous souhaitez fournir des comptes systèmes à vos utilisateurs.
Note : une extension de l'outil est implémentée dans le noyau Linux par l'intermédiaire des outils GRsec ou WOLK.
Chroot est installé par défaut dans les distributions courantes. Si jamais ce n'était pas le cas, vous pouvez le trouver normalement dans le paquet coreutils (au moins pour les distributions Debian et Mandrake).
ou
Notre utilitaire se trouve dans le répertoire /usr/sbin. Cela signifie qu'il appartient aux outils de l'administrateur du système et que l'exécutable n'est pas indispensable au démarrage du système.
Vérifions les droits assignés par défaut :
# ls -l /usr/sbin/chroot -rwxr-xr-x 1 root root 10136 Jul 12 15:54 /usr/sbin/chroot
Nous pouvons constater que le fichier appartient à l'administrateur root et au groupe de même nom (root:root).
En termes plus simples, cela signifie qu'il peut être lu par n'importe qui (r) et exécuté par n'importe qui (x).
Dans ce cas de figure, la seule chose que nous pourrons obtenir est le changement de racine pour un utilisateur, de par son propre chef.
Pour l'exercice qui nous intéresse, à savoir emprisonner un utilisateur dans un espace restreint, nous nécessitons des droits supplémentaires. Pendant un court laps de temps, il est indispensable que le programme usurpe l'identité de l'administrateur (root) pour effectuer les opérations nécessaires. Ce mécanisme est rendu possible grâce au suid.
Note : l'emploi du suid implique des failles de sécurité potentielles. Il faut le manier avec précaution et bien être conscient des risques encourrus. Dans les cas extrêmes, cette situation permet à un utilisateur distant mal intentionné de prendre le contrôle du système en tant qu'administrateur.
Pour suid notre programme, exécutons l'opération suivante :
# chmod u+s /usr/sbin/chroot # ls -l /usr/sbin/chroot -rwsr-xr-x 1 root root 10136 2003-07-12 15:54 /usr/sbin/chroot
/!\ /!\ /!\ /!\ Mettre en place le bit setuid en exec sur chroot revient à donner à tout utilisateur les droits de "root"... En effet chroot étant par défaut propriété de "root", un simple "chroot / /bin/bash" suffit à obtenir un shell en temps que "root"... Je déconseille donc une telle pratique. /!\ /!\ /!\ /!\
Le droit d'exécution x a été remplacé par le droit s, signifiant que le suid est désormais appliqué au programme.
Le système est maintenant en mesure d'utiliser correctement le programme.
Nous désirons que l'utilisateur qui se connectera soit dès son arrivée enfermé dans l'environement que nous construisons à cet effet. En ce sens, nous allons créer un script shell qui permettra d'adapter l'entrée de l'utilisateur à notre environement.
Si vous ne l'avez pas déjà créée, il faut établir les paramêtres du dit compte.
Petit rappel des options de l'outil useradd :
Voici un exemple :
Notre utilisateur toto se voit attribuer les numéros 1001 d'utilisateur et 1001 de groupe et sera logé dans le répertoire /home/chroot/toto. Le shell qui lui permettra de se connecter est un petit script qui autorise l'emprisonnement de l'utilisateur à son arrivée.
De manière simple, ce script peut ainsi être écrit :
Si nous utilisons la ligne de commande qui constitue ce script, dans une phase de test, une erreur va nous être retournée :
Que se passe t'il donc ? La réponse est simple. L'invocation du shell, ici /bin/bash, se fait après le déplacement de la racine. Il cherche donc au pied de cette nouvelle racine un répertoire bin contenant l'utilitaire bash. Cependant, puisque nous n'avons jusqu'à lors inséré aucun outil, le système refuse la commande.
Que faire dans ce cas ? La réponse est assez simple, nous allons construire l'environnement nécessaire à l'utilisation de la prison. Cela signifie que chaque commande que vous désirerez utiliser dans cet espace restreint doit y être copié, dans le répertoire aproprié.
Avant de chercher à automatiser la tâche, commençons par le bash de tout à l'heure :
L'utilitaire est à présent copié.
Il faut également fournir les librairies nécessaires à son utilisation. Nous utiliserons l'outil ldd pour déterminer les fichiers nécessaires.
Comme dit, copions les librairies indispensable au fonctionnement :
Voilà, il ne reste plus qu'à tester en s'identifiant sous l'utilisateur toto :
Notre premier travail, créer un espace restreint pour un utilisateur, est achevé.
La tâche ne s'arrête pas là. Tout comme nous avons copié le shell bash, il faut de même insérer tous les utilitaires nécessaires ou vitaux tels que ls, chmod, rm, etc...
Pour ne pas effectuer une tâche répétitive, il est plus intelligent de créer un script qui travaillera pour nous et qui aura le mérite d'être réutilisable :
Très bientôt la suite de cet article abordera comment "chrooter" les services afin d'en optimiser la sécurité
@ Retour à la rubrique Administration système
Copyright © 25/08/2003, Jop, Prae & Anne
![]() ![]() ![]() ![]() |
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique, Contexte non commercial 2.0 : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ |