Créer un chroot en mode paranoïaque sur Debian 4.0 Etch
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.