
Quiero usar un servidor para alojar varios contenedores acoplables. Quiero darle a otro usuario la posibilidad de administrar nuevos contenedores Docker, pero no quiero darle acceso a todos los demás contenedores que inicié, ya que pueden contener datos confidenciales.
¿Existe alguna manera de crear una configuración segura que no requiera la creación de una máquina virtual?
Respuesta1
Pregunta original: ¿Cómo permitir que el usuario haga girar sus propios contenedores y no acceda a los otros contenedores?
(Esta fue mi respuesta originalmente, pero tal vez entendí mal la pregunta o la pregunta no era tan clara, de todos modos mantuve la solución original aquí.)
Docker no proporciona esta función por sí solo, pero hay varias formas de hacerlo.
La idea es que los comandos de la ventana acoplable requieren que el usuario esté en sudo o en el grupo de la ventana acoplable para ejecutarse, por lo que si solo desea que el usuario gire un nuevo contenedor, en lugar de agregar el usuario a sudo o al grupo de la ventana acoplable, que proporciona acceso completo a todas las ventanas acoplables. comandos, puede incluir en la lista blanca solo varios comandos de Docker para ese usuario.
Por ejemplo, si desea permitir que el usuario tom ejecute el siguiente contenedor:
sudo docker container run --it --name ubuntu-tom ubuntu:latest bash
Puede agregar la siguiente línea a su archivo sudoers ejecutandosudo visudo:
tom ALL=NOPASSWD: /usr/bin/docker container run --it --name ubuntu-tom ubuntu:latest bash
Esto permite al usuario Tom ejecutar este comando de Docker en particular como root sin requerir una contraseña. Cualquier otro comando de Docker no estará disponible para el usuario tom.
Otra alternativa es configurar un shell restringido, pero no entraré en detalles aquí.
Pregunta actualizada: ¿Cómo limitar al usuario para que administre nuevos contenedores?
No conozco una posible solución que utilice únicamente Docker.
Parece que necesitas un orquestador como Kubernetes o ECS.
De esta manera, el orquestador es propietario del demonio acoplable y usted puede utilizar la capa de permisos proporcionada por el orquestador. Esteartículoproporciona un gran ejemplo de cómo restringir el acceso de los usuarios a un espacio de nombres.
Respuesta2
Debería ser bastante sencillo ejecutarlo dockerd
por usuario y utilizar permisos de archivos para separar el acceso de los usuarios.
Acabo de encontrar un tutorial que utiliza plantillas de systemd para obtener esta configuración: https://www.jujens.eu/posts/en/2018/Feb/25/multiple-docker/
Respuesta3
¿Por qué no implementas Portainer? Tiene muchas funciones como control de usuario, menú GUI y mucho más. No es necesario crear un usuario en el servidor.
Respuesta4
La API de Docker no tiene esta capacidad internamente; trate el acceso directo a esto como una capacidad de nivel de administrador de sistemas porque brinda a los usuarios acceso raíz al servidor. Por lo tanto, para implementar esto, deberá proporcionar su propio acceso indirecto a la API o utilizar otra herramienta que proporcione esta funcionalidad además de la ventana acoplable.
Puede proporcionar un script al que accede sudo y que realiza todas las comprobaciones de seguridad de los comandos antes de ejecutarlos. La forma más sencilla de implementar esto sería agregar una etiqueta a cada objeto creado (contenedor, volumen, red, etc.) y luego devolver solo los objetos que coincidan con ese filtro en cualquier consulta y limitar la ejecución de comandos solo a objetos con esas etiquetas. No es trivial escribirlo, por lo que solo he visto a personas optar por opciones posteriores. Sin embargo, si los comandos y contenedores que se ejecutan son muy limitados, esta puede ser una solución suficientemente buena para usted.
El espacio de nombres de Kubernetes proporciona esta funcionalidad y se ejecuta sobre la ventana acoplable. Esto es mucho para implementar, por lo que la mayoría de las personas solo toman esta dirección si necesitan mucha más funcionalidad que proporciona Kubernetes.
Existen varias herramientas de terceros, algunas comerciales, que manejan el acceso de los usuarios. Portainer y Rancher son dos populares, pero no tengo experiencia personal con ellos.
Docker ofrece una oferta empresarial con esto incluido llamada UCP. Puede otorgar a los usuarios acceso a la API/CLI de Docker que pasa por UCP para la verificación de RBAC antes de que la solicitud se envíe al motor de Docker subyacente.