Différences entre les pages « Serveur de courriel » et « UserModeLinux »

De Cliss XXI
(Différence entre les pages)
Sauter à la navigation Sauter à la recherche
imported>SylvainBeucler
 
imported>SylvainBeucler
 
Ligne 1 : Ligne 1 :
Le but de l'article est de mettre en place un serveur de courriel relativement simple, de la manière la plus automatisée possible.
+
== Compilation du noyau utilisateur ==
  
Scripts à venir.
+
C'est très simple: on compile le noyau Linux avec le paramètre <code>ARCH=um</code> ''pour chaque commande''.
  
On se basera sur Postfixadmin (la version SVN, sous GNU GPL, pas la dernière stable), ainsi que sur l'excellent [http://high5.net/howto/ HOWTO] associé, qui n'a pour défaut que d'être un peu fouillis (gère Debian et FreeBSD suivant plusieurs variantes de configuration), et surtout de ne pas être automatisé! :)
+
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2
 +
tar xjf linux-2.6.17.13.tar.bz2
 +
cd linux-2.6.17.13
  
* [[Postfix]]
+
make defconfig ARCH=um
* [[Postfix et SASL]]: tentative de compréhension
+
make xconfig ARCH=um # facultatif; pensez à activer HOSTFS si besoin
* [[Postfix et sécurité]]: autre tentative de compréhension
+
make ARCH=um
* [[SPAM]]
+
strip linux
* [[Cyrus]]: administration manuelle des BALs
 
  
==Liens==
+
Cf. [http://user-mode-linux.sourceforge.net/new/source.html Building from source] chez UML.
  
* http://genco.gen.tc/postfix_sasl_courier_mysql_virtual_maildrop_squirrelmail_quota.php: un autre HOWTO
+
== Construction du système de base ==
* http://www.littleboboy.net/?2005/04/15/54-postfix-courier-imap: un autre HOWTO en français cette fois
 
* http://www.i-boot.net/mailserver/ : installation à base de LDAP liée avec EGroupWare, licence pas claire
 
  
== Partager le courriel en interne ==
+
On se propose de construire et de lancer un système UML sans aucun accès root.
  
* Installer courier-imap sur un poste (serveur)
+
Vraisemblablement, ce n'est pas possible facilement. Cela est dû au manque d'outil en mode utilisateur pour travailler directement sur des systèmes de fichiers ext3.
* Utiliser un même compte sur chacun des postes clients
 
* Dans /etc/courier/imapd : IMAP_ENHANCEDIDLE=1 , pour synchroniser les différents clients immédiatement après chaque opération (ajout, suppression...).
 
  
== Test/debug d'une configuration ==
+
== Tentative 1 ==
  
* Exim (résultat sur la sortie standard; killer!):
+
Essayons de créer un système complet, sans faire d'image, et en possédant tous les fichiers:
sendmail -bt adresse # -bt == 'back-trace'
 
sendmail -bt -d adresse # -d == 'debug', more verbose
 
* Postfix (résultat par mail, nettement moins pratique [http://www.postfix.org/DEBUG_README.html#trace_mail]):
 
sendmail -bv adresse # sans envoi réel
 
sendmail -v adresse # avec envoi réel
 
  
Pour courier, ajouter dans <code>/etc/courier/imapd</code>:
+
La dernière version de debootstrap propose une variante ''fakechroot'' qui permet de l'utiliser sans accès root:
  IMAPDEBUGFILE=imapdebug.txt
+
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:$PATH # pour trouver la commande 'chroot'
 +
fakechroot /usr/sbin/debootstrap --variant=fakechroot sarge sarge-uml/ http://localhost/mirrors/debian
 +
/usr/src/linux-2.6.17.13/linux  root=/dev/root rootflags=/home/sylvain/tests/uml/debian/sarge-uml/ rootfstype=hostfs
 +
 
 +
Résultat: cela ne fonctionne pas, à mon avis parce que dans ce cas précis sarge-uml/dev est un lien symbolique vers /dev.
 +
 
 +
== Tentative 2 ==
 +
 
 +
Essayons à partir d'une image UML déjà opérationnelle.
 +
 
 +
[http://packages.debian.org/unstable/utils/rootstrap rootstrap] fonctionne apparemment sur ce principe.
 +
Je n'ai pas réussi mais je n'ai pas beaucoup cherché.
 +
 
 +
== En mode root ==
 +
 
 +
Faute de mieux, utilisons sudo:
 +
 
 +
mkdir loop/
 +
# image de 1Go, à trous (espace disque progressif)
 +
dd if=/dev/null of=image count=0 bs=1G seek=1
 +
# on formatte en ext3
 +
/sbin/mkfs.ext3 -F image
 +
 +
sudo mount image loop/ -o loop
 +
sudo debootstrap sarge loop/ http://192.168.1.60/mirrors/debian
 +
 +
# configuration de la console:
 +
sudo grep -v tty loop/etc/inittab > inittab.work
 +
sudo echo "1:2345:respawn:/sbin/getty 38400 console linux" >> inittab.work
 +
sudo mv inittab.work loop/etc/inittab
 +
 +
# configuration réseau:
 +
sudo echo -e "auto lo\niface lo inet loopback" > loop/etc/network/interfaces
 +
 +
sudo umount loop/
 +
 
 +
== Réseau ==
 +
 
 +
Imaginez un câble virtuel qui relie la machine hôte et la machine UML, une carte carte réseau virtuelle à chaque bout. Chaque carte a une adresse IP, mais comme sur un réseau classique, les deux cartes ne doivent pas avoir la même adresse.
 +
 
 +
=== mode root ===
 +
 
 +
host# sudo /usr/src/linux ubda=sarge-debootstrap eth0=tuntap,,,192.168.1.101
 +
 
 +
Notez les messages d'UML indiquant la mise en place d'une interface tuntap <code>tap0</code>, une route pour accéder à la machine virtuelle, et un partage de connexion pour que la machine virtuelle puisse accéder au réseau extérieur.
 +
 
 +
Puis dans UML:
 +
 
 +
uml# ifconfig eth0 192.168.1.201
 +
 +
=== Mode utilisateur avec tuntap ===
 +
 
 +
Pour utiliser tuntap, il faut créer à l'avance (et en mode root) une interface tap0 et lui assigner une adresse IP.
 +
 
 +
# tunctl -u sylvain
 +
Set 'tap0' persistent and owned by uid 1000
 +
 
 +
Puis il faut donner des droits aux utilisateurs non-privilégiés d'utiliser tuntap (en mode root aussi):
 +
 
 +
chmod 666 /dev/net/tun
 +
 
 +
C'est une solution efficace mais qui nécessite plusieurs étapes de préconfiguration en mode root, accompagné de permissions lâches sur tuntap.
 +
 
 +
 
 +
=== Mode utilisateur avec tuntap (2) ===
 +
 
 +
Mettre l'utilisateur concerné dans le groupe <code>uml-net</code>. Ce groupe a accès au programme setuid <code>/usr/lib/uml/uml_net</code>, qui peut lancer et configurer des interfaces tuntap. La sécurité du procédé n'est pas grande (l'utilisateur peut créer de nouvelles interfaces réseau et perturber iptables par exemple), mais est facile à mettre en place.
 +
 
 +
host# /usr/src/linux ubda=sarge-debootstrap umid=deb eth0=tuntap,,,10.10.10.10
 +
uml# ifconfig eth0 10.10.10.11
 +
iml# route add default gw 10.10.10.10
 +
 
 +
=== Mode utilisateur avec slirp ===
 +
 
 +
Lancer UML avec une interface slirp, en utilisant le binaire 'fullbolt' (qui s'affranchit de la limitation débit de 10ko/s dans slirp 'classique'):
 +
 
 +
  host# /usr/src/linux ubda=sarge-debootstrap umid=deb eth0=slirp,,/usr/bin/slirp-fullbolt
 +
 
 +
Dans UML, quelques étapes spécifiques à slirp sont nécessaires:
 +
 
 +
# Configurer l'interface sur 10.2.0.15 (IP de choix pour slirp)
 +
ifconfig eth0 10.2.0.15
 +
# Utiliser la redirection DNS 10.0.2.3
 +
echo "10.0.2.3" > /etc/resolv.conf
 +
# Ajouter une route par défaut vers eth0:
 +
route add default dev eth0
 +
 
 +
== Liens ==
 +
 
 +
* [http://user-mode-linux.sourceforge.net/new/ The User-mode Linux Kernel Home Page]: lien direct vers la nouvelle version du site - on s'y retrouve mieux
 +
* [http://eggdrop.ch/texts/uml/ Running Debian inside of Debian with User-Mode Linux]
 +
* [http://www.metz.supelec.fr/metz/personnel/galtier/PagesPerso/TutorielUML/index.html Tutoriel User Mode Linux]: avec introduction à SKAS et réseau
 +
 
 +
* [http://user-mode-linux.sourceforge.net/UserModeLinux-HOWTO-6.html#ss6.11 Slirp] dans le UML HOWTO.
 +
 
 +
== Dépannage ==
 +
 
 +
Kernel panic - not syncing: start_userspace : expected SIGSTOP, got status = 256
 +
 
 +
Cf. http://www.mail-archive.com/user-mode-linux-devel@lists.sourceforge.net/msg03414.html
 +
 
 +
Votre noyau (hôte) est, si j'ai bien compris, mal configuré. Recompilez-le ou utilisez-en un autre.

Version du 18 septembre 2006 à 16:14

Compilation du noyau utilisateur

C'est très simple: on compile le noyau Linux avec le paramètre ARCH=um pour chaque commande.

wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2
tar xjf linux-2.6.17.13.tar.bz2
cd linux-2.6.17.13
make defconfig ARCH=um
make xconfig ARCH=um # facultatif; pensez à activer HOSTFS si besoin
make ARCH=um
strip linux

Cf. Building from source chez UML.

Construction du système de base

On se propose de construire et de lancer un système UML sans aucun accès root.

Vraisemblablement, ce n'est pas possible facilement. Cela est dû au manque d'outil en mode utilisateur pour travailler directement sur des systèmes de fichiers ext3.

Tentative 1

Essayons de créer un système complet, sans faire d'image, et en possédant tous les fichiers:

La dernière version de debootstrap propose une variante fakechroot qui permet de l'utiliser sans accès root:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:$PATH # pour trouver la commande 'chroot'
fakechroot /usr/sbin/debootstrap --variant=fakechroot sarge sarge-uml/ http://localhost/mirrors/debian
/usr/src/linux-2.6.17.13/linux  root=/dev/root rootflags=/home/sylvain/tests/uml/debian/sarge-uml/ rootfstype=hostfs

Résultat: cela ne fonctionne pas, à mon avis parce que dans ce cas précis sarge-uml/dev est un lien symbolique vers /dev.

Tentative 2

Essayons à partir d'une image UML déjà opérationnelle.

rootstrap fonctionne apparemment sur ce principe. Je n'ai pas réussi mais je n'ai pas beaucoup cherché.

En mode root

Faute de mieux, utilisons sudo:

mkdir loop/
# image de 1Go, à trous (espace disque progressif)
dd if=/dev/null of=image count=0 bs=1G seek=1
# on formatte en ext3
/sbin/mkfs.ext3 -F image

sudo mount image loop/ -o loop
sudo debootstrap sarge loop/ http://192.168.1.60/mirrors/debian

# configuration de la console:
sudo grep -v tty loop/etc/inittab > inittab.work
sudo echo "1:2345:respawn:/sbin/getty 38400 console linux" >> inittab.work
sudo mv inittab.work loop/etc/inittab

# configuration réseau:
sudo echo -e "auto lo\niface lo inet loopback" > loop/etc/network/interfaces

sudo umount loop/

Réseau

Imaginez un câble virtuel qui relie la machine hôte et la machine UML, une carte carte réseau virtuelle à chaque bout. Chaque carte a une adresse IP, mais comme sur un réseau classique, les deux cartes ne doivent pas avoir la même adresse.

mode root

host# sudo /usr/src/linux ubda=sarge-debootstrap eth0=tuntap,,,192.168.1.101

Notez les messages d'UML indiquant la mise en place d'une interface tuntap tap0, une route pour accéder à la machine virtuelle, et un partage de connexion pour que la machine virtuelle puisse accéder au réseau extérieur.

Puis dans UML:

uml# ifconfig eth0 192.168.1.201

Mode utilisateur avec tuntap

Pour utiliser tuntap, il faut créer à l'avance (et en mode root) une interface tap0 et lui assigner une adresse IP.

# tunctl -u sylvain
Set 'tap0' persistent and owned by uid 1000

Puis il faut donner des droits aux utilisateurs non-privilégiés d'utiliser tuntap (en mode root aussi):

chmod 666 /dev/net/tun

C'est une solution efficace mais qui nécessite plusieurs étapes de préconfiguration en mode root, accompagné de permissions lâches sur tuntap.


Mode utilisateur avec tuntap (2)

Mettre l'utilisateur concerné dans le groupe uml-net. Ce groupe a accès au programme setuid /usr/lib/uml/uml_net, qui peut lancer et configurer des interfaces tuntap. La sécurité du procédé n'est pas grande (l'utilisateur peut créer de nouvelles interfaces réseau et perturber iptables par exemple), mais est facile à mettre en place.

host# /usr/src/linux ubda=sarge-debootstrap umid=deb eth0=tuntap,,,10.10.10.10
uml# ifconfig eth0 10.10.10.11
iml# route add default gw 10.10.10.10

Mode utilisateur avec slirp

Lancer UML avec une interface slirp, en utilisant le binaire 'fullbolt' (qui s'affranchit de la limitation débit de 10ko/s dans slirp 'classique'):

host# /usr/src/linux ubda=sarge-debootstrap umid=deb eth0=slirp,,/usr/bin/slirp-fullbolt

Dans UML, quelques étapes spécifiques à slirp sont nécessaires:

# Configurer l'interface sur 10.2.0.15 (IP de choix pour slirp)
ifconfig eth0 10.2.0.15
# Utiliser la redirection DNS 10.0.2.3
echo "10.0.2.3" > /etc/resolv.conf
# Ajouter une route par défaut vers eth0:
route add default dev eth0

Liens

Dépannage

Kernel panic - not syncing: start_userspace : expected SIGSTOP, got status = 256

Cf. http://www.mail-archive.com/user-mode-linux-devel@lists.sourceforge.net/msg03414.html

Votre noyau (hôte) est, si j'ai bien compris, mal configuré. Recompilez-le ou utilisez-en un autre.