# 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`:

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

## Pasar un perfil para un contenedor

El [perfil predeterminado de `seccomp`](https://github.com/moby/profiles/blob/main/seccomp/default.json) 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:

```console
$ 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](https://github.com/moby/moby/pull/46762).                                                                                      |
| `io_uring_register` | Bloqueada debido a vulnerabilidades de seguridad que pueden ser explotadas para escapar de los contenedores. Ver [moby/moby#46762](https://github.com/moby/moby/pull/46762).                                                                                      |
| `io_uring_setup`    | Bloqueada debido a vulnerabilidades de seguridad que pueden ser explotadas para escapar de los contenedores. Ver [moby/moby#46762](https://github.com/moby/moby/pull/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](https://nvd.nist.gov/vuln/detail/CVE-2026-31431)). También bloqueada para `AF_VSOCK`. Ver [moby/moby#52494](https://github.com/moby/moby/pull/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](https://github.com/moby/moby/pull/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.

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

