Seccomp
Información Básica
Seccomp, que significa Modo de Computación Segura, es una característica de seguridad del kernel de Linux diseñada para filtrar llamadas al sistema. Restringe los procesos a un conjunto limitado de llamadas al sistema (exit()
, sigreturn()
, read()
y write()
para descriptores de archivos ya abiertos). Si un proceso intenta llamar a cualquier otra cosa, es terminado por el kernel usando SIGKILL o SIGSYS. Este mecanismo no virtualiza recursos, sino que aísla el proceso de ellos.
Hay dos formas de activar seccomp: a través de la llamada al sistema prctl(2)
con PR_SET_SECCOMP
, o para los kernels de Linux 3.17 en adelante, la llamada al sistema seccomp(2)
. El método más antiguo de habilitar seccomp escribiendo en /proc/self/seccomp
ha sido desaprobado a favor de prctl()
.
Una mejora, seccomp-bpf, agrega la capacidad de filtrar llamadas al sistema con una política personalizable, utilizando reglas de Berkeley Packet Filter (BPF). Esta extensión es aprovechada por software como OpenSSH, vsftpd y los navegadores Chrome/Chromium en Chrome OS y Linux para un filtrado eficiente y flexible de llamadas al sistema, ofreciendo una alternativa al ya no compatible systrace para Linux.
Modo Original/Estricto
En este modo Seccomp solo permite las llamadas al sistema exit()
, sigreturn()
, read()
y write()
a descriptores de archivos ya abiertos. Si se realiza cualquier otra llamada al sistema, el proceso es terminado usando SIGKILL
Seccomp-bpf
Este modo permite filtrar las llamadas al sistema utilizando una política configurable implementada utilizando reglas de Berkeley Packet Filter.
Seccomp en Docker
Seccomp-bpf es compatible con Docker para restringir las syscalls desde los contenedores, disminuyendo efectivamente la superficie de ataque. Puedes encontrar las syscalls bloqueadas por defecto en https://docs.docker.com/engine/security/seccomp/ y el perfil seccomp por defecto se puede encontrar aquí https://github.com/moby/moby/blob/master/profiles/seccomp/default.json. Puedes ejecutar un contenedor de docker con una política de seccomp diferente con:
Si deseas, por ejemplo, prohibir que un contenedor ejecute alguna llamada al sistema como uname
, puedes descargar el perfil predeterminado desde https://github.com/moby/moby/blob/master/profiles/seccomp/default.json y simplemente eliminar la cadena uname
de la lista.
Si deseas asegurarte de que cierto binario no funcione dentro de un contenedor de Docker, puedes usar strace para listar las llamadas al sistema que el binario está utilizando y luego prohibirlas.
En el siguiente ejemplo se descubren las llamadas al sistema de uname
:
Si estás utilizando Docker solo para lanzar una aplicación, puedes perfilarla con strace
y solo permitir las llamadas al sistema que necesita.
Ejemplo de política Seccomp
Para ilustrar la característica de Seccomp, creemos un perfil de Seccomp deshabilitando la llamada al sistema "chmod" como se muestra a continuación.
En el perfil anterior, hemos establecido la acción predeterminada en "permitir" y creado una lista negra para deshabilitar "chmod". Para ser más seguro, podemos establecer la acción predeterminada en "bloquear" y crear una lista blanca para habilitar selectivamente las llamadas al sistema. El siguiente resultado muestra la llamada "chmod" devolviendo un error porque está deshabilitada en el perfil seccomp.
El siguiente resultado muestra el "docker inspect" que muestra el perfil:
Desactivarlo en Docker
Inicia un contenedor con la bandera: --security-opt seccomp=unconfined
A partir de Kubernetes 1.19, seccomp está habilitado de forma predeterminada para todos los Pods. Sin embargo, el perfil seccomp predeterminado aplicado a los Pods es el perfil "RuntimeDefault", que es proporcionado por el tiempo de ejecución del contenedor (por ejemplo, Docker, containerd). El perfil "RuntimeDefault" permite la mayoría de las llamadas al sistema mientras bloquea algunas que se consideran peligrosas o generalmente no requeridas por los contenedores.
Última actualización