Todos los procesos en el contenedor se ejecutarán como usuario raíz, a menos que lo especifique de una manera especial. Esto parece muy conveniente porque este usuario no tiene restricciones. Esta es la razón por la que trabajar como root es incorrecto desde el punto de vista de la seguridad. Si nadie en su sano juicio trabaja en la computadora local con derechos de root, muchos ejecutan procesos bajo la raíz en contenedores.
Siempre hay errores que permitirán que el malware escape del contenedor y llegue a la computadora host. Suponiendo lo peor, debemos asegurarnos de que los procesos dentro del contenedor sean ejecutados por un usuario que no tenga ningún derecho en la máquina host.
Creando un usuario
Crear un usuario en un contenedor no es diferente de crearlo en distribuciones de Linux. Sin embargo, los comandos pueden variar para diferentes imágenes base.
Para distribuciones basadas en Debian, debe agregar lo siguiente al Dockerfile:
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
Ejecución de procesos desde el usuario.
Para ejecutar todos los procesos posteriores como usuario con UID 2000, ejecute:
USER 2000
Para ejecutar todos los procesos posteriores como usuario del nodo, ejecute:
USER node
Más en
Volúmenes de montaje
Al montar volúmenes dentro de un contenedor, brinde al usuario la capacidad de leer y/o escribir archivos. Para hacer esto, el UID (GID) del usuario en el contenedor y el usuario fuera del contenedor que tiene los permisos adecuados para acceder al archivo deben coincidir. En este caso, los nombres de usuario no importan.
A menudo, en una computadora Linux, el UID y el GID de un usuario son iguales a 1000. Estos identificadores se asignan al primer usuario de la computadora.
Averiguar 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 un UID y GID a un usuario
Si el usuario fue creado previamente, pero necesitas cambiar los identificadores, puedes hacerlo así:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Si está utilizando la imagen base alpina, debe instalar el paquete de sombra:
RUN apk add —no-cache shadow
Pasar la ID de usuario dentro del contenedor al crear la imagen
Si su ID y los ID de todas las personas que trabajan en el proyecto coinciden, simplemente especifique este ID en el Dockerfile. Sin embargo, a menudo los ID de usuario no coinciden.
No está claro de inmediato cómo lograr lo que desea. Para mí, esto fue lo más difícil en el proceso de dominar Docker. Muchos usuarios de Docker no se dan cuenta de que existen diferentes etapas en la vida de una imagen. Primero, la imagen se ensambla mediante un Dockerfile. Cuando se ejecuta un contenedor desde una imagen, el Dockerfile ya no se utiliza.
La creación del usuario debe ocurrir cuando se construye la imagen. Lo mismo se aplica a la determinación del usuario bajo el cual se inician los procesos. Esto significa que de alguna manera debemos pasar el UID (GID) dentro del contenedor.
Las directivas se utilizan para utilizar variables externas en el Dockerfile.
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Puedes pasar argumentos a través de Docker-compose de esta manera:
docker-componer
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PD: Para dominar todas las complejidades de Docker, no basta con leer la documentación o los artículos. Necesitas practicar mucho, necesitas familiarizarte con Docker.
Fuente: habr.com