⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Profils de sécurité Seccomp pour Docker

Le mode de calcul sécurisé (seccomp) est une fonctionnalité du noyau Linux. Vous pouvez l'utiliser pour restreindre les actions disponibles dans le conteneur. L'appel système seccomp() opère sur l'état seccomp du processus appelant. Vous pouvez utiliser cette fonctionnalité pour restreindre l'accès de votre application.

Cette fonctionnalité n'est disponible que si Docker a été construit avec seccomp et que le noyau est configuré avec CONFIG_SECCOMP activé. Pour vérifier si votre noyau supporte seccomp :

$ grep CONFIG_SECCOMP= /boot/config-$(uname -r)
CONFIG_SECCOMP=y

Passer un profil pour un conteneur

Le profil seccomp par défaut fournit un défaut sensé pour exécuter des conteneurs avec seccomp et désactive environ 44 appels système sur plus de 300. Il est modérément protecteur tout en fournissant une large compatibilité d'application. Le profil Docker par défaut peut être trouvé ici.

En effet, le profil est une liste blanche qui refuse l'accès aux appels système par défaut puis autorise des appels système spécifiques. Le profil fonctionne en définissant une defaultAction de SCMP_ACT_ERRNO et en remplaçant cette action seulement pour des appels système spécifiques. L'effet de SCMP_ACT_ERRNO est de causer une erreur Permission Denied. Ensuite, le profil définit une liste spécifique d'appels système qui sont entièrement autorisés, car leur action est remplacée pour être SCMP_ACT_ALLOW. Enfin, certaines règles spécifiques sont pour des appels système individuels tels que personality, et autres, pour permettre des variantes de ces appels système avec des arguments spécifiques.

seccomp est instrumental pour exécuter des conteneurs Docker avec le moindre privilège. Il n'est pas recommandé de changer le profil seccomp par défaut.

Lorsque vous exécutez un conteneur, il utilise le profil par défaut à moins que vous ne le remplaciez avec l'option --security-opt. Par exemple, ce qui suit spécifie explicitement une politique :

$ docker run --rm \
             -it \
             --security-opt seccomp=/path/to/seccomp/profile.json \
             hello-world

Appels système significatifs bloqués par le profil par défaut

Le profil seccomp par défaut de Docker est une liste blanche qui spécifie les appels qui sont autorisés. Le tableau ci-dessous liste les appels système significatifs (mais pas tous) qui sont effectivement bloqués car ils ne sont pas sur la liste blanche. Le tableau inclut la raison pour laquelle chaque appel système est bloqué plutôt que mis en liste blanche.

