Conteneurs et sécurité

Timothée Ravier - siosm@floss.social - https://tim.siosm.fr/cours

5e année cycle ingénieur, filière STI
Option Sécurité des Systèmes Ubiquitaires

2023 - 2024

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 : Co-processeurs et co-OS

Matériel : Co-processeurs et firmwares

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

Attaques par canaux cachés :

Noyau Linux

Noyau Linux

Noyau Linux et namespaces

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

Distributions Linux

Outils de gestion de conteneurs

Vulnérabilités spécifiques à LXC

Vulnérabilités spécifiques à Docker

Sécurité ?

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

Vulnérabilités spécifiques à Docker

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é
    • 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 (par ex. volumes Docker) 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 : HashiCorp Vault

Sécurité de l'application

Sécurité des applications : système de base

  • 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é :
    • Attention aux images basées sur Alpine :
    • Les distributions standard (Debian, Ubuntu, Fedora, Red Hat & CentOS Stream) restent une valeur sûre.

Sécurité des applications : mises à jour

Sécurité des applications : scanneurs de vulnérabilités

Supply Chain et licences

Sécurité des applications : langages

  • 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

% TODO : add TPM examples and trusted hardware examples % # Matériel % Se reposer sur du matériel de confiance : % - TPM\@ : What Trusted Computing Means to Users of CoreOS and Beyond\footnotemark. % \footnotetext[1]{What Trusted Computing Means to Users of CoreOS and Beyond : \url{https://coreos.com/blog/coreos-trusted-computing.html} ---