Table of Contents

LINUX: Créer une prison chroot minimale avec Dropbear et BusyBox sur CentOS

Cet article décrit la construction d'un environnement minimal ne contenant qu'un shell BusyBox et accessible via le serveur SSH de Dropbear. Cette configuration est probablement inutile pour une utilisation quotidienne, mais peut être utilisée comme base de test avec un minimum de bibliothèques disponibles. L'utilisation de cette configuration donne la possibilité d'expérimenter avec un environnement minimal sans reconstruire de petites images Linux.

Afin de créer cet environnement on va créer un système Linux accessible via SSH et contenant le moins possible de bibliothèques en utilisant:

Dropbear s’exécutera sous la prison chroot. Le système de fichiers racine de dropbear est en réalité /chroot/jail. L'accès au serveur SSH dans la prison peut être effectué à l'aide de la même adresse IP et du port sur lequel Dropbear est à l'écoute. Lorsque cet environnement est en place, on peuts facilement ajouter ou supprimer des bibliothèques pour vérifier les dépendances ou la compatibilité. Ces bibliothèques ne doivent pas nécessairement correspondre à celles de l'hôte.

Préparation chroot

La première chose à faire est de créer la structure du système de fichiers racine dont on a besoin pour un système minimal sous le répertoire choisi comme notre prison racine. Dans cet exemple: /chroot/busybox.

mkdir -pv /chroot/busybox

  mkdir: created directory ‘/chroot’
  mkdir: created directory ‘/chroot/busybox’
  
cd /chroot/busybox/
mkdir -pv dev/pts proc etc lib usr/lib var/run var/log

  mkdir: created directory ‘dev’
  mkdir: created directory ‘dev/pts’
  mkdir: created directory ‘proc’
  mkdir: created directory ‘etc’
  mkdir: created directory ‘lib’
  mkdir: created directory ‘usr’
  mkdir: created directory ‘usr/lib’
  mkdir: created directory ‘var’
  mkdir: created directory ‘var/run’
  mkdir: created directory ‘var/log’

ln -s lib/ lib64

Outre la structure de répertoires, nous avons également besoin de périphériques et de liens vers les répertoires /dev/pts et /proc d'origine:

mknod dev/urandom c 1 9
chmod 0666 dev/urandom
mknod dev/ptmx c 5 2
chmod 0666 dev/ptmx
mknod dev/tty c 5 0
chmod 0666 dev/tty
mount -o bind /dev/pts dev/pts/
mount -o bind /proc proc/

Puisqu'on veut se connecter au chroot, on a aussi besoin d’autres fichiers:

cp /etc/localtime etc/
cp /etc/nsswitch.conf etc/
cp /etc/resolv.conf etc/
cp /etc/host.conf etc/
cp /etc/hosts etc/
cp /etc/shells etc/
touch var/log/lastlog
touch var/run/utmp
touch var/log/wtmp

Compilation de Dropbear

Maintenant que la base du chroot est prête, on peut compiler la dernière version de Dropbear.

Tout d’abord, installer tous les composants nécessaires à la compilation de Dropbear, on a besoin d’un compilateur, de make et de quelques dépendances.

yum install wget gcc make zlib-devel bzip2 -y
...
Complete!

Télécharger la source de Dropbear et l'extraire. On peut trouver le code source de la dernière version sur: https://matt.ucc.asn.au/dropbear/releases/.

wget https://matt.ucc.asn.au/dropbear/releases/dropbear-2015.71.tar.bz2
  --2015-12-09 16:49:38--  https://matt.ucc.asn.au/dropbear/releases/dropbear-2015.71.tar.bz2
  Resolving matt.ucc.asn.au (matt.ucc.asn.au)... 130.95.13.18, 2405:3c00:5200:100::18
  Connecting to matt.ucc.asn.au (matt.ucc.asn.au)|130.95.13.18|:443... connected.
  HTTP request sent, awaiting response... 200 OK
  Length: 1616280 (1.5M) [application/x-bzip2]
  Saving to: ‘dropbear-2015.71.tar.bz2’
 
  100%[=====================================================>] 1,616,280    596KB/s   in 2.7s
 
  2015-12-09 16:49:42 (596 KB/s) - ‘dropbear-2015.71.tar.bz2’ saved [1616280/1616280]
 
tar -xvjf dropbear-2015.71.tar.bz2

Exécuter ./configure pour générer un fichier options.h et un fichier make pour la compilation. Indiquer l’emplacement de la prison chroot dans le préfixe.

