L'un des problèmes potentiels de sécurité de Xen vient du fait que le dom0 contrôle toutes les ressources matérielles de la machine, parmis lesquelles la ou les cartes réseau. De fait, le dom0 se retrouve un peu malgré lui en tête de pont sur Internet, là ou la logique voudrait au contraire qu'il soit protégé, puisqu'étant une machine invitée avec privilèges.
Un projet comme Qubes-os permet, entre autres, de contrôler les cartes réseaux depuis un domU dédié. Le document d'architecture de Qubes OS explique parfaitement le pourquoi du comment.
L'idée est donc d'isoler le dom0 au niveu réseau, en tout cas de le protéger derrière un domU spécifique.
Dans le principe, n'importe quelle distribution un tant soit peu orientée sécurité fait l'affaire. Dans mon cas, j'aime me faire mal, j'ai choisi OpenWRT pour sa taille, le fait que je connaisse cet OS et pour le défi technique :)
Préparation de l'environnement
Nous allons devoir compiler OpenWRT depuis les sources. La version actuelle, Backfire, ne propose pas le noyau 2.6.37. Si vous voulez absolument utiliser cette version, il faudra backporter le driver Xen PCI Frontend pour le noyau 2.6.32-27. Dans notre cas, nous allons utiliser la version trunk qui intègre le support du noyau 2.6.37.
Il faut préparer l'environnement de compilation. Pas de soucis, tout est parfaitement documenté par l'équipe OpenWRT. Pour les pressés:
Les 2 modifications ci-dessus visent forcer l'utilisation du noyau 2.6.37 et à corriger le nom d'un des modules Xen qui sera généré (ligne FILES). Si vous oubliez la dernière modification, la compilation générera une erreur.
Configuration & compilation d'OpenWRT
Une fois la compilation terminée, il faut transférer le noyau ainsi que l'image disque vers votre dom0:
Il est maintenant temps de configurer notre domU.
Configuration du domU OpenWRT
OpenWRT va tourner en para-virtualisation. C'est pour cette raison que le noyau est séparé de l'image disque. En revanche, les modules noyau sont, eux, bien intégrés à l'image puisqu'ils devront être accessibles depuis le domU.
Commençons par tester le domU sans PCI passthrough. Si les tests sont concluant, vous pourrez commenter la ligne extra = "console=hvc0 xencons=tty" et décommenter les 2 suivantes pour activer le PCI passthrough.
Si vous obtenez ceci, ou quelque chose d'approchant, c'est gagné. Votre domU fonctionne. Voyons maintenant comment transférer le contrôle d'un périphérique PCI au domU.
Xen PCI passthrough
Je vous la fais en version courte, le temps pour moi de rédiger une publication plus complète. Il faut:
Identifier le ou les périphériques PCI dont on veut transférer le contrôle au domU
Configurer le dom0 pour lui indiquer de laisser le contrôle de ces périphériques au driver Xen PCI backend (Redémarrage obligatoire !)
Adapter le fichier de conf Xen pour le domU en précisant les périphériques à lui associer.
Démarrer le domU et vérifier
Ceci va induire un changement de l'architecture réseau de votre serveur Xen:
Architecture réseau Xen par défaut
Architecture réseau Xen après PCI passthrough
Evidemment, je suis sous GNU/Linux Debian, nous allons donc faire ces opérations "à la Debian".
A ce stade, vous pouvez rebooter. Veillez cependant à avoir un accès simple au dom0. Soit un accès physique, soit un accès console ou KVM, soit encore un accès réseau. Si vous n'utilisez pas de bonding et/ou n'avez pas d'interface réseau de secours, soyez bien conscient que le réseau ne fonctionnera pas après reboot car il faudra configurer OpenWRT !
Dans mon cas pas de soucis, le réseau externe est configuré en bonding, il est donc simple de retirer une carte réseau sans pour autant perdre l'accès à la machine. De plus, la machine est accessible en console RS232 depuis une autre machine. Ceinture et bretelles :)
Vérifications d'après reboot
Une fois la machine hôte redémarrée, nous pouvons faire quelques vérifications:
Cela peut paraître surprenant de voir la carte réseau apparaître, mais en fait non :p
Nous voyons ici que tout va bien: la carte est gérée par le module pciback (donc par Xen) alors qu'en théorie il s'agit du module sky2 (réseau). Vous pouvez vérifier par ip ad sh, vous ne verrez bien que 3 interfaces réseaux sur les 4 "détectées".
Voilà, tout fonctionne. Vous pouvez maintenant configurer OpenWRT de manière à ce qu'il opère en tant que passerelle du dom0 et des domU. Vous pourrez devrez bien sûr mettre en place les règles de pare-feu qui vont bien. Vous pourrez même installer un IDS pour détecter les attaques contre vos domU sans pour autant surcharger le dom0 :)
Je passe le plus clair de mon temps libre sur Internet à travailler sur GNU/Linux avec Debian ou CentOS, la virtualisation avec Xen et KVM et les technologies cluster avec Corosync et OpenAIS. Particulièrement intéressé par Linux, Netfilter, la virtualisation, le monitoring et les clusters, la plupart de mes travaux personnels sont publiés sur ce site et les autres ne sauraient tarder. A titre professionnel, j'administre des serveurs sous RedHat ou CentOS ainsi qu'une ferme de serveurs VMware ESXi version 4. De temps, à autre, je parviens à lâcher mon clavier pour lire un bon bouquin tout en écoutant de la musique, mais ça ne dure jamais longtemps.
Adresse e-mail : jean point baptiste point favre arobase gmail.com