Perfiles de seguridad Seccomp para Docker
El modo de computación segura (seccomp) es una característica del kernel de Linux. Puedes usarlo para restringir las acciones disponibles dentro del contenedor. La llamada al sistema seccomp() opera sobre el estado de seccomp del proceso llamador. Puedes utilizar esta característica para restringir el acceso de tu aplicación.
Esta característica solo está disponible si Docker se ha compilado con seccomp y el kernel está configurado con CONFIG_SECCOMP habilitado. Para verificar si tu kernel es compatible con seccomp:
$ grep CONFIG_SECCOMP= /boot/config-$(uname -r)
CONFIG_SECCOMP=y
Pasar un perfil para un contenedor
El perfil predeterminado de seccomp proporciona un valor predeterminado sensato para ejecutar contenedores con seccomp y deshabilita alrededor de 44 llamadas al sistema de más de 300. Es moderadamente protector a la vez que proporciona una amplia compatibilidad con las aplicaciones.
En efecto, el perfil es una lista de permitidos que deniega el acceso a las llamadas al sistema por defecto y luego permite llamadas al sistema específicas. El perfil funciona definiendo una defaultAction de SCMP_ACT_ERRNO y anulando esa acción solo para llamadas al sistema específicas. El efecto de SCMP_ACT_ERRNO es provocar un error de Permission Denied (Permiso denegado). A continuación, el perfil define una lista específica de llamadas al sistema que están totalmente permitidas, porque su action se anula para ser SCMP_ACT_ALLOW. Finalmente, existen algunas reglas específicas para llamadas al sistema individuales como personality, entre otras, para permitir variantes de esas llamadas al sistema con argumentos específicos.
seccomp es fundamental para ejecutar contenedores de Docker con el menor privilegio posible. No se recomienda cambiar el perfil predeterminado de seccomp.
Cuando ejecutas un contenedor, este utiliza el perfil predeterminado a menos que lo sobrescribas con la opción --security-opt. Por ejemplo, lo siguiente especifica explícitamente una política:
$ docker run --rm \
-it \
--security-opt seccomp=/path/to/seccomp/profile.json \
hello-world
Llamadas al sistema significativas bloqueadas por el perfil predeterminado
El perfil predeterminado de seccomp de Docker es una lista de permitidos que especifica las llamadas que están autorizadas. La siguiente tabla enumera las llamadas al sistema significativas (aunque no todas) que están bloqueadas efectivamente porque no están en la lista de permitidos. La tabla incluye la razón por la cual cada llamada al sistema está bloqueada en lugar de estar en la lista de permitidos.
| Llamada al sistema | Descripción |
|---|---|
acct | Llamada al sistema de contabilidad que podría permitir a los contenedores deshabilitar sus propios límites de recursos o contabilidad de procesos. También limitada por CAP_SYS_PACCT. |
add_key | Evita que los contenedores utilicen el llavero del kernel, que no tiene espacio de nombres. |
bpf | Deniega la carga de programas BPF potencialmente persistentes en el kernel, ya limitada por CAP_SYS_ADMIN. |
clock_adjtime | La hora y la fecha no tienen espacio de nombres. También limitada por CAP_SYS_TIME. |
clock_settime | La hora y la fecha no tienen espacio de nombres. También limitada por CAP_SYS_TIME. |
clone | Deniega la clonación de nuevos espacios de nombres. También limitada por CAP_SYS_ADMIN para las banderas CLONE_*, a excepción de CLONE_NEWUSER. |
create_module | Deniega la manipulación y funciones en módulos del kernel. Obsoleta. También limitada por CAP_SYS_MODULE. |
delete_module | Deniega la manipulación y funciones en módulos del kernel. También limitada por CAP_SYS_MODULE. |
finit_module | Deniega la manipulación y funciones en módulos del kernel. También limitada por CAP_SYS_MODULE. |
get_kernel_syms | Deniega la obtención de símbolos exportados del kernel y de módulos. Obsoleta. |
get_mempolicy | Llamada al sistema que modifica la memoria del kernel y la configuración de NUMA. Ya limitada por CAP_SYS_NICE. |
init_module | Deniega la manipulación y funciones en módulos del kernel. También limitada por CAP_SYS_MODULE. |
ioperm | Evita que los contenedores modifiquen los niveles de privilegios de E/S del kernel. Ya limitada por CAP_SYS_RAWIO. |
iopl | Evita que los contenedores modifiquen los niveles de privilegios de E/S del kernel. Ya limitada por CAP_SYS_RAWIO. |
io_uring_enter | Bloqueada debido a vulnerabilidades de seguridad que pueden ser explotadas para escapar de los contenedores. Ver moby/moby#46762. |
io_uring_register | Bloqueada debido a vulnerabilidades de seguridad que pueden ser explotadas para escapar de los contenedores. Ver moby/moby#46762. |
io_uring_setup | Bloqueada debido a vulnerabilidades de seguridad que pueden ser explotadas para escapar de los contenedores. Ver moby/moby#46762. |
kcmp | Restringe las capacidades de inspección de procesos, ya bloqueada al eliminar CAP_SYS_PTRACE. |
kexec_file_load | Llamada al sistema hermana de kexec_load que hace lo mismo, con argumentos ligeramente diferentes. También limitada por CAP_SYS_BOOT. |
kexec_load | Deniega la carga de un nuevo kernel para su posterior ejecución. También limitada por CAP_SYS_BOOT. |
keyctl | Evita que los contenedores utilicen el llavero del kernel, que no tiene espacio de nombres. |
lookup_dcookie | Llamada al sistema de rastreo y perfilado, que podría filtrar mucha información en el anfitrión. También limitada por CAP_SYS_ADMIN. |
mbind | Llamada al sistema que modifica la memoria del kernel y la configuración de NUMA. Ya limitada por CAP_SYS_NICE. |
mount | Deniega el montaje, ya limitada por CAP_SYS_ADMIN. |
move_pages | Llamada al sistema que modifica la memoria del kernel y la configuración de NUMA. |
nfsservctl | Deniega la interacción con el demonio NFS del kernel. Obsoleta desde Linux 3.1. |
open_by_handle_at | Causa de un antiguo escape de contenedor. También limitada por CAP_DAC_READ_SEARCH. |
perf_event_open | Llamada al sistema de rastreo y perfilado, que podría filtrar mucha información en el anfitrión. |
personality | Evita que el contenedor habilite la emulación de BSD. No es intrínsecamente peligrosa, pero está poco probada y tiene potencial para muchas vulnerabilidades del kernel. |
pivot_root | Deniega pivot_root, debería ser una operación privilegiada. |
process_vm_readv | Restringe las capacidades de inspección de procesos, ya bloqueada al eliminar CAP_SYS_PTRACE. |
process_vm_writev | Restringe las capacidades de inspección de procesos, ya bloqueada al eliminar CAP_SYS_PTRACE. |
ptrace | Llamada al sistema de rastreo y perfilado. Bloqueada en versiones del kernel de Linux anteriores a la 4.8 para evitar la omisión de seccomp. El rastreo y perfilado de procesos arbitrarios ya está bloqueado al eliminar CAP_SYS_PTRACE, ya que podría filtrar mucha información en el anfitrión. |
query_module | Deniega la manipulación y funciones en módulos del kernel. Obsoleta. |
quotactl | Llamada al sistema de cuotas que podría permitir a los contenedores deshabilitar sus propios límites de recursos o contabilidad de procesos. También limitada por CAP_SYS_ADMIN. |
reboot | No permite que los contenedores reinicien el anfitrión. También limitada por CAP_SYS_BOOT. |
request_key | Evita que los contenedores utilicen el llavero del kernel, que no tiene espacio de nombres. |
set_mempolicy | Llamada al sistema que modifica la memoria del kernel y la configuración de NUMA. Ya limitada por CAP_SYS_NICE. |
setns | Deniega la asociación de un hilo con un espacio de nombres. También limitada por CAP_SYS_ADMIN. |
settimeofday | La hora y la fecha no tienen espacio de nombres. También limitada por CAP_SYS_TIME. |
stime | La hora y la fecha no tienen espacio de nombres. También limitada por CAP_SYS_TIME. |
socket | Bloqueada para AF_ALG para evitar la escalada de privilegios dentro del contenedor a través de la API criptográfica del kernel (CVE-2026-31431). También bloqueada para AF_VSOCK. Ver moby/moby#52494. |
socketcall | Denegada para evitar la omisión de filtros de familia de direcciones de socket en arquitecturas con el multiplexor socketcall heredado (i386, s390, MIPS o32). Ver moby/moby#52494. |
swapon | Deniega iniciar o detener el intercambio (swapping) a un archivo o dispositivo. También limitada por CAP_SYS_ADMIN. |
swapoff | Deniega iniciar o detener el intercambio (swapping) a un archivo o dispositivo. También limitada por CAP_SYS_ADMIN. |
sysfs | Llamada al sistema obsoleta. |
_sysctl | Obsoleta, reemplazada por /proc/sys. |
umount | Debería ser una operación privilegiada. También limitada por CAP_SYS_ADMIN. |
umount2 | Debería ser una operación privilegiada. También limitada por CAP_SYS_ADMIN. |
unshare | Deniega la clonación de nuevos espacios de nombres para procesos. También limitada por CAP_SYS_ADMIN, con la excepción de unshare --user. |
uselib | Llamada al sistema antigua relacionada con bibliotecas compartidas, en desuso desde hace mucho tiempo. |
userfaultfd | Manejo de fallos de página en el espacio de usuario, necesario en gran medida para la migración de procesos. |
ustat | Llamada al sistema obsoleta. |
vm86 | Máquina virtual de modo real x86 dentro del kernel. También limitada por CAP_SYS_ADMIN. |
vm86old | Máquina virtual de modo real x86 dentro del kernel. También limitada por CAP_SYS_ADMIN. |
Ejecutar sin el perfil predeterminado de seccomp
Puedes pasar unconfined para ejecutar un contenedor sin el perfil predeterminado de seccomp.
$ docker run --rm -it --security-opt seccomp=unconfined debian:latest \
unshare --map-root-user --user sh -c whoami