Outils personnels
Vous êtes ici : Accueil GNU / Linux Debian Créer un chroot en mode paranoïaque sur Debian 4.0 Etch
Actions sur le document
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

Créer un chroot en mode paranoïaque sur Debian 4.0 Etch

Par Pierre-Yves Landuré - Dernière modification 25/01/2008 08:49

Je n'ai que de maigres connaissances en sécurité système, mais je vais quand même expérimenter la création d'un chroot très difficile à "pourrir". Pour ce faire, je vais utiliser différentes techniques afin de rendre inutilisables certaines commandes du chroot et que le chroot en lui même soit non modifiable. Je ne garantie aucunement la validité des informations de cette pages, ni leur complétude. Cependant, j'ai fait de mon mieux pour que le résultat de ce howto soit très difficilement piratable. Attention : ce howto implique que tout serveur ouvert sur l'internet ce trouve dans un chroot de ce type. Si ce n'est pas la cas, ce guide ne vous sera d'aucune utilité.

Pré-requis

En premier lieu, il faut installer le logiciel permettant de créer facilement des chroots :

/usr/bin/apt-get install debootstrap

De plus, ce guide étant particulièrement gourmand en "devices" loop, vous devez augmentez leur nombre si vous souhaitez utiliser ce guide pour plusieurs chroot :

echo "# Allow up to 64 loopback devices
options loop max_loop=64" \
| tee /etc/modprobe.d/loop

Remarque : vous devez redémarrer votre système pour prendre en compte ce paramètre OU démonter tous vos montages loopback et exécuter les commandes :

rmmod loop
modprobe loop

Configuration de l'environnement du chroot

Afin de simplifier au maximum ce mode d'emploi, nous allons stocker le nom de notre prison dans une variable d'environnement :

CHROOT_JAIL_NAME=nom-de-la-prison

Evitez d'utiliser des espaces et autres caractères spéciaux dans ce nom, car il sera utilisé par la suite pour créer le dossier contenant votre prison chroot. Une fois cette variable créée, configurez le dossier où vous souhaitez créer votre prison :

CHROOT_JAIL_ROOT=/home/roots

Créez ensuite le dossier de l'environnement de la future prison :

/bin/mkdir $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME

Et enfin, créez le dossier dans lequel sera monté la prison :

/bin/mkdir $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system

Création des partitions virtuelles

Non, je ne vais pas vous faire modifier les partitions de votre disque dur ! Par partitions virtuelles, j'entends les fichiers qui contiendront le système de fichier de votre chroot. Il nous en faut 4 :

  • / (cad. root) : D'une taille d'environ 500 Mo, cette partition contiendra les logiciels installés dans notre chroot.
  • dev : D'une taille de 10 Mo, cette partition contiendra les 2 ou 3 fichiers blocks qui seront nécessaires à notre chroot.
  • tmp : D'une taille de 250 Mo (par sécurité), cette partition sera en lecture écriture. C'est la partition utilisée pour les fichiers temporaires.
  • var : D'une taille de 300 Mo (ou plus si vous êtes riches en espace disque), cette partition contiendra vos données.

Création et configuration du root

Le root est la base de votre système. Pour la créer, commencez par créer le fichier de 500 Mo qui la contiendra :
/bin/dd if=/dev/zero of=$CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/root.fs bs=1024 count=500000

Vous devez ensuite créer un système de fichier ext3 (ou autre système de fichier pouvant contenir un linux) grâce à la commande :

/sbin/mkfs.ext3 -F $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/root.fs

En fonctionnement normal, cette partition sera montée avec les options suivantes :

  • loop : La partition est contenue dans un fichier.
  • nodev : La partition ne peut contenir des fichiers spéciaux.
  • ro : La partition est en lecture seule.

Pour l'installation, nous allons nous contenter de la monter avec les options loop et rw :

/bin/mount -text3 -o loop,rw $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/root.fs $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system

Nous y créons ensuite les dossiers nécessaires à nos autres points de montage :

/bin/mkdir $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/var
/bin/mkdir $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/tmp
/bin/mkdir $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/dev

Création et configuration de dev

Le dev est nécessaire dans un système, ne serait-ce que pour /dev/null et /dev/random. Pour la créer, commencez par créer le fichier de 1 Mo qui la contiendra :

/bin/dd if=/dev/zero of=$CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/dev.fs bs=1024 count=10000

Vous devez ensuite créer un système de fichier ext3 (ou autre système de fichier pouvant contenir un linux) grâce à la commande :

/sbin/mkfs.ext3 -F $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/dev.fs

En fonctionnement normal, cette partition sera montée avec les options suivantes :

  • loop : La partition est contenue dans un fichier.
  • nosuid : La partition ne peut contenir des fichiers avec le bit suid.
  • noexec : La partition ne peut contenir des fichiers exécutables.
  • ro : La partition est en lecture seule.

Pour l'installation, nous allons nous contenter de la monter avec les options loop et rw :

/bin/mount -text3 -o loop,rw $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/dev.fs $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/dev

Création et configuration de tmp

