
Incus est sûr par défaut : ses conteneurs sont non privilégiés, c'est-à-dire que le root de l'instance n'est pas le root de l'hôte. Encore faut-il ne pas défaire cette protection et savoir cloisonner et limiter. Ce guide explique l'idmap qui isole les conteneurs, montre comment plafonner les ressources, et met en place un projet restreint qui interdit les conteneurs privilégiés. Testé sur Incus 7.0. Pour qui héberge des instances qui ne se font pas confiance.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Pourquoi un conteneur non privilégié est plus sûr (l'idmap).
- Limiter CPU et mémoire d'une instance.
- Cloisonner avec un projet restreint.
- Les flags
security.privilegedetsecurity.nestingà manier avec prudence.
Prérequis
Section intitulée « Prérequis »- Un serveur Incus fonctionnel : voir installer Incus.
- Les bases des profils et projets : voir Profils et projets Incus.
Le socle : les conteneurs non privilégiés
Section intitulée « Le socle : les conteneurs non privilégiés »C'est la protection fondamentale d'Incus, active sans rien configurer. Un conteneur non privilégié décale les identifiants (idmap) : le root (UID 0) de l'instance correspond à un UID inoffensif et élevé sur l'hôte.
incus exec sec-lab -- cat /proc/self/uid_map 0 1000000 1000000000Cette ligne se lit : l'UID 0 dans le conteneur commence à 1000000 sur l'hôte, sur une plage d'un milliard d'UID. Concrètement, si un attaquant devient root dans le conteneur et s'échappe, il n'est qu'un utilisateur sans aucun privilège sur l'hôte. C'est toute la différence avec un conteneur Docker privilégié classique.
Limiter les ressources
Section intitulée « Limiter les ressources »Un conteneur sans limite peut épuiser le CPU ou la mémoire de l'hôte et affamer ses voisins (déni de service). On plafonne avec les clés limits.*.
incus config set sec-lab limits.cpu=1 limits.memory=512MiBincus config show sec-lab | grep limits limits.cpu: "1" limits.memory: 512MiBCes limites sont appliquées à chaud et se déclinent (limits.cpu.allowance pour un quota temporel, limits.memory.swap, limits.processes). Sur un hôte partagé, plafonner est une mesure de sécurité, pas seulement de performance.
Cloisonner avec un projet restreint
Section intitulée « Cloisonner avec un projet restreint »Un projet isole un ensemble d'instances. En le passant en restricted=true, on interdit les fonctionnalités dangereuses à tout ce qui y est créé, quelle que soit la commande de l'utilisateur.
-
Créer le projet et le restreindre :
Fenêtre de terminal incus project create confinedincus project set confined restricted=true -
Vérifier qu'un conteneur privilégié y est refusé :
Fenêtre de terminal incus launch images:debian/13 badct --project confined -c security.privileged=trueError: ... Invalid value "true" for config "security.privileged" oncontainer "badct" of project "confined": Privileged containers are forbidden
Le refus vient du projet, pas d'une convention : même un administrateur ne peut pas créer un conteneur privilégié dans un projet restreint. On affine ensuite avec les clés restricted.* (restricted.containers.nesting, restricted.devices.disk, restricted.networks.access) pour cadrer précisément ce que le projet autorise.
Les flags à manier avec prudence
Section intitulée « Les flags à manier avec prudence »Deux paramètres défont l'isolation par défaut. Les activer doit être un choix conscient, jamais un réflexe pour « faire marcher » quelque chose.
security.privileged=true: rend le conteneur privilégié (root du conteneur = root de l'hôte). Une évasion devient une compromission de l'hôte. À proscrire sauf besoin très spécifique et instance de confiance.security.nesting=true: autorise à faire tourner Incus ou Docker dans le conteneur. Pratique (c'est ce qui permet les labs imbriqués), mais élargit la surface d'attaque. À réserver aux cas qui l'exigent.
Autres leviers
Section intitulée « Autres leviers »Au-delà de ces bases, Incus applique par défaut un profil AppArmor par instance et un filtrage seccomp des appels système. Pour l'accès distant à l'API, privilégiez l'authentification par certificat TLS ou OIDC plutôt qu'un accès large, et cloisonnez les droits par projet. Ces mécanismes se combinent : idmap, limites, projet restreint et AppArmor forment des couches indépendantes.
À retenir
Section intitulée « À retenir »- Les conteneurs Incus sont non privilégiés par défaut : l'idmap décale le root hors de l'hôte.
- Plafonner CPU et mémoire (
limits.cpu,limits.memory) protège l'hôte partagé. - Un projet restreint (
restricted=true) interdit les conteneurs privilégiés, même à un admin. security.privileged=trueannule l'idmap : à éviter ;security.nestingélargit la surface.- Un projet restreint part de « rien n'est permis » : ajouter explicitement pool et réseau autorisés.
FAQ : questions fréquentes sur la sécurisation d'Incus
Section intitulée « FAQ : questions fréquentes sur la sécurisation d'Incus »Non privilégié grâce à l'idmap
Par défaut, un conteneur Incus est non privilégié : les identifiants sont décalés.incus exec sec-lab -- cat /proc/self/uid_map
0 1000000 1000000000
L'UID 0 (root) du conteneur correspond à l'UID 1000000 sur l'hôte. Si un attaquant devient root dans le conteneur et s'échappe, il n'est qu'un utilisateur sans privilège sur l'hôte. C'est la protection fondamentale d'Incus.Les clés limits
incus config set sec-lab limits.cpu=1 limits.memory=512MiB
Elles s'appliquent à chaud et se déclinent : limits.cpu.allowance (quota temporel), limits.memory.swap, limits.processes. Un conteneur sans limite peut épuiser le CPU ou la RAM de l'hôte et affamer ses voisins : sur un hôte partagé, plafonner est une mesure de sécurité autant que de performance.Le projet restreint
incus project create confined
incus project set confined restricted=true
Dans un projet restricted=true, un conteneur privilégié est refusé :Error: ... Privileged containers are forbidden
Le refus vient du projet, pas d'une convention : même un administrateur ne peut pas contourner. On affine avec les clés restricted.* (restricted.containers.nesting, restricted.devices.disk, restricted.networks.access).Un flag à éviter
security.privileged=true supprime l'idmap : le root du conteneur redevient le root de l'hôte. Une évasion devient alors une compromission complète de l'hôte.Si un conteneur a besoin d'une capacité précise, préférez :- un device dédié (
incus config device add) ; - une interception ciblée (
security.syscalls.intercept.*) ;
security.privileged. À réserver aux instances de confiance et aux besoins très spécifiques.