Ce guide peut vous intéresser si vous souhaitez par exemple :
et de façon plus générale comprendre le fonctionnement interne de VDN.
VDN assiste le concepteur de réseaux “pédagogiques” en permettant principalement :
En fonction des modifications que vous souhaitez apportées (logiciels/services, machine, réseaux) vous pourrez vous référer à ce guide.
Dans les premiers chapitres sont présentés les particularités des systèmes VDN. Si vous vous posez des questions sur les choix faits gardez à l'esprit que VDN est un outil devant fonctionner sur un réseau universitaire sur lequel nos utilisateurs (étudiants/profs) :
et que ses objectifs sont de permettre aux utilisateurs :
La réalisation des objectifs avec les contraintes imposées ont amené à devoir développer une gestion spécifiques des réseaux virtuels, des modes de sauvegardes, des spécialisation des machines que vous devrez comprendre pour intervenir sur les machines/réseaux existants ou les nouveaux que vous créerez et diffuserez.
Je vous rassure elle n'est pas censée être vue des utilisateurs.
qemu-system-x86_64 -smp 8 -enable-kvm -cpu host -device virtio-rng-pci,rng=rng0 -object rng-random,filename=/dev/urandom,id=rng0 -pidfile /tmp/vdn-davalan/vdn-debian-1-davalan-pid -rtc base=localtime -m 2024M -serial mon:stdio -monitor null -vnc unix:/tmp/vdn-davalan/vdn-vnc-davalan-debian-1-socket -spice unix,disable-ticketing,addr=/tmp/vdn-davalan/vdn-spice-davalan-debian-1-socket-initrd /home/davalan/vdn/files/initrd-tgz.img-4.19.0-6-amd64 -kernel /home/davalan/vdn/files/vmlinuz-4.19.0-6-amd64 -append root=/dev/vda1 ro console=ttyS0,115200n8 vdn-emulator=kvm vdn-mode=tgz net.ifnames=0 noresume -boot order=c -drive file=/home/davalan/vdn/files/debian.disk,if=virtio,snapshot=on,format=raw -drive file=/tmp/davalan/docker-hdb.disk,if=virtio,format=raw -drive file=/home/scratch/davalan/vdn-save/docker-hdb/debian-1.tgz,if=virtio,media=disk,format=raw -drive file=/tmp/vdn-davalan/vdn-debian-1-davalan-part,if=virtio,media=disk,format=raw -drive file=/tmp/vdn-davalan/vdn-debian-1-davalan-swap,if=virtio,media=disk,format=raw -drive file=/tmp/vdn-davalan/vdn-debian-1-davalan-config.tgz,if=virtio,media=disk,format=raw -device virtio-net-pci,netdev=n0,mac=52:55:25:E8:00:00 -netdev user,id=n0,hostfwd=tcp::5022-:22,hostfwd=tcp::5080-:80,hostfwd=tcp::5443-:443
VDN à construit et démarrer la machine virtuelle debian-1 à partir de la définition suivante :
#!/usr/bin/env bash set -eu build() { local n n=debian-1 vdn-build $n vdn-config $n MEMORY "2048" vdn-config $n SAVE_DIR_HDB "/tmp/$USER" vdn-config $n HDB "docker-hdb.disk" vdn-config $n HDB_SIZE "1024" vdn-config $n REDIRS "\ tcp:22:(ssh) \ tcp:80:(http) \ tcp:443:(https) \ " }
Ce que l'on ne voit pas sur cette commande générée mais que VDN effectue (via l'injection de scripts) est la “spécialisation du système” à son amorçage/arrêt (génération de mots de passes aléatoires, mise en place d'une authentification ssh par clés, …), compression de la sauvegarde, …
Une solution pour découvrir plus complètement les capacités de définition des réseaux est d'observer comment sont définis les réseaux fournis avec VDN et de lire les notes techniques associées.
La place occupée sur le disque par les systèmes et les modifications de ces derniers nous a amener a utiliser ou développer dans VDN différentes “stratégies” de sauvegardes des modifications (direct, cow, cow+, overlay, tgz), adaptées à différents cas d'utilisation des systèmes invités (système lambda supporté par QEMU/KVM, système de type Debian modifié, système devant être plus ou moins modifié, système persistant/temporaire (le temps d'un TP)).
Faire le bon choix a un impact sur le volume des sauvegardes. Actuellement seul le système de sauvegarde de type “tgz” nous permet de gérer de façon persistante les 9000 machines virtuelles de nos étudiants dans un espace (sous leur quotas) de quelques Mo seulement par étudiant.
VDN est sécurisé pour le système hôte et le réseau de l'hôte. Un utilisateur ne peut effectuer d'élévation de privilège à cause de VDN. Nous l'affirmons car VDN peut fonctionner sans aucune intervention de l'administrateur du système hôte. L'accès au réseau de l'hôte est “filtré” par slirp qui ne laisse passer que les couches réseaux transports et plus (UDP, TCP et plus) mais ni IP ni ICMP (le but étant de ne pas sniffer ou d'injecter de trame “martiennes” sur le réseau de l'hôte). Aucun accès privilégié n'est donc nécessaire.
Cependant, dans les faits l'administrateur est invité à activer les instructions de virtualisation et à ajouter les utilisateurs au groupe kvm
pour des raisons de performances (accélération d'un facteur 5 à 10), mais ce n'est pas bloquant, juste très pénible pour les utilisateurs (recherche cve kvm kernel security).
Au niveau des interconnexions réseaux VDN utilise 2 techniques différentes :
Les canaux multicast IPv4 remplacent les hubs et les switchs virtuels. Ce sont des brins Ethernet virtuels (ils sont représentés par des hubs virtuels sur les schémas).
Potentiellement, tout utilisateur peux écouter ces brins Ethernet virtuels. Les réseaux virtuels peuvent tous être sniffés (qu'ils soient diffusés en dehors de l'hôte ou pas). Un réseau VDN ne peut donc en aucun cas être considéré comme un réseau sécurisé. Pédagogiquement c'est intéressant (a charge aux utilisateurs de le rendre sécurisé via un chiffrement systématique des protocoles et/ou la mise en oeuvre d'un VPN ou …).
Le piratage d'une machine virtuelle Debian d'un utilisateur par un autre utilisateur est cependant assez complexe à partir du moment ou les systèmes fournis possèdent des mots de passes aléatoires et donc inconnus. L'utilisateur se connecte à ses Debian via ssh à l'aide d'une authentification par clés (mise en place automatiquement par VDN).
A l'utilisateur, via la connexion ssh, en toute responsabilité, de fixer ses mots de passes si nécessaire. Ses sauvegardes sont implicitement protégées (droits Unix 600).
VDN a été conçu sous Debian et dépends des versions précises de certains outils (kvm/qemu) et embarque un module ruby compilé (le terminal de l'interface graphique). Aucun portage sous d'autres distributions n'est prévu. Cependant une exécution en mode chroot, sous tout système GNU/Linux d'architecture X86_64, est possible avec le mot de passe root ou via un programme setuid fourni (bientôt).
VDN peut facilement être déployé sur un réseau de type NFS. Un seul utilisateur l'installe (l'enseignant sans doute), et tous l'utilisent (1 seul disque pour tous). L'administrateur des systèmes hôte devra activer les instructions de virtualisation sur les machines de TP et ajouter les utilisateurs au groupe KVM (ce dernier point est fortement recommandé pour des raisons de performances).
Avant de lire la suite 2 dernières petites choses :
Pédagogiquement nous avons un besoin d'une 30 de machines virtuelles pour chacun de nos 300 étudiants tous au long de leur formation.
Gérer 9000 machines virtuelles persistantes, à raison de 10 Go par machine virtuelle n'est pas envisageable.
En fait il se trouve qu'à l'usage les machines virtuelles nécessaires peuvent être classées, dans le cadre de nos TP, suivant les 2 types suivant :
On cherche a éviter au maximum la persistance des “volumineuses” et dans le cas ou la persistance est nécessaire on cherche à factoriser l'espace occupé (principe du LiveCD).
Les “légères” sont encore plus optimisée, nous ne sauvegardons que les fichiers modifiés, sous forme compressée. C'est le mode privilégié de VDN (mode tgz)
Dans la réalité, il existe plusieurs mode de sauvegardes pour les volumineuses, plus ou moins optimisé en fonction du système virtuel ayant leur avantages et inconvénient :
Notons que les modes “direct” et “cow” ne permettent pas de spécialiser les systèmes. Nous entendons par spécialisation d'un système la capacité de ce dernier à s'autoconfigurer à l'amorçage :
Ainsi qu'à l'arrêt :
La spécialisation, dans le cas de la mise en oeuvre de nombreuses machines basées sur un unique disque, est souhaitable.
Devant les limites de ces modes nous avons ajouté 3 autres modes (cow+, overlay, tgz) qui optimise les sauvegardes et permettent de spécialiser les machines. Cependant ils ont également leurs limitations :
Comme expliqué dans le chapitre précédent, réserver des Go de disque pour quelques milliers de machines virtuelles afin d'assurer la persistace des modifications des “lourds”.
Le principe du disque souche (un peu l'équivalent d'un Live CD) est de permette l'adjonction d'une couche “haute” absorbant et sauvegardant les modifications.
Un disque souche peut contenir un système quelconque si la couche haute est de type COW.
Un disque souche contenant le système Debian modifié fourni avec VDN permet d'obtenir une couche “haute” en overlayfs sauvegardée (tout ou partiellement) et compressée dans un fichier tgz (tar compressé).
Le choix du type de sauvegarde est à la charge du concepteur du réseaux.
Mais quelque soit le choix la gestion du disque souche expliqué plus haut est détaillée ici :
* Le réseau zoo
Dans le réseau zoo sont regroupé tous les systèmes souches. En démarrant un des systèmes du réseau zoo vous avait un accès direct au système “souche”.
Un fois le système démarré, vous accédez au moins à une console root vous permettant de faire les modifications.
Le réseau zoo est classique (fichier build). Vous pouvez facilement dupliquer un système.
Lors du lancement du système, si les disques HDA et HDB précisés n'existent pas ils seront créés (fichiers creux) au démarrage de la machine virtuelle.
Exemple :
Ce chapitre ne concerne que les modes “cow+”, “overlay” et “tgz”. Autrement dit ne fonctionne qu'avec la Debian fournie avec VDN.
La spécialisation à pour but d'offrir, à partir d'un même disque souche, des systèmes différents : services, fichiers, configurations, …
En fonction des différents modes cette spécialisation peut intervenir dans une ou plusieurs étapes de la phase de l'amorçage :
Ce que contient cette phase de spécialisation est libre et définissable sur l'hôte.
La spécialisation de l'initramfs est essentiellement guidée par le contenu de variables associées à la machine et via les fichiers à importer de l'hôte (le répertoire vdn/networks/nomDuRéseau/nomMachine contenant l'arborescence des fichiers à importer, sous l'identité de root dans le système virtuel).
La spécialisation via /etc/rc.local peut en plus permettre d'installer des paquets supplémentaires, des utilisateurs, … même si nous lui préférons comme expliquer ci-dessous, utiliser les script de post-configuration.
Enfin la spécialisation via des scripts de post-configuration. Ces script externes à la machines (exécutés sur l'hôte) configure les machines par ssh, à la demande de l'utilisateur via le menu “Scripts” (ou la commande vdn-scripts
).
Ces scripts de post-configuration, fournis avec le réseau, peuvent servir à :
Dans le cadre de TP de configuration de systèmes et de services réseaux ces scripts externes peuvent par exemple servir à valider un TP (ou une série de TP). Pour cela :
En lançant le script testAll
l'étudiant/l'enseignant suis la progression du TP. Idéalement en fin de TP tous les tests doivent passer.
L'équipe pédagogique peut se servir du script repairAll pour effectuer les configurations amenant aux fonctionnalités attendues afin de valider les tests. Ainsi on peut vérifier qu'après une mise à jour du système le TP reste fonctionnel. Si ce n'est pas le cas une adaptation du TP est sans doute nécessaire.
Ces scripts de post configuration permettent de valider les réseaux fournis avec VDN.
L'équipe pédagogique utilise quasi exclusivement ces scripts dans les réseau proposés avec VDN. L'injection de fichiers/scripts par l'initramfs ou /etc/rc.local reste des exceptions.
Ces scripts déjà présentés plus haut, permettent de placer le réseau dans une configuration spécifique, de le réparer et de le tester (de façon automatique et systématique si on le souhaite).
Avec chaque réseau fournis par VDN sont fournis des scripts config*, repair* et test*.
Une validation automatique des TP peut est réalisée avant les séances (configAll; repairAll, testAll).
Lorsque l'on doit développer un nouveau réseau “from scratch” voici les étapes que nous suivont :
Exemple :
Exemple de définition sommaire d'un réseau axé sur la configuration de systèmes
Toutes des machines Debian, sans grosse modification ⇒ systèmes de type “tgz”.