Conteneurs et sécurité

Timothée Ravier
siosm@floss.social - tim.siosm.fr/cours - github.com/travier

5e année cycle ingénieur, filière STI
Option Sécurité des Systèmes Embarqués et du Cloud (2SEC)

2024 - 2025

Points d'attention

  • Sécurité de l'hôte hébergeant les conteneurs :
    • Matériel
    • Noyau et système de base
    • Gestionnaire de conteneurs
    • Méchanismes d'isolation entre les conteneurs
  • Sécurité de l'image de base d'un conteneur :
    • Distribution et intégrité
    • Distribution des secrets
  • Sécurité de l'application dans le conteneur :
    • Système de base et mises à jour
    • Langage de programmation & Framework

Sécurité de l'hôte

Matériel : Nombreux éléments partagés

Attaques par canaux cachés :

Noyau Linux

  • Cible privilégiée : point commun entre tous les conteneurs
  • L'isolation fournie par les namespaces et les cgroups a encore des limites
  • Cas non prévus lorsque l'on combine plusieurs namespaces
  • Certaines parties du noyau n'ont pas encore été adaptées aux namespaces

Noyau Linux

Noyau Linux : namespaces & overlayfs

Noyau Linux : user namespaces

Protection du noyau Linux

Réduction de la surface d'attaque :

  • Retirer des appels systèmes du noyau (dur)
  • Limiter les appels systèmes disponibles : seccomp-bpf (plus facile)

Outils pour générer des filtres seccomps fins :

Durcissement du noyau Linux

  • « Historiquement » : PaX & grsecurity
  • Les patchs ne sont plus disponibles publiquement
  • Travail en cours par le Kernel Self Protection Project pour améliorer progressivement la situation upstream
  • Arrivée progressive de Rust dans le noyau Linux :

Durcissement distributions Linux

Outils de gestion de conteneurs

Docker et sécurité


« Docker is about running random code downloaded from the Internet and running it as root. »

Spécificités Docker

Isolation : SELinux

  • Contenir les conteneurs à l'aide des catégories (MCS)
  • Tous les conteneurs utilisent le même type (même accès)
  • Associe à l'exécution un ensemble de catégories à chaque conteneur
  • SELinux garantie qu'il ne peut pas y avoir d'intéraction entre les conteneurs si leur ensemble de catégories sont distincts
  • Supporté par Docker et Podman
  • Limite la portée d'une grande partie des vulnérabilités (ex. CVE-2016-9962)

Isolation : AppArmor

Isolation : Virtualisation matérielle

Sécurité du conteneur et de son image de base

Sécurité du conteneur

  • Restriction des permissions :
    • Utiliser un utilisateur non privilégié (i.e. différent de root)
    • Limiter les capabilities
    • Ne pas autoriser l'élévation des priviléges (NoNewPrivileges)
    • Appliquer un filtre seccomp-bpf strict
  • Image du conteneur en lecture seule (RO)
  • Stockage persistent externe (volumes) pour :
    • la configuration en lecture seule
    • les données en lecture / écriture

Sécurité de l'image de conteneur

  • Contrôle de l'intégrité du conteneur :

    • stockage, transport sur le réseau, vérification avant exécution
  • Signer les images de conteneurs :

    • sigstore
    • Signer les images de conteneurs avec cosign
    • Fonctionnement avec gestion de clés ou avec clés éphémères (keyless)
  • Typo-squatting et multi-registre :

Image de conteneur : Distribution et gestion des secrets ?

  • Considérer une image de conteneur comme publique
  • Ne pas inclure de secrets dans une image de conteneur
    • Sinon, établir un control d'accès fort
  • Utilisation de variables d'environnement ou de volumes
  • Récupération dynamique des secrets :

Sécurité de l'application

Système de base du conteneur

  • Conteneurs sont souvent créés à partir d'un système de base
  • La taille n'est pas toujours un facteur de décision (même si l'on cherche souvent à la réduire le plus possible)
  • Choisir un système de base avec des bonnes propriétés de sécurité et correctement supporté
  • Les distributions standard (Debian, Ubuntu, Fedora, Red Hat & CentOS Stream) restent une valeur sûre.

Système de base du conteneur : Alpine ?

Mises à jour du conteneur

Scanneurs de vulnérabilités

Supply Chain et licences

Langages de programmation

  • Une application vulnérable sera toujours vulnérable dans un conteneur
  • Utiliser des langages de programmation et des « frameworks » avec des propriétés intéressantes en terme de sécurité :
    • Rust
    • Go, Kotlin
    • Haskell, OCaml, Elixir, Erlang
    • Java, Python, Javascript, Typescript

Suite

Sécurité de la virtualisation

- Open Scap : [Security compliance of RHEL7 Docker containers](https://www.open-scap.org/resources/documentation/security-compliance-of-rhel7-docker-containers/)