Le tmp est destiné à contenir tous les fichiers temporaires. Cette partition sera réinitialisée à chaque redémarrage de notre chroot. Pour la créer, commencez par créer le fichier de 250 Mo qui la contiendra :

/bin/dd if=/dev/zero of=$CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/tmp.fs bs=1024 count=250000

Vous devez ensuite créer un système de fichier ext3 (ou autre système de fichier pouvant contenir un linux) grâce à la commande :

/sbin/mkfs.ext3 -F $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/tmp.fs

En fonctionnement normal, cette partition sera montée avec les options suivantes :

  • loop : La partition est contenue dans un fichier.
  • nosuid : La partition ne peut contenir des fichiers avec le bit suid.
  • noexec : La partition ne peut contenir des fichiers exécutables.
  • nodev : La partition ne peut contenir des fichiers spéciaux.
  • rw : La partition est en lecture-écriture.

Pour l'installation, nous allons nous contenter de la monter avec les options loop et rw :

/bin/mount -text3 -o loop,rw $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/tmp.fs $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/tmp

Création et configuration de var

Le var est destiné à contenir tous les fichiers de données et de cache. C'est l'endroit ou linux stocke toutes les données de fonctionnement persistantes de votre système d'exploitation. Plus précisément /var/lib et /var/www sont les deux emplacements vraiment importants de votre système. Pour la créer, commencez par créer le fichier de 300 Mo qui la contiendra :

/bin/dd if=/dev/zero of=$CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/var.fs bs=1024 count=300000

Vous devez ensuite créer un système de fichier ext3 (ou autre système de fichier pouvant contenir un linux) grâce à la commande :

/sbin/mkfs.ext3 -F $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/var.fs

En fonctionnement normal, cette partition sera montée avec les options suivantes :

  • loop : La partition est contenue dans un fichier.
  • nosuid : La partition ne peut contenir des fichiers avec le bit suid.
  • noexec : La partition ne peut contenir des fichiers exécutables.
  • nodev : La partition ne peut contenir des fichiers spéciaux.
  • rw : La partition est en lecture-écriture.

Pour l'installation, nous allons nous contenter de la monter avec les options loop et rw :

/bin/mount -text3 -o loop,rw $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/var.fs $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/var

Création du chroot

Nous pouvons maintenant lancer la création de notre chroot :

/usr/sbin/debootstrap etch $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system http://ftp2.fr.debian.org/debian/

La commande debootstrap va télécharger les paquets correspondants à la distribution choisie et va les installer dans le dossier de votre prison chroot. Cet étape peut prendre plusieurs minutes suivant la rapidité de votre connexion Internet. Enfin, nous créons le fichier debian_chroot qui nous permet de savoir quand nous travaillons dans le chroot :

/bin/echo $CHROOT_JAIL_NAME > $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/etc/debian_chroot

Configuration de apt-get

Vérifiez que le contenu du fichier sources.list de la prison correspond à vos besoins :

/bin/cat $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/etc/apt/sources.list

Si il ne correspond pas à vos besoins, vous pouvez le compléter avec la commande suivante (pour un chroot Debian 4.0 Etch) :

/bin/echo "deb ftp://ftp2.fr.debian.org/debian/ etch main contrib non-free
deb-src ftp://ftp2.fr.debian.org/debian/ etch main contrib non-free
deb http://security.debian.org/ etch/updates main contrib non-free" \
> $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/etc/apt/sources.list

N'oubliez pas de mettre à jour la liste des paquets disponibles une fois cette opération effectuée:

/usr/sbin/chroot $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system \
/usr/bin/apt-get update

Ensuite, nous installons locales :

/usr/sbin/chroot $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system \
/usr/bin/apt-get install locales

Mise en place de la gestion des emails

Avant d'aller plus loin, il nous faut monter le système de fichier proc :

/bin/mount -tproc proc $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/proc

Il nous faut remplacer le MTA (Mail Transport Agent : le serveur mail quoi :D) de la prison (par défaut exim) par nullmailer qui est un MTA qui se contente de transférer les emails du systèmes vers un autre serveur mail. Exim sera automatiquement supprimé par cette installation :

/usr/sbin/chroot $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system \
/usr/bin/apt-get install nullmailer mailx

Ce qui nous interesse ici est de transférer les emails généré par l'environnement emprisonné vers le serveur mail de la machine hôte. Pour obtenir ce résultat, utilisez les options suivantes :

  • nom de courrier du système : localhost.localdomain
  • Machines relais : localhost.localdomain

Remarque: pensez à vérifier que localhost.localdomain est présent dans le fichier hosts du chroot.

Mise en place de la gestion des scripts cron

Il suffit simplement d'installer cron:

/usr/sbin/chroot $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system \
/usr/bin/apt-get install cron

Mise en place de la rotation des logs de la prison

Bien que la plupart des logiciels enregistrent leur actions par l'intermédiaire de sysklogd (ce que nous avons configuré plus haut), ceux pour qui ce n'est pas le cas stockent leur fichiers logs dans la prison même (c'est le cas par exemple pour apache). Nous allons donc faire en sorte que la rotation des fichiers logs s'applique aussi à ceux de la prison. Pour ce faire, nous  installons logrotate:
/usr/sbin/chroot $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system \
/usr/bin/apt-get install logrotate

Installation de cron-apt dans la prison

cron-apt est un logiciel très pratique qui surveille les mises à jour disponibles pour votre installation. Nous allons configurer ce logiciel pour l'adapter à notre prison. En premier lieu, nous installons le paquet :

/usr/sbin/chroot $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system \
/usr/bin/apt-get install cron-apt

Ensuite, nous configurons le paquet pour qu'il envoie des emails à l'utilisateur root lorsque des mises à jour sont disponibles :

/bin/sed -i -e 's/^#[ \t]*\(MAILTO="root"\)/\1/' \
-e '/^#[ \t]*\(MAILON="error"\)/a\
MAILON="upgrade"' \
$CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/etc/cron-apt/config

Installation du script de démarrage de la prison

Nous allons maintenant mettre en place le script init.d destiné à faire démarrer les démons de la prison (cron, nullmailer, etc...). Nous commençons par mettre en place un fichier de configuration par défaut pour ce script :

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/creer-un-chroot-en-mode-paranoiaque-sur-debian-4-0-etch/chroot-environment \
--output-document=$CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/chroot-environment

L'utilité de ce fichier est expliqué à la fin de cet article.

Nous mettons maintenant en place le script de démarrage de la prison :

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/creer-un-chroot-en-mode-paranoiaque-sur-debian-4-0-etch/chrooted-initd \
--output-document=/etc/init.d/chrooted-$CHROOT_JAIL_NAME
/bin/chmod +x /etc/init.d/chrooted-$CHROOT_JAIL_NAME

Et nous l'adaptons à notre prison :

/bin/echo $CHROOT_JAIL_ROOT | /bin/sed -e 's/\//\\\\\//g' | \
/usr/bin/xargs -iCHROOT_JAIL_ROOT_VALUE /bin/sed -i -e \
"s/CHROOT_JAIL_ROOT/CHROOT_JAIL_ROOT_VALUE/g" \
/etc/init.d/chrooted-$CHROOT_JAIL_NAME
/bin/sed -i -e "s/CHROOT_JAIL_NAME/$CHROOT_JAIL_NAME/g" /etc/init.d/chrooted-$CHROOT_JAIL_NAME

Fin de la configuration

En premier lieu, nous allons arrêter notre prison :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME stop

Nous montons la prison proprement et nous faisons en sorte qu'elle soit modifiable :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME mount
/etc/init.d/chrooted-$CHROOT_JAIL_NAME read-write

et nous l'adaptons à la configuration du système hôte :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME setup

Une fois ceci fait, nous nettoyons le contenu du dossier /dev de la prison afin de ne laisser que les fichiers spéciaux vitaux :

/usr/bin/find $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/dev -mindepth 1 \
| /bin/egrep -v "stdin|stderr|stdout|console|fd|core|tty|null|zero|random|log|xconsole|lost\+found" \
| /usr/bin/xargs /bin/rm

Puis nous désactivons certaines des commandes qui pourraient poser des problèmes immédiats de sécurité :

rm $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/bin/mount
rm $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/bin/umount
rm $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/system/usr/sbin/chroot

Et nous désinstallons le sysklogd de la prison qui pose plus de problèmes qu'autre choses :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME remove sysklogd

Nous pouvons enfin démonter la prison

/etc/init.d/chrooted-$CHROOT_JAIL_NAME umount

Premier démarrage de la prison

Vous pouvez maintenant démarrer votre prison avec la commande :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME start

et l'arrêter avec :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME stop

Ce script est aussi capable de commander à un service précis de la prison. Par exemple, pour redémarrer nullmailer :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME nullmailer restart

Important : Vous pouvez obtenir plus d'information sur l'utilisation de ce script avec la commande :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME help

Remarque : Si vous souhaitez que votre prison soit démarrée en même temps que le système hôte, exécutez la commande :

update-rc.d chrooted-$CHROOT_JAIL_NAME defaults

Installer un serveur dans la prison

Cette prison étant destinée à accueillir des serveurs dans un environnement protégé, nous allons utiliser Apache 2 comme exemple d'installation de serveur dans la prison. En premier lieu, nous installons Apache 2 dans la prison :

/etc/init.d/chrooted-$CHROOT_JAIL_NAME install apache2

Nous configurons ensuite les options de démarrage de la prison afin de prendre en compte Apache 2. Nous éditons le fichier de configuration de la prison :

/usr/bin/nano $CHROOT_JAIL_ROOT/$CHROOT_JAIL_NAME/chroot-environment

Ajoutez apache2 (nom du script init.d d'Apache 2) à la ligne suivante :

INITD_SCRIPTS="cron nullmailer"

pour obtenir :

INITD_SCRIPTS="cron nullmailer apache2"

Apache 2 sera maintenant démarré lors du démarrage de la prison. Répétez la même procédure pour vos autres serveurs.

Attachements
BlogBang
Navigation
 

Réalisé avec Plone

Ce site respecte les normes suivantes :

Wikio