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