./configure --prefix=/chroot/busybox checking for gcc... gcc ... configure: Now edit options.h to choose features.

Comme le suggère le résultat de ./configure, éditer options.h pour désactiver le transfert X. Cela exigerait que l'on ai Xauth et quelques dépendances. Puisque on veut avoir un nombre minimal de bibliothèques dépendantes,on peut éviter cela.

sed -i '/define\ XAUTH_COMMAND/d' options.h sed -i '/define\ ENABLE_X11FWD/d' options.h

Consulter toutes les définitions du fichier pour personnaliser un peu plus.

Après les modifications, on peut compiler Dropbear et l’installer dans la prison chroot:

make
...
make install
  install -d /chroot/busybox/sbin
  install dropbear /chroot/busybox/sbin
  install -d /chroot/busybox/share/man/man8
  install -m 644 ./dropbear.8 /chroot/busybox/share/man/man8/dropbear.8
  install -d /chroot/busybox/bin
  install dbclient /chroot/busybox/bin
  install -d /chroot/busybox/share/man/man1
  if test -e dbclient.1; then install -m 644 dbclient.1 /chroot/busybox/share/man/man1/dbclient.1; fi
  install -d /chroot/busybox/bin
  install dropbearkey /chroot/busybox/bin
  install -d /chroot/busybox/share/man/man1
  if test -e dropbearkey.1; then install -m 644 dropbearkey.1 /chroot/busybox/share/man/man1/dropbearkey.1; fi
  install -d /chroot/busybox/bin
  install dropbearconvert /chroot/busybox/bin
  install -d /chroot/busybox/share/man/man1
  if test -e dropbearconvert.1; then install -m 644 dropbearconvert.1 /chroot/busybox/share/man/man1/dropbearconvert.1; fi

Tout ce qui reste à faire pour la partie Dropbear, c’est de générer des clés qui seront utilisées par Dropbear. Dropbear a son propre format de clé, il est donc préférable d’utiliser ces utilitaires:

mkdir -pv /chroot/busybox/etc/dropbear

  mkdir: created directory ‘/chroot/busybox/etc/dropbear’

/chroot/busybox/bin/dropbearkey -t dss -f /chroot/busybox/etc/dropbear/dropbear.dss

  Generating key, this may take a while...
  Public key portion is:
  ssh-dss  AAAAB3NzaC1kc3MAAACBAMaVlM+SXpO6y7SSkPZcW87XvAw5oGXq1TAk+guDWEOezUN0Q8HNfYtmE8z7WwiXPOabJEaJgpOCfJWFxjpcc2OtZ+lDYesNJ8tfEFx6Pi3ObFp6UH0X9DCbZNes6iwxjuJRkRdB95rId3t4Cu/jKaqqJAY/U2U1TDXTVMwohQi/AAAAFQCqJbXOrkLadJ9+CF4ct96VJIDjewAAAIEAxIS6PfvqhPGGiaHbbSuu/60cUukdn6+SgJy11G1fUw70FssLndBSdMLHFQWMfl1CtYACC+f6sX4MoqzAKJoAKDwwt5ro+Q7afVj2XgeCghyosL9IoBx7HWzDXu+9ESCnGh9GQ1XtCoHS0wj9NFSjVT2KwUuE9LDh5qIRHnmql/IAAACAKr2ZePSW7ovjIx7By4EjhdJaOScnDxRMXWfmmURBDvSf7RWt+1icBr2zkBKSgyA8u4/v9Qhv9TijW98Y+/G84vcFW6L9qfkI1ZLo1wSDFpVo/bg4YjIqsnwY2W8AxVxNgJAj3TovPMk74GMcVwTllA8KVNugEvglwmNU2D9wapA= root@cen7
  Fingerprint: md5 b0:e1:25:d7:c1:2f:18:24:55:94:2b:d2:88:6f:98:76

