Wiki Linux SMH

   

Flux RSS

Chrooter Un Utilisateur

Cet article nécessite encore des ajouts/modifications.
N'hésitez pas à apporter votre contribution en complétant cet article.

1 - Définition

Chrooter un programme consiste à le lancer en utilisant la commande chroot. Cette commande permet de changer l'emplacement de la racine (/).

Exemple :

On veut chrooter le programme prog_chroot dans le dossier /chroot/. Le programme considèrera le dossier /chroot/ comme /. Il n'aura donc pas accès aux autres dossiers.

L'intérêt de cette manipulation est donc d'enfermer un programme afin qu'il ne touche que à ce qu'on lui autorise de toucher.

  faire un script qui automatise tout la manip (dont ssh)

2 - Chrooter un utilisateur

La manipulation va se dérouler en plusieurs étapes :

  • création d'un utilisateur et de son dossier $HOME.
  • configuration de l'environnement chrooté.
  • configuration de l'utilisateur pour la connection.
  • ajout de commandes.

2.1 - Création de l'utilisateur

L'utilisateur à chrooter s'appellera franck. Pour le créer (plus d'infos sur la Gestion Des Utilisateurs), lancer en root les 2 commandes suivantes :

# useradd -d /home/franck -s /bin/bash -m franck

Puis pour lui affecter un mot de passe :

# passwd franck

A ce niveau, on dispose d'un utilisateur tout ce qu'il y a de plus classique.

2.2 - Configuration de l'environnement chrooté

L'utilisateur chrooté verra son $HOME comme la racine /. Il va donc falloir recréer une arborescence sui contiendra un shell et les outils que l'on veut donner à l'utilisateur.

On va créer les dossiers indispensables :

# mkdir /home/franck/bin
# mkdir /home/franck/lib
# mkdir /home/franck/dev

On copie le shell (ici le Bash) :

# cp /bin/bash /home/franck/bin/

Le problème est que le programme bash ne sert à rien sans ses librairies. On va donc les copier aussi dans le nouvel environnement.

Pour avoir la liste des librairies :

" ldd /bin/bash

On obtient :

linux-gate.so.1 =>  (0xffffe000)
libncurses.so.5 => /lib/libncurses.so.5 (0xb7f6f000)
libdl.so.2 => /lib/tls/libdl.so.2 (0xb7f6b000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7e34000)
/lib/ld-linux.so.2 (0xb7fc1000)

On les copie (sauf la première dont on n'a pas le chemin) :

# cp /lib/libncurses.so.5 /home/franck/lib/
# cp /lib/tls/libdl.so.2 /home/franck/lib/
# cp /lib/tls/libc.so.6 /home/franck/lib/
# cp /lib/ld-linux.so.2 /home/franck/lib/
  librairie __linux-gate.so.1__ ?? où elle est ?

Maintenant vous vous demandez ce qu'on va mettre dans /home/franck/dev/ ? On y mettra les devices voulus. Mais pour le moment on se contentera de /dev/null :

# mknod /home/franck/dev/null c 1 3 -m 666

Afin d'être sûr d'avoir les bons droits, exécutez en tant que root :

# chown -R franck /home/franck
# chmod -R 755 /home/franck

Et voilà... vous être prêts.... ah ben non en fait.... vous pouvez vous connecter en tant que franck, mais vous vous retrouvez dans /home/franck comme un utilisateur normal...

Il reste encore à configurer l'utilisateur pour sa connection...

2.3 - Configuration de l'utilisateur pour la connection

Tout d'abord, on va (en root) créer un fichier /bin/chrootshell qui va contenir :

#!/bin/bash
exec -c /usr/sbin/chroot /home/$USER /bin/bash

On change les droits du fichier :

# chmod 755 /bin/chrootshell

On rend le programme /usr/sbin/chroot utilisable par tout le monde :

# chmod u+s /usr/sbin/chroot

Ensuite, on va modifier dans le fichier /etc/passwd la ligne qui concerne notre utilisateur franck. Actuellement on a :

franck:x:1003:1003::/home/franck:/bin/bash

Modifions la en

franck:x:1003:1003::/home/franck:/bin/chrootshell

Et oui, nous utilisons notre petit script de chroot fait précedemment.

Maintenant on peut tenter une connection en tant que franck :

$ su - franck

En s'amusant un peu, on peut vérifier qu'on est bien chrooté :

bash-3.1$ pwd
/
bash-3.1$ cd ..
bash-3.1$ pwd
/ 
bash-3.1$ cd lib
bash-3.1$ pwd
/lib

Par contre, on remarquera qu'on est très vite limité :

bash-3.1$ ls
bash: ls: command not found

Pour pouvoir utiliser ls, vi et d'autres programmes, il va falloir les ajouter.

La connection par ssh fonctionne correctement aussi. Mission réussie !!!!!!

2.4 - Ajouter des commandes

Pour ajouter des commandes, il faut procéder de la même manière que pour l'on a procédé pour /bin/bash.

Pour simplifier l'ajout de commandes on peut utiliser le script suivant que j'ai nommé chroot-addcmd.sh :

#!/bin/sh

if [[ $# -le 1 ]] ; then
    cat << !

        Usage : $(basename $0)

!
    exit
fi

dossierChroot=$1
shift

while [[ $# -gt 0 ]]
  do
    ## Copie des librairies
    # la ligne ci-dessous devrait pouvoir être optimisée. Elle a été faite pour un besoin urgent
    for lib in $(ldd $1 |sed "s/(.*)//" | awk "BEGIN { FS=\"=>\" }{ print \$2}")
      do
        echo "Exécution de 'cp $lib $dossierChroot/lib/'..."
        cp $lib $dossierChroot/lib/
        if [[ $? -ne 0 ]] ; then
            echo "ERREUR"
            exit
        fi
    done
    ## Si on a passé le 'for' on a pu copier les librairies. On copie donc le programme
    echo "Exécution de ..."
    cp $1 $dossierChroot/bin/
    if [[ $? -ne 0 ]] ; then
        echo "ERREUR"
        exit
    fi
    echo " "
    shift
done
echo "Pensez à vérifier les droits des librairies ;)"

Voici ce que ça donne en pratique :

LightStar:~/33rr# ./chroot-addcmd.sh /home/franck/ /bin/ls /bin/cp /bin/mv /bin/cat
Exécution de cp /lib/tls/librt.so.1 /home/franck//lib/...
Exécution de cp /lib/libacl.so.1 /home/franck//lib/...
Exécution de cp /lib/tls/libc.so.6 /home/franck//lib/...
Exécution de cp /lib/tls/libpthread.so.0 /home/franck//lib/...
Exécution de cp /lib/ld-linux.so.2 /home/franck//lib/...
Exécution de cp /lib/libattr.so.1 /home/franck//lib/...
Exécution de cp /bin/ls /home/franck//bin/...

Exécution de cp /lib/libacl.so.1 /home/franck//lib/...
Exécution de cp /lib/tls/libc.so.6 /home/franck//lib/...
Exécution de cp /lib/libattr.so.1 /home/franck//lib/...
Exécution de cp /lib/ld-linux.so.2 /home/franck//lib/...
Exécution de cp /bin/cp /home/franck//bin/...

Exécution de cp /lib/libacl.so.1 /home/franck//lib/...
Exécution de cp /lib/tls/libc.so.6 /home/franck//lib/...
Exécution de cp /lib/libattr.so.1 /home/franck//lib/...
Exécution de cp /lib/ld-linux.so.2 /home/franck//lib/...
Exécution de cp /bin/mv /home/franck//bin/...

Exécution de cp /lib/tls/libc.so.6 /home/franck//lib/...
Exécution de cp /lib/ld-linux.so.2 /home/franck//lib/...
Exécution de cp /bin/cat /home/franck//bin/...

Pensez à vérifier les droits des librairies ;)

Et n'oublions pas le fameux

# chmod -R 755 /home/franck/lib

3 - Accès au compte utilisateur par ftp

Les serveurs Proftpd et Vsftpd nécessitent le rajout du shell /bin/chrootshell dans le fichier /etc/shells pour autoriser la connection au ftp de l'utilisateur :

# echo "/bin/chrootshell" >> /etc/shells

Rédémarrez ensuite le serveur ftp (ici pour proftpd) :

# /etc/init.d/proftpd restart

4 - Utiliser Ssh à partir du compte chrooté

  revoir la façon dont on indique quel utilisateur lance quelle commande

L'objectif est d'installer ssh pour l'utilisateur chrooté.

Lorsque vous lancez ssh, vous obtenez l'agréable message suivant :

bash-3.1$ ssh
You don't exist, go away!

Sympathique non ?
Pour y remédier, nous allons lancer les commandes suivantes pour montrer qu'on existe.

Lancez en tant que franck :

$ mkdir /etc/

En tant que root :

# grep franck /etc/passwd > /home/franck/etc/passwd

Ensuite, j'ai rajouté une librairie (merci google) :

# cp /lib/libnss_files.so.2 /home/franck/lib/

Mais il faut aussi pouvoir avoir des nombres aléatoires. On va donc créer /dev/random et /dev/urandom__ pour notre utilisateur. Lancez en tant que franck :

$ mknod -m 0444 /dev/random c 1 8
$ mknod -m 0444 /dev/urandom c 1 9

Ensuite il nous faut un /home/franck/ (dans le dossier chrooté) pour que ssh puisse y stocker ses clés. Lancez en tant que franck :

$ mkdir -p /home/franck/

Mettez le programme /usr/bin/ssh-keygen dans l'environnement. Lancez en tant que root :

# ./chroot-addcmd.sh /home/franck/ /usr/bin/ssh-keygen

Et pour finir, on créée les clés :

# ssh-keygen -t dsa
  ça marche toujours pas....
bash-3.1$ ssh fritz@192.168.1.1
Host key verification failed.
Vous êtes : 38.107.191.85 Dernière modification : 16/01/09 11:05 Propriétaire : cse35-1-82-236-141-159.fbx.proxad.net Modifié par : zoubiddaaa

Commentaires

Afficher les commentaires
Il n'y a aucun commentaire sur cette page