Documentation : User-Mode Linux HOWTO
Date de publication : 9.3.2005
Date de modification : 9.11.2005
|
|
Sommaire
Introduction aux UML
User-Mode Linux (UML) est une façon sécurisée de lancer différentes version de Linux sur une même machine, ou de lancer de façon sécurisée des processus Linux. Si vous tester des logiciels, de nouveaux kernel sans avoir a rebooter, désirez expérimenter de nouvelles distributions Linux sans avoir à réinstaller votre machine, ou encore mettre en place un pot de miel (HoneyPot) User-Mode Linux est alors fais pour vous.
User-Mode Linux vous fournis une machine vituel qui peut avoir plus de ressources hardware ou logiciels virtuelles que votre ordinateur physique. Le stockage de cette machine virtuel s'effectue dans un seul fichier sur votre ordinateur physique. Vous pouvez décider de ne donner accès à des ressources kernel qu'à ce qui sera configurer dans le kernel du serveur virtuel. Toutes actions sur le serveur virtuel n'a aucune répercution sur votre ordinateur physique ou les logiciels installés sur celui-ci.
Introduction au mode SKAS
Il est conseillé d'appliquer sur le kernel maître, celui de votre ordinateur physique, le patch SKAS.
Les effets du patch SKAS sur votre kernel maître augmente les performances de réactivité de vos UML. Un kernel patché avec SKAS est 30% plus rapide qu'un kernel normal. Grâce au patch SKAS il est possible de faire tourner jusqu'à 25 à 30 UML en même temps sans que la charge du serveur soit affectée.
Si vous lancer la commande ps sur le serveur maître, vous pourrez voir 4 processus par UML.
Si vous avez le mode SKAS d'activer sur votre kernel maître, vous pourrez voir ces lignes suivantes lors du démarrage d'un kernel esclave :
Checking for the skas3 patch in the host...found
Checking for /proc/mm...found
Pour appliquer le patch SKAS, il vous suffit de télécharger un kernel supporté par le patch SKAS et de patcher celui-ci avec ce même patch :
cat host-skas3-version.patch | patch -p1
Nous vous conseillons aussi d'appliquer le patch grsecurity sur le kernel maître afin de le sécuriser.
Patch UML
Le patch UML est utilisé sur le kernel hôte.
Pour appliquer ce patch il vous suffit de suivre la méthode suivante :
|
Vous voila avec un kernel hôte et ses modules installés dans le système de fichier hôte
Nous vous conseillons aussi d'appliquer le patch grsecurity sur le kernel UML afin de le sécuriser.
Les fichiers COW (Copy On Write )
Un système de fichier hôte en lecture seul peut être couplé à un fichier COW accessible en écriture et lecture, les modifications envoyées au système de fichier hôte en lecture seul sont enregistrées dans le fichier COW. L'avantage de cette façon de procéder est de permettre de partager un seul système de fichier hôte pour plusieurs UML (gain d'espace disque).
Les utilitaires UML
Afin de controler, d'administrer vos différents UML des utilitaires sont mises à dispositions, nous vous conseillons de les installer.
uml_mconsole :
L'utilitaire uml_mconsole est une interface de bas niveau du kernel UML. Cet utilitaire vous permet de réaliser plusieurs choses :Récupérer la version du kernel UML d'un hôte.
Ajouter ou supprimer des éléments de l'UML (disques, interfaces réseaux, etc.)
Arrêter et redémarrer un hôte UML
Envoyer des commandes SysRq au kernel
Mettre en pause et résumé un UML
Effectuer des backup à chaud sans avoir à stopper l'hôte UML
Recevoir des notifications d'évènements de l'hôte UML
Monitorer l'état interne de l'UML
Afin de pouvoir utiliser uml_mconsole, il vous faut activer "CONFIG_MCONSOLE" sous "General Setup" du kernel UML. Au démarrage vous devriez voir :
mconsole initialized on /var/uml/hote1/.uml/umlNJ32yL/mconsoleuml_moo :
Si vous utilisez un UML avec un élément COW (Copy On Write), il est envisageable de fusioner les changements du fichier COW dans un nouveau système de fichier.uml_mkcow :
La façon normale de créer un fichier COW est de spécifier un fichier COW non existant dans la ligne de commande UML, l'UML se chargera de le créer pour vous. Quelques fois vous désirez spécifier un nouveau fichier COW et vous ne désirez pas redémarrer l'UML pour le spécifier. uml_mkcow peut l'effectuer.uml_net :
Cet utilitaire est utilisé automatiquement par UML au lancement pour configurer le réseau, IP forwarding, le routing et les proxy arp.uml_switch :
Le démon de "switching" fournis un méchanisme pour créer des réseaux virtuels.
# Télécharger un stage3 correspondant à votre architecture sur les mirroirs de Gentoo
# Compiler votre kernel hôte avec la méthode indiquée ci-dessus, mais n'effectuez pas encore l'installation des modules
Important : Pour que le kernel hôte puisse démarrer correctement un système Gentoo, il doit etre configuré pour ne pas monter automatiquement /dev (devfs) par défaut. De plus, vous vous serez assuré d'avoir inclus tmpfs (le "Système de Fichiers en Mémoire Virtuelle" - "Virtual Memory Filesystem"), les fichiers de démarrage de Gentoo Linux stockant par défaut leurs informations dans une petite partition tmpfs. |
# Créer un répertoire /var/uml/gentoo-modele/
# Décompressez le stage3 dans ce répertoire
# Installer les modules du kernel UML dans ce répertoire avec la commande suivante :
make modules_install INSTALL_MOD_PATH=/var/uml/gentoo-modele/ ARCH=um
# Créer un répertoire /var/uml/gentoo-modele/usr/portage/distfiles
# Monter votre répertoire distfiles du serveur maître dans le répertoire /var/uml/gentoo-modele/ avec la commande suivante :
mount -o bind /usr/portage/distfiles /var/uml/gentoo-modele/usr/portage/distfiles
# Suivez la documentation d'installation Gentoo comme si vous installiez un véritable serveur.
# Avant de quitter le chroot du stage3, effectuer les opérations suivantes :
Editer le fichier /etc/inittab et rajouter :
c0:12345:respawn:/sbin/agetty 38400 tty0 linuxEditer le fichier /etc/fstab et mettre :
/dev/ubd/0 / ext3 noatime 0 0
/dev/ubd/1 none swap sw 0 0
none /proc proc defaults 0 0Supprimer les services suivant :
rc-update del consolefont boot
rc-update del keymaps bootEditer le fichier /etc/securetty et rajouter vc/0
# Finaliser l'installation suivant vos besoins
# Quitter le chroot et démonter les points de montages.
exit
umount /var/uml/gentoo-modele/usr/portage/distfiles
# Compressez le contenu du répertoire /var/uml/gentoo-modele/ :
tar cvjpf ~/gentoo.tbz2 /var/uml/gentoo-modele/
On part sur le principe que l'OS ne doit pas faire plus de 5G
mkdir /var/uml/shared/
cd /var/uml/shared/
On créé un fichier de 5G et on le convertis au format ext3.
dd if=/dev/zero of=root_fs.gentoo seek=$[5*1024*1024] count=1 bs=1k
mke2fs -Fj root_fs.gentoo
On monte ce fichier pour y décompresser l'archive gentoo.tbz2
mount -o loop root_fs.gentoo /mnt/loop
tar xvjpf gentoo.tbz2 -C /mnt/loop
On demonte le fichier et on le rend accessible en lecture seule.
umount /mnt/loop
chmod 444 /home/uml/shared/root_fs.gentoo
Nous voila avec notre système de fichier Gentoo accessible en lecture seule.
Mise en pratique : Préparation du réseau
Nous partons sur le principe d'utiliser TUNAP pour partager le réseau entre le serveur maître et les serveurs UML hôte.
Activez TUNAP et 802.1d Ethernet Bridging dans le kernel
Installons les utilitaires de configuration des bridges Ethernet 802.1d
emerge bridge-utils
On créé un groupe untrusted dans lequel seront mis tous les utilisateurs hôtes UML, ce groupe pourra aussi servir au monitoring des actions effectuées par grsecurity.
groupadd untrusted
chmod 660 /dev/net/tun
chown root.untrusted /dev/net/tun
Mise en pratique : Préparation de la mise en place d'un UML
Nous allons lancer chaque UML sous une identitée propre, pour cela il nous faut créer un utilisateur pour chaque UML.
useradd -s /bin/bash -d /var/uml/uml1 -g untrusted -m uml1
On va aussi créer un fichier swap de 128 M pour chaque UML
cd /var/uml/uml1
dd if=/dev/zero of=swap_fs bs=1k count=1 seek=$[128*1024]
mkswap -f swap_fs
chown uml1:untrusted swap_fs
Mise en pratique : Script de démarrage d'un UML
Nous allons lancer chaque UML dans un screen, ce qui nous permettra de prendre la main dessus d'un façon aisée, et nous attribuons une mémoire de 128 M pour chaque UML.
# launch_uml1.sh |
Rendre bien sûr exécutable ce script de démarrage.
Mise en pratique : Démarrage d'un UML
Pour démarrer un UML il vous suffit de taper la commande suivante :
./lunch_uml1.sh
Pour prendre la main sur celui-ci, taper la commande suivante :
screen -r uml1
Et voila le tour est joué, vous avez une gentoo tournant sur une gentoo.
Contributeur : Eric Romang