% Virtualisation légère % Pierre-Olivier Mercier % Samedi 29 novembre 2014 # Historique ## Rappels sur la virtualisation classique ### Prémices #### IBM 370 * une super machine ! ### Vocabulaire #### Définitions * Machine hôte/host machine * Machine invité/guest machine #### Virtualisation vs. émulation * Émulation : simulation logiciel de matériel (potentiellement une architecture différente) : pas d'accès direct au matériel ; * Virtualisation : accès direct, mais restrint au matériel. * QEMU * Bochs #### Technologies de virtualisation matérielle * Intel VT-x/AMD-V/ARM Virtualization Extensions * partitionne le processeur pour exécuter plusieurs système d'exploitation via le même processeur. ### Pourquoi virtualiser ? #### * Réduction des coûts ; * facilité de migration (répartition de charge, panne hardware, ...) ; ### Paravirtualisation #### Caractéristiques * Nécessite un noyau patché ; * l'hôte expose une API accessible aux invités ; * les invités accèdent au matériel via l'API de l'hôte. * Xen ### Hyperviseurs Contrôle l'utilisation faite des ressources de la machine hôte par les machines virtuelles. #### Type 1 * L'hyperviseur contrôle directement le matériel ; * Tous les systèmes lancés par la suite passent par l'hyperviseur. * Microsoft Hyper-V, XenServer, VMware ESX, ... #### Type 2 * L'hyperviseur s'appuie sur le système d'exploitation déjà lancé pour accéder au matériel ; * Linux KVM, VirtualBox, BHyVe, ... ### Isolateurs #### Caractéristiques * Isolation faite par le noyau du système d'exploitation ; * le noyau est partagé entre tous les invités. ### Versus chroot * Simple isolation d'une partie du système de fichier ; * pas de limitation sur les ressources utilisés ; * pas d'isolation de l'arbre des processus ; * implémentations douteuses (GrSecurity !). ## Les différentes technologies ### Points communs #### Environnement virtualisé * Arborescence de fichiers propre ; * arbre de processus isolé ; * comptes utilisateurs distincts ; * #### Sécurité ### Unix #### Zones Solaris * Lancé en 2005 * #### Jails BSD ### GNU/Linux #### OpenVZ/VServer #### Linux Containers ### Et Windows ? # GNU/Linux ## Capabilities ### Résumé #### Historiquement * Processus privilégiés : `UID == 0`. * Processus non-privilégiés : `UID != 0`. #### Depuis Linux 2.2 * Séparation des privilèges de l'UID 0. * Chaque thread peut posséder ses propres capacités. * `prctl(2)`, `execve(2)`, ### Principales capacités #### Ne pas oublier de désactiver * `CAP_MKNOD` : `mknod` * `CAP_NET_RAW` : permet d'écouter tout le réseau * `CAP_SYS_MODULE` : charge et décharge des modules noyau * `CAP_SYS_RAWIO` : accès brut aux entrées/sorties * `CAP_SYS_RESOURCE` : dépassement des quotas, utilisation de l'espace réservé, ... * `CAP_SYS_TIME` : changer l'heure de la machine * `CAP_SYS_ADMIN` : misc #### Ne pas oublier d'activer * `` ## Namespaces ### Isolation de parties du système #### Mount Namespace Isole la vue des partitions montées. #### UTS Namespace Identification du système : nom de machine et de domaine. #### PID Namespace Crée un arbre d'exécution parallèle où le premier process à être exécuté devient le PID 1 de cet arbre. #### Network Namespace Isole la pile réseau ; crée un nouveau groupe d'interfaces. #### User Namespace Crée une liste d'utilisateurs et de groupe distincte. #### IPC Namespace Isolation des files de messages de communication interprocessus (IPC). ### Implémentation ```c #include #define STACKSIZE (1024*1024) static char child_stack[STACKSIZE]; int clone_flags = CLONE_NEWNET | SIGCHLD; pid_t pid = clone(do_execvp, child_stack + STACKSIZE, clone_flags, &args); ``` ## cgroups ### Freezer cgroup subsystem ### Device controller for cgroups ### CPU accounting cgroup subsystem ### Memory Resource Controller for Control Groups ### Block IO controller ### Device controller for cgroups ### Network priority cgroup ## LXC ## Docker ## Vagrant ## Hardening # Réseau http://containerops.org/2013/11/19/lxc-networking/ ## empty ## phys ## vlan ## veth ## macvlan vepa ## macvlan bridge