Appel système Description
acct Appel système de comptabilité qui pourrait permettre aux conteneurs de désactiver leurs propres limites de ressources ou la comptabilité des processus. Également contrôlé par CAP_SYS_PACCT.
add_key Empêcher les conteneurs d'utiliser le trousseau de clés du noyau, qui n'est pas namespacé.
bpf Refuser le chargement de programmes BPF potentiellement persistants dans le noyau, déjà contrôlé par CAP_SYS_ADMIN.
clock_adjtime Le temps/date n'est pas namespacé. Également contrôlé par CAP_SYS_TIME.
clock_settime Le temps/date n'est pas namespacé. Également contrôlé par CAP_SYS_TIME.
clone Refuser le clonage de nouveaux namespaces. Également contrôlé par CAP_SYS_ADMIN pour les flags CLONE_*, sauf CLONE_NEWUSER.
create_module Refuser la manipulation et les fonctions sur les modules du noyau. Obsolète. Également contrôlé par CAP_SYS_MODULE.
delete_module Refuser la manipulation et les fonctions sur les modules du noyau. Également contrôlé par CAP_SYS_MODULE.
finit_module Refuser la manipulation et les fonctions sur les modules du noyau. Également contrôlé par CAP_SYS_MODULE.
get_kernel_syms Refuser la récupération des symboles de noyau et de modules exportés. Obsolète.
get_mempolicy Appel système qui modifie la mémoire du noyau et les paramètres NUMA. Déjà contrôlé par CAP_SYS_NICE.
init_module Refuser la manipulation et les fonctions sur les modules du noyau. Également contrôlé par CAP_SYS_MODULE.
ioperm Empêcher les conteneurs de modifier les niveaux de privilège d'E/S du noyau. Déjà contrôlé par CAP_SYS_RAWIO.
iopl Empêcher les conteneurs de modifier les niveaux de privilège d'E/S du noyau. Déjà contrôlé par CAP_SYS_RAWIO.
kcmp Restreindre les capacités d'inspection des processus, déjà bloqué en supprimant CAP_SYS_PTRACE.
kexec_file_load Appel système jumeau de kexec_load qui fait la même chose, arguments légèrement différents. Également contrôlé par CAP_SYS_BOOT.
kexec_load Refuser le chargement d'un nouveau noyau pour exécution ultérieure. Également contrôlé par CAP_SYS_BOOT.
keyctl Empêcher les conteneurs d'utiliser le trousseau de clés du noyau, qui n'est pas namespacé.
lookup_dcookie Appel système de traçage/profilage, qui pourrait fuir beaucoup d'informations sur l'hôte. Également contrôlé par CAP_SYS_ADMIN.
mbind Appel système qui modifie la mémoire du noyau et les paramètres NUMA. Déjà contrôlé par CAP_SYS_NICE.
mount Refuser le montage, déjà contrôlé par CAP_SYS_ADMIN.
move_pages Appel système qui modifie la mémoire du noyau et les paramètres NUMA.
nfsservctl Refuser l'interaction avec le démon NFS du noyau. Obsolète depuis Linux 3.1.
open_by_handle_at Cause d'une ancienne évasion de conteneur. Également contrôlé par CAP_DAC_READ_SEARCH.
perf_event_open Appel système de traçage/profilage, qui pourrait fuir beaucoup d'informations sur l'hôte.
personality Empêcher le conteneur d'activer l'émulation BSD. Pas intrinsèquement dangereux, mais mal testé, potentiel pour beaucoup de vulnérabilités du noyau.
pivot_root Refuser pivot_root, devrait être une opération privilégiée.
process_vm_readv Restreindre les capacités d'inspection des processus, déjà bloqué en supprimant CAP_SYS_PTRACE.
process_vm_writev Restreindre les capacités d'inspection des processus, déjà bloqué en supprimant CAP_SYS_PTRACE.
ptrace Appel système de traçage/profilage. Bloqué dans les versions du noyau Linux avant 4.8 pour éviter le contournement de seccomp. Le traçage/profilage de processus arbitraires est déjà bloqué en supprimant CAP_SYS_PTRACE, car cela pourrait fuir beaucoup d'informations sur l'hôte.
query_module Refuser la manipulation et les fonctions sur les modules du noyau. Obsolète.
quotactl Appel système de quota qui pourrait permettre aux conteneurs de désactiver leurs propres limites de ressources ou la comptabilité des processus. Également contrôlé par CAP_SYS_ADMIN.
reboot Ne pas laisser les conteneurs redémarrer l'hôte. Également contrôlé par CAP_SYS_BOOT.
request_key Empêcher les conteneurs d'utiliser le trousseau de clés du noyau, qui n'est pas namespacé.
set_mempolicy Appel système qui modifie la mémoire du noyau et les paramètres NUMA. Déjà contrôlé par CAP_SYS_NICE.
setns Refuser d'associer un thread avec un namespace. Également contrôlé par CAP_SYS_ADMIN.
settimeofday Le temps/date n'est pas namespacé. Également contrôlé par CAP_SYS_TIME.
stime Le temps/date n'est pas namespacé. Également contrôlé par CAP_SYS_TIME.
swapon Refuser démarrer/arrêter l'échange vers un fichier/périphérique. Également contrôlé par CAP_SYS_ADMIN.
swapoff Refuser démarrer/arrêter l'échange vers un fichier/périphérique. Également contrôlé par CAP_SYS_ADMIN.
sysfs Appel système obsolète.
_sysctl Obsolète, remplacé par /proc/sys.
umount Devrait être une opération privilégiée. Également contrôlé par CAP_SYS_ADMIN.
umount2 Devrait être une opération privilégiée. Également contrôlé par CAP_SYS_ADMIN.
unshare Refuser le clonage de nouveaux namespaces pour les processus. Également contrôlé par CAP_SYS_ADMIN, à l'exception de unshare --user.
uselib Ancien appel système lié aux bibliothèques partagées, inutilisé depuis longtemps.
userfaultfd Gestion des défauts de page en espace utilisateur, largement nécessaire pour la migration de processus.
ustat Appel système obsolète.
vm86 Machine virtuelle en mode réel x86 dans le noyau. Également contrôlé par CAP_SYS_ADMIN.
vm86old Machine virtuelle en mode réel x86 dans le noyau. Également contrôlé par CAP_SYS_ADMIN.

Exécuter sans le profil seccomp par défaut

Vous pouvez passer unconfined pour exécuter un conteneur sans le profil seccomp par défaut.

$ docker run --rm -it --security-opt seccomp=unconfined debian:latest \
    unshare --map-root-user --user sh -c whoami