/chroot/busybox/bin/dropbearkey -t rsa -s 4096 -f /chroot/busybox/etc/dropbear/dropbear.rsa
  Generating key, this may take a while...
  Public key portion is:
  ssh-rsa AAAB3NzaC1yc2EAAAADAQABAAACAQDTCBH2uVvrzmQHoW93dX52DnqT8jIkb0XI3Y6mdSN8ziepaGe9vQLYZs6rN4TfYqJTvpUFziS3Bj2FwKFKamrfvTw1uomTB/7YcfRtXnZLfuY3YXO+yKFcQfGzte7ulzcFKXZsnZhM1tDIH42+50z/qOdW7ZpnCtaMGD6ue3E6j0m/eqCQjkpRrEMNxTt5YKDIhtmq/zZOCGdTuUTvxzkqQwFWz2hwS5gruCHrcZtkRv9RzRnjspbbcQ0fDKns4jbjOhbsJtH06bW4FtSCdy67ySX88HzIwiAqGzJF0R8HtYM/yFgdemdOsgn+BEfgzcQjkdAdkLL1tmmgyTQZfndwTy1Q4zMHcwv3HCZJecGjQe67xJyWTNf5uH17Dlc5FYkyjf8MhPACWqbxyyRCSf3XOm0Y4JMyYtSGvR2iWnolNnrvdjYH+zhEWs8gfA2U74c5pvk6GrIprXnp9Ys/P0ItDXWA2kserN2JBWbuUyRWUPhJJAcDHSeV3SpCPNwwBmWPBkkduzqJCEkjJklTlPgBYEQxMcxrx6TkicsasFJEMzeD++s/tc5dMaedsMH5fwiEMQXT7n/9NTB3tEyY8PezoNai47HUjytzbiFsaPf5H8jFZ9xeEMP2Ce96+4A4elAzL4zZbEqqbyntCwkC9vqb+dIClU9+WF+2haQ9+NJjCQ== root@cen7
  Fingerprint: md5 ee:33:a3:1d:7b:69:15:f4:38:25:1b:35:b3:aa:93:82

Une dernière chose nécessaire pour pouvoir exécuter Dropbear dans le chroot est de vérifier les bibliothèques dont Dropbear a besoin:

ldd /chroot/busybox/sbin/dropbear
        linux-vdso.so.1 =>  (0x00007ffd8e70b000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f2546bbd000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f25469a7000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f254676f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f25463ae000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007f25461ab000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2546dc6000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f2545fa6000)

On peut simplement copier ces bibliothèques et certaines bibliothèques supplémentaires requises pour la connexion (et les mots de passe masqués) dans la lib (ou lib64) de la prison chroot:

cp /lib64/libutil.so.1 /chroot/busybox/lib/
cp /lib64/libz.so.1 /chroot/busybox/lib/
cp /lib64/libcrypt.so.1 /chroot/busybox/lib/
cp /lib64/libc.so.6 /chroot/busybox/lib/
cp /lib64/libfreebl3.so /chroot/busybox/lib/
cp /lib64/libdl.so.2 /chroot/busybox/lib/
cp /lib64/ld-linux-x86-64.so.2 /chroot/busybox/lib/
cp /lib64/libnss_dns.so.2 /chroot/busybox/lib/
cp /lib64/libnss_files.so.2 /chroot/busybox/lib/
cp /lib64/libnspr4.so /chroot/busybox/lib/
cp /lib64/libfreeblpriv3.chk /chroot/busybox/lib/
cp /lib64/libfreeblpriv3.so /chroot/busybox/lib/
cp /usr/lib64/libz.so.1 /chroot/busybox/usr/lib/

Installation de BusyBox

La prochaine partie de l’installation consiste à «installer» BusyBox. L’installation se fait entre guillemets, car installer BusyBox n’est rien de plus que télécharger un fichier binaire à partir d’Internet. On peut trouver la dernière version de BusyBox ici: https://busybox.net/downloads/binaries/.

Télécharger BusyBox, le renommer et lui accorder suffisamment d'autorisations:

cd /chroot/busybox/bin/
wget https://busybox.net/downloads/binaries/busybox-x86_64
  --2015-12-09 17:10:52--  https://busybox.net/downloads/binaries/busybox-x86_64
  Resolving busybox.net (busybox.net)... 140.211.167.224
  Connecting to busybox.net (busybox.net)|140.211.167.224|:443... connected.
  HTTP request sent, awaiting response... 200 OK
  Length: 1009384 (986K) [text/plain]
  Saving to: ‘busybox-x86_64’
 
  100%[=====================================================>] 1,009,384    508KB/s   in 1.9s
 
  2015-12-09 17:10:56 (508 KB/s) - ‘busybox-x86_64’ saved [1009384/1009384]
 
  FINISHED --2015-12-09 17:10:56--
  Total wall clock time: 4.4s
  Downloaded: 1 files, 986K in 1.9s (508 KB/s)

mv busybox-x86_64 busybox
chmod 0755 busybox

C’est essentiellement tout ce qu’il faut pour «installer» BusyBox.

Configuration de l'utilisateur

Maintenant que Dropbear et BusyBox sont installés dans la prison, il faut configurer un utilisateur qui aura accès à Dropbear. La méthode la plus simple consiste à créer un utilisateur normal avec useradd, puis à générer les fichiers nécessaires en fonction des lignes créées par useradd. Une autre option consiste à créer et à écrire les fichiers manuellement.

useradd test
passwd test
  
  Changing password for user test.
  New password:
  Retype new password:
  passwd: all authentication tokens updated successfully.

grep ^test /etc/passwd > /chroot/busybox/etc/passwd
grep ^test /etc/group > /chroot/busybox/etc/group
grep ^test /etc/shadow > /chroot/busybox/etc/shadow
cat /chroot/busybox/etc/passwd
  
  test:x:1001:1001::/home/test:/bin/bash

Comme on peut le voir dans la dernière ligne de la sortie ci-dessus. Le fichier /etc/passwd de la prison chroot contient un utilisateur, test, avec un répertoire personnel /home/test et shell /bin/bash. Le répertoire personnel n’existe pas dans la prison, pas plus que /bin/bash. Alors il faut créer le répertoire personnel:

mkdir -p /chroot/busybox/home/test chown test:test /chroot/busybox/home/test/

Il faut remplacer le shell de l'utilisateur par BusyBox. Afin d’appeler BusyBox en tant que shell et non pas en tant que commande unique, il est possible de créer une lien symbolique de /bin /sh à /bin/busybox. Puis on remplace /bin/bash par /bin/sh pour utiliser ce lien symbolique:

pwd

 /chroot/busybox/bin

ln -s busybox sh
ls -l sh

  lrwxrwxrwx. 1 root root 7 Dec  9 20:29 sh -> busybox

sed -i 's/bash/sh/' ../etc/passwd

Comme on peut le voir dans la sortie ci-dessus, il est important de créer le lien à partir du chemin correct afin de définir le chemin relatif comme lien pour sh dans /bin de la prison chroot.

Démarrer la prison chroot

On peut de démarrer la prison et vérifier si on peut se connecter au port 44 avec SSH.

chroot /chroot/busybox/ /sbin/dropbear -d /etc/dropbear/dropbear.dss -r /etc/dropbear/dropbear.rsa -E -w -g -p 0.0.0.0:44
  [13394] Dec 09 20:36:24 Failed loading /etc/dropbear/dropbear_rsa_host_key
  [13394] Dec 09 20:36:24 Failed loading /etc/dropbear/dropbear_dss_host_key
  [13394] Dec 09 20:36:24 Failed loading /etc/dropbear/dropbear_ecdsa_host_key
  [13395] Dec 09 20:36:24 Running in background

Dans la sortie ci-dessus, on peut voir que Dropbear a démarré, on a explicitement demandé à envoyer des messages à stdout avec l’option -E et à l’écoute sur le port 44.

La prochaine étape est un test sur le port 44 pour le test utilisateur.

ssh -p 44 localhost -l test
  [13397] Dec 09 20:36:31 Child connection from 127.0.0.1:48570
  The authenticity of host '[localhost]:44 ([127.0.0.1]:44)' can't be established.
  RSA key fingerprint is ee:33:a3:1d:7b:69:15:f4:38:25:1b:35:b3:aa:93:82.
  Are you sure you want to continue connecting (yes/no)? yes
  Warning: Permanently added '[localhost]:44' (RSA) to the list of known hosts.
  test@localhost's password:
  [13397] Dec 09 20:36:35 Password auth succeeded for 'test' from 127.0.0.1:48570
  ~ $ help
  Built-in commands:
  ------------------
        . : [ [[ alias bg break cd chdir command continue echo eval exec
        exit export false fg getopts hash help history jobs kill let
        local printf pwd read readonly return set shift source test times
        trap true type ulimit umask unalias unset wait
 
  ~ $ exit
  Connection to localhost closed.
  [13397] Dec 09 20:36:47 Exit (test): Disconnect received

On peut voir que la connexion réussit et qu'on se retrouve dans un shell BusyBox.

pour démarrer la prison chroot après un redémarrage, il faut remonter les supports de liaison

mount -o bind /dev/pts dev/pts/
mount -o bind /proc proc/
chroot /chroot/busybox/ /sbin/dropbear -d /etc/dropbear/dropbear.dss -r /etc/dropbear/dropbear.rsa -E -w -g -p 0.0.0.0:44
...
  [13422] Dec 09 20:40:41 Running in background

Et spour qu'il démarre automatiquement au démarrage, ajouter simplement les trois commandes ci-dessus à /etc/rc.d/rc.local