2014-11-26 16:35:46 +00:00
|
|
|
% 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
|
|
|
|
|
2014-11-28 16:55:56 +00:00
|
|
|
### 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
|
|
|
|
|
|
|
|
* ``
|
|
|
|
|
|
|
|
|
2014-11-26 16:35:46 +00:00
|
|
|
## Namespaces
|
|
|
|
|
2014-11-28 16:55:56 +00:00
|
|
|
### 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 <sched.h>
|
|
|
|
|
|
|
|
#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);
|
|
|
|
```
|
|
|
|
|
2014-11-26 16:35:46 +00:00
|
|
|
## cgroups
|
|
|
|
|
2014-11-28 16:55:56 +00:00
|
|
|
### 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
|
|
|
|
|
|
|
|
|
2014-11-26 16:35:46 +00:00
|
|
|
## LXC
|
|
|
|
|
|
|
|
## Docker
|
|
|
|
|
|
|
|
## Vagrant
|
|
|
|
|
|
|
|
## Hardening
|
|
|
|
|
|
|
|
|
|
|
|
# Réseau
|
|
|
|
|
2014-11-28 16:55:56 +00:00
|
|
|
http://containerops.org/2013/11/19/lxc-networking/
|
|
|
|
|
|
|
|
## empty
|
|
|
|
|
2014-11-26 16:35:46 +00:00
|
|
|
## phys
|
|
|
|
|
|
|
|
## vlan
|
|
|
|
|
|
|
|
## veth
|
|
|
|
|
|
|
|
## macvlan vepa
|
|
|
|
|
|
|
|
## macvlan bridge
|