Cómo otorgar privilegios detallados a usuarios no root en Docker

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Docker es una potente plataforma de contenerización que ha revolucionado la forma en que se desarrollan, implementan y gestionan las aplicaciones. Sin embargo, ejecutar contenedores Docker como usuario root puede plantear riesgos de seguridad. Este tutorial lo guiará a través del proceso de otorgar privilegios detallados a usuarios no root en Docker, lo que les permitirá realizar tareas específicas sin comprometer la seguridad general del sistema.

Comprender los privilegios de usuario en Docker

Los contenedores Docker están diseñados para ejecutarse como usuarios no privilegiados por defecto, lo que ayuda a mejorar la seguridad general del sistema. Sin embargo, pueden haber situaciones en las que necesites otorgar permisos detallados a usuarios no root dentro de un contenedor Docker para realizar tareas específicas.

Privilegios de usuario predeterminados en Docker

Por defecto, los contenedores Docker se ejecutan como el usuario root, que tiene el nivel más alto de privilegios dentro del contenedor. Esto puede ser un riesgo de seguridad, ya que cualquier vulnerabilidad o actividad maliciosa dentro del contenedor podría afectar potencialmente al sistema host.

Para mitigar este riesgo, Docker recomienda ejecutar contenedores como usuarios no root. Puedes hacer esto especificando un usuario en el Dockerfile o utilizando la bandera --user al ejecutar un contenedor.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
USER myuser
## Ejecutar el contenedor como usuario no root
docker run -it --user myuser ubuntu:22.04 bash

Comprender los espacios de nombres de usuario

Docker utiliza espacios de nombres de usuario (user namespaces) para proporcionar una capa adicional de aislamiento y seguridad para usuarios no root dentro de un contenedor. Los espacios de nombres de usuario te permiten mapear un usuario y los IDs de grupo del contenedor a diferentes IDs en el sistema host, creando efectivamente un espacio de usuario separado para el contenedor.

graph TD A[Host System] --> B[Container] B[Container] --> C[Mapped User ID] B[Container] --> D[Mapped Group ID]

Este mapeo asegura que, incluso si un usuario no root dentro del contenedor tiene altos privilegios, no puede afectar al sistema host ni a otros contenedores que se ejecuten en el mismo host.

Verificar los privilegios de usuario

Puedes utilizar el comando id dentro del contenedor para verificar los IDs de usuario y grupo a los que se ha mapeado el usuario actual:

$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lxd),128(systemd-journal),129(systemd-journal-gateway)

Esta salida muestra que el usuario myuser se ha mapeado a un ID de usuario 1000 y un ID de grupo 1000 dentro del contenedor.

Asignar permisos detallados a usuarios no root

Si bien ejecutar contenedores como usuarios no root es una buena práctica de seguridad, puede haber casos en los que necesites otorgar permisos específicos a estos usuarios para realizar ciertas tareas. Docker ofrece varias formas de asignar permisos detallados a usuarios no root dentro de un contenedor.

Usar las banderas --cap-add y --cap-drop

Docker admite el uso de capacidades de Linux (Linux capabilities), que te permiten otorgar o revocar privilegios específicos a un usuario o proceso. Puedes usar las banderas --cap-add y --cap-drop al ejecutar un contenedor para agregar o eliminar capacidades para el usuario no root.

## Otorgar la capacidad "CAP_SYS_ADMIN" al usuario no root
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

## Quitar la capacidad "CAP_CHOWN" del usuario no root
docker run -it --user myuser --cap-drop=CHOWN ubuntu:22.04 bash

Montar volúmenes con permisos específicos

También puedes otorgar permisos detallados a usuarios no root montando volúmenes con una propiedad y permisos específicos. Esto te permite controlar los derechos de acceso del usuario no root dentro del contenedor.

## Montar un volumen con permisos específicos
docker run -it --user myuser -v /path/on/host:/path/in/container:rw,uid=1000,gid=1000 ubuntu:22.04 bash

En este ejemplo, el volumen montado es accesible por el usuario no root con un ID de usuario 1000 y un ID de grupo 1000.

Usar la bandera --group-add

Si el usuario no root necesita realizar tareas que requieran pertenecer a grupos específicos, puedes usar la bandera --group-add para agregar al usuario a grupos adicionales dentro del contenedor.

## Agregar el usuario no root al grupo "docker"
docker run -it --user myuser --group-add docker ubuntu:22.04 bash

Esto permite que el usuario no root realice tareas que requieran pertenecer al grupo "docker", como interactuar con el demonio de Docker.

Personalizar el Dockerfile

También puedes personalizar el Dockerfile para crear un usuario no root con permisos y pertenencias a grupos específicos. Esto asegura que el usuario no root tenga los privilegios necesarios para realizar sus tareas dentro del contenedor.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

Este Dockerfile crea un usuario no root llamado myuser y lo agrega al grupo "docker", lo que le permite interactuar con el demonio de Docker.

Casos de uso prácticos y ejemplos

Asignar permisos detallados a usuarios no root en Docker puede ser beneficioso en una variedad de escenarios. Aquí hay algunos casos de uso prácticos y ejemplos:

Escenario 1: Ejecutar un servidor web

Supongamos que tienes una aplicación web que se ejecuta en un contenedor Docker y deseas que el usuario no root tenga los permisos necesarios para iniciar y gestionar el proceso del servidor web.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN apt-get update && apt-get install -y nginx
RUN chown -R myuser:myuser /var/www/html
USER myuser
CMD ["nginx", "-g", "daemon off;"]

En este ejemplo, al usuario no root myuser se le otorga la propiedad del directorio /var/www/html, que es la ubicación predeterminada para el servidor web Nginx. Esto permite que el usuario no root inicie y gestione el proceso de Nginx dentro del contenedor.

Escenario 2: Acceder a archivos sensibles

Si tu contenedor necesita acceder a archivos o directorios sensibles, puedes otorgar al usuario no root los permisos necesarios para leer o escribir en esas ubicaciones.

## Ejecutar el contenedor con permisos de volumen específicos
docker run -it --user myuser -v /path/to/sensitive/files:/sensitive:rw,uid=1000,gid=1000 ubuntu:22.04 bash

En este ejemplo, al usuario no root con un ID de usuario 1000 y un ID de grupo 1000 se le otorga acceso de lectura y escritura al directorio /path/to/sensitive/files dentro del contenedor.

Escenario 3: Interactuar con el demonio de Docker

Si tu usuario no root necesita interactuar con el demonio de Docker, puedes agregarlo al grupo "docker" dentro del contenedor.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

Este Dockerfile crea un usuario no root llamado myuser y lo agrega al grupo "docker", lo que le permite realizar tareas relacionadas con Docker, como construir y gestionar contenedores.

Escenario 4: Ejecutar comandos con privilegios

En algunos casos, tu usuario no root puede necesitar ejecutar comandos con privilegios que requieran capacidades específicas. Puedes usar la bandera --cap-add para otorgar las capacidades necesarias al usuario no root.

## Ejecutar el contenedor con una capacidad específica
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

En este ejemplo, al usuario no root se le otorga la capacidad "CAP_SYS_ADMIN", que le permite realizar tareas de administración del sistema que requieren privilegios elevados.

Al entender estos casos de uso prácticos y ejemplos, puedes otorgar de manera efectiva permisos detallados a usuarios no root en Docker, asegurándote de que tengan el acceso necesario para realizar sus tareas mientras se mantiene un entorno seguro y aislado.

Resumen

En este completo tutorial de Docker, aprenderás cómo asignar permisos detallados a usuarios no root, lo que les permitirá interactuar con contenedores y recursos de Docker sin elevar sus privilegios. Al comprender los principios de los privilegios de usuario en Docker y explorar casos de uso prácticos, podrás implementar un entorno de Docker más seguro y eficiente adaptado a las necesidades de tu organización.