Andrey Kopylov , nuestro director técnico, ama, usa y promueve activamente Docker. En un nuevo artículo, habla sobre cómo crear usuarios en Docker. Corrija el trabajo con ellos, por qué los usuarios no pueden quedarse con privilegios de root y cómo resolver el problema de la falta de coincidencia de identificadores en el Dockerfile.
Todos los procesos en el contenedor se ejecutarán como root, a menos que se especifique de manera especial. Parece muy conveniente, porque este usuario no tiene restricciones. Es por eso que trabajar desde la raíz está mal desde un punto de vista de seguridad. Si en la computadora local nadie en su sano juicio trabaja con derechos de root, entonces muchos inician procesos bajo la raíz en contenedores.
Siempre hay errores que permiten que el malware salga del contenedor y llegue a la computadora host. Suponiendo lo peor, debemos asegurarnos de que los procesos se inicien dentro del contenedor de un usuario que no tiene ningún derecho en la máquina host.
Creación de usuario
Crear un usuario en un contenedor no es diferente de crearlo en distribuciones de Linux. Sin embargo, para diferentes imágenes básicas, los equipos pueden variar.
Para distribuciones basadas en Debian en el Dockerfile, debe agregar:
RUN groupadd --gid 2000 node \ && useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Para alpino:
RUN addgroup -g 2000 node \ && adduser -u 2000 -G node -s /bin/sh -D node
Iniciar procesos desde el usuario
Para iniciar todos los procesos posteriores de un usuario con UID 2000, ejecute:
USER 2000
Para iniciar todos los procesos posteriores desde el nodo de usuario, ejecute:
USER node
Más detalles en la documentación .
Montar volúmenes
Cuando monte volúmenes dentro de un contenedor, brinde al usuario la capacidad de leer y / o escribir archivos. Para esto, el UID (GID) del usuario en el contenedor y el usuario fuera del contenedor que tiene los derechos de acceso apropiados al archivo debe corresponder. Al mismo tiempo, los nombres de usuario no importan.
A menudo, en una computadora Linux, el UID y GID del usuario son 1000. Estos identificadores se asignan al primer usuario de la computadora.
Obtener sus identificadores es fácil:
id
Recibirá información completa sobre su usuario.
Reemplace 2000 de los ejemplos con su identificador y todo estará bien.
Asignar usuario UID y GID
Si el usuario se creó antes, pero es necesario cambiar los identificadores, puede hacerlo así:
RUN usermod -u 1000 node \ && groupmod -g 1000 node
Si está utilizando la imagen alpina básica, debe instalar el paquete sombra:
RUN apk add —no-cache shadow
Pasar la ID de usuario dentro del contenedor al construir la imagen
Si su identificador y los identificadores de todas las personas que trabajan en el proyecto son iguales, simplemente especifique este identificador en el Dockerfile. Sin embargo, a menudo los identificadores de usuario no coinciden.
Cómo realizar lo deseado no está claro de inmediato. Para mí fue lo más difícil en el proceso de dominar docker. Muchos usuarios de Docker no creen que haya diferentes etapas en la vida de una imagen. Primero, la imagen se recopila para esto usando el Dockerfile. Al iniciar un contenedor desde una imagen de Dockerfile, ya no se usa.
La creación de usuarios debe ocurrir al construir la imagen. Lo mismo se aplica a la definición de usuario desde la que se inician los procesos. Esto significa que de alguna manera debemos pasar el UID (GID) al contenedor.
Las directivas ENV y ARG se utilizan para usar variables externas en el Dockerfile. Una comparación detallada de las directivas está aquí .
Dockerfile
ARG UID=1000 ARG GID=1000 ENV UID=${UID} ENV GID=${GID} RUN usermod -u $UID node \ && groupmod -g $GID node
Puede pasar argumentos a través de docker-compose de esta manera:
docker-compose
build: context: ./src/backend args: UID: 1000 GID: 1000
PD: Para dominar todos los trucos de Docker, no es suficiente leer documentación o artículos. Necesitas practicar mucho, necesitas sentir el acoplador.