Aller au contenu
Conteneurs & Orchestration medium

Sécuriser Incus : conteneurs non privilégiés, limites et projets restreints

6 min de lecture

logo incus

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.

  • 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.privileged et security.nesting à manier avec prudence.

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.

Fenêtre de terminal
incus exec sec-lab -- cat /proc/self/uid_map
0 1000000 1000000000

Cette 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.

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.*.

Fenêtre de terminal
incus config set sec-lab limits.cpu=1 limits.memory=512MiB
incus config show sec-lab | grep limits
limits.cpu: "1"
limits.memory: 512MiB

Ces 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.

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.

  1. Créer le projet et le restreindre :

    Fenêtre de terminal
    incus project create confined
    incus project set confined restricted=true
  2. 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=true
    Error: ... Invalid value "true" for config "security.privileged" on
    container "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.

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.

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.

  • 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=true annule 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 »

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn