Si queremos aumentar la seguridad al desplegar los contenedores podemos actuar en dos sentidos:
- Limitar los recursos que puede usar el contenedor. Esto será de especial utilidad para evitar ataques de DoS.
- Deshabilitar "capabilities" del contenedor que voy a arrancar.
LIMITAR RECURSOS
Para limitar recursos hay un serie de flags de docker run que podemos usar, entre ellos los más destacados son:
- --memory/-m que establece el límite de memoria que puede llegar a usar un contenedor.
- --memory-reservation que es similar al anterior pero es un límite blando. Si se sobrepasa docker intentará reducir la memoria consumida por el contenedor.
- --cpus que limita el número de cpus del sistema que un contenedor puede utilizar.
- ....
Por ejemplo:
# Arranco un contenedor con un límite de 4GB y 4cpus > docker runt -it -m 4Gb --cpus=4 httpd ..... |
DESHABILITAR LAS CAPACIDADES
Si además queremos quitar capacidades a nuestros contenedores los haremos con el flag --cap-drop, el contrario al flag --cap-add que vimos en el módulo de redes para habilitar iptables usando la capacidad NET_ADMIN.
La lista de las capacidades de los sistemas Linux es larga. Podemos encontrarla en la siguiente dirección: https://man7.org/linux/man-pages/man7/capabilities.7.html
Por citar algunas podemos destacar:
- AUDIT_WRITE: Escribe mensajes en los log de auditoría del Kernel.
- CHOWN: Para permitir cambios en el UID y GUID de los ficheros.
- NET_BIND_SERVICE: Permite asociar un socket a un puerto que puede ser accedido desde Internet.
- NET_ADMIN: Configuración de interfaces, masquerading, enrutamiento, iptables etc...
- SETUID: Manipulación del UID de los procesos etc...
- SETGUID: Manipulación del GUID de los procesos etc..
- FOWNER: Para manipulación de todo tipo de permisos y ACLs en ficheros.
Un ejemplo de cómo deshabilitar una de estas capacidades sería:
# Deshabilitar la escritura de mensajes en el log de auditoría del Kernel > docker runt -it --cap-drop=audit_write ubuntu:20.04 |
Habilitar o deshabilitar capacidades requiere un estudio minucioso para cada contenedor. En general debemos limitar al máximo las capacidades cuando llevemos esos contenedores a producción.