Usuario en Docker

andréi kópílov, nuestro CTO, ama, utiliza y promueve activamente Docker. En un nuevo artículo, explica cómo crear usuarios en Docker. Trabajar correctamente con ellos, por qué los usuarios no deberían quedarse con derechos de root y cómo resolver el problema de los indicadores no coincidentes en Dockerfile.

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 documentación.

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. ENV и ARG. Comparación detallada de directivas aquí.

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

Añadir un comentario