GNU/Linux >> Tutoriales Linux >  >> Linux

Meterse en la maleza con Buildah:el comando buildah para dejar de compartir

A veces, los usuarios se preguntan acerca de las limitaciones del modo sin raíz para los motores de contenedores Buildah y Podman. Con el modo sin raíz, estamos ampliando los límites de lo que puede hacer un usuario sin privilegios. Uno de mis trabajos es trabajar con los equipos del kernel y los equipos del sistema de archivos para mejorar el rootless. En este artículo, explico por qué montar imágenes es más difícil en modo sin raíz.

[ También te puede interesar: Equilibrar la seguridad de Linux con la facilidad de uso]

Montaje sin raíz

Un usuario normal no puede montar un sistema de archivos a menos que esté en un espacio de nombres de usuario junto con su propio espacio de nombres de montaje . Un espacio de nombres de montaje permite que los procesos dentro de él monten sistemas de archivos que no son vistos por el espacio de nombres de montaje del host. Esta restricción del kernel protege el sistema operativo host de posibles ataques en los que un usuario podría montar contenido sobre /tmp o incluso en su directorio de inicio y luego engañar a otros procesos en el sistema o administradores para usar los puntos de montaje.

Una vez que el proceso del usuario se une al espacio de nombres del usuario y al nuevo espacio de nombres de montaje, el kernel solo permite que se monten ciertos sistemas de archivos. En el momento de escribir este artículo, el kernel permite los sistemas de archivos sysfs, procfs, tmpfs, bind mount y fuse. Recientemente recibimos un parche en el kernel ascendente para admitir sistemas de archivos superpuestos, lo que supondrá una gran mejora, pero actualmente, la mayoría de las distribuciones no cuentan con este soporte. Me encantaría obtener compatibilidad con NFS, pero existen riesgos de seguridad con esto. Con suerte, el kernel solucionará estos problemas y, finalmente, será compatible.

Los motores de contenedores sin raíz como Podman y Buildah crean automáticamente su propio espacio de nombres de usuario y montan el espacio de nombres cuando se ejecutan. Cuando el proceso del motor del contenedor finaliza, los espacios de nombres de montaje y de usuario desaparecen, y el proceso de usuario vuelve al espacio de nombres de montaje del host. En este punto, los montajes creados mientras se ejecutan las herramientas ya no son visibles ni pueden ser utilizados por otros procesos en el host.

¿Por qué es importante?

Una de las características interesantes de Buildah es que permite a los usuarios acceder a la semántica de bajo nivel de la construcción de contenedores. La mayoría de los creadores de imágenes de contenedores solo tienen una forma de crear contenedores, básicamente usando Containerfiles o Dockerfiles. Buildah bud admite la construcción con estos archivos. Buildah también permite a los usuarios construir contenedores utilizando primitivas de bajo nivel. Los usuarios pueden usarlo para crear un directorio, llenar el directorio con contenido, crear una imagen y enviarla a un registro.

# ctr=$(buildah from scratch)
# mnt=$buildah mount $ctr)
# dnf -y --install-root $mnt httpd 
# buildah config --entrypoint .... $ctr
# buildah commit $ctr IMAGE
# buildah push IMAGE REGISTRY

Todo esto funciona muy bien cuando se ejecuta como root, pero cuando los usuarios intentan ejecutarlo en modo sin root, sus scripts explotan.

$ mnt=$(buildah mount $ctr)
cannot mount using driver overlay in rootless mode. You need to run it in a `buildah unshare` session

El problema es mnt=$(buildah mount $ctr) se niega a montar la imagen con el controlador de superposición si no ha ejecutado buildah unshare .

Echando un vistazo más de cerca

Cuando ejecutas buildah comandos, como bud y run , en modo sin raíz, el buildah El comando ingresa los espacios de nombres de usuario y montaje. Monta bien el sistema de archivos del contenedor y ejecuta los comandos. Cuando se complete el comando, buildah sale, lo que hace que se destruyan los espacios de nombres. Al hacer esto con el mount comando, el sistema de archivos montado nunca se vio en el espacio de nombres de montaje del host. Buildah ahora verifica esta situación e informa al usuario que debe emitir un buildah unshare primero.

buildah dejar de compartir

Buildah y Podman tienen un comando especial, unshare . Este comando crea e ingresa el espacio de nombres de usuario sin crear o interactuar con un contenedor. En realidad, es bastante interesante explorar este modo para comprender completamente lo que está haciendo el espacio de nombres de usuario. Ejecutando buildah unshare comando ejecutará un comando de shell en los espacios de nombres que se ejecutan como raíz en el espacio de nombres de usuario. Ahora puede ejecutar cualquier comando, incluido el buildah comandos descritos anteriormente. Dado que estos comandos ya están en los espacios de nombres, el buildah mount El comando funcionará igual que en el modo root. Todo sucede dentro de los espacios de nombres y el usuario obtiene lo que espera.

Ahora el usuario podría tomar los comandos enumerados anteriormente y crear un script de shell. Este script de shell se ejecuta directamente con buildah unshare comando.

$ cat > buildahimage.sh < _EOF
ctr=$(buildah from scratch)
mnt=$buildah mount $ctr)
dnf -y --install-root $mnt httpd 
buildah config --entrypoint .... $ctr
buildah commit $ctr IMAGE
buildah push IMAGE REGISTRY
 < _EOF
chmod +x /buildahimage.sh
buildah unshare ./buildimage.sh

[ ¿Empezando con los contenedores? Consulta este curso gratuito. Implementación de aplicaciones en contenedores:una descripción técnica general. ]

Resumir

Lamentablemente, no podemos arreglar todo dentro del kernel para brindarles a los usuarios la experiencia sin raíces que esperan, principalmente debido a problemas de seguridad. Pero podemos acercarnos bastante. Y, por supuesto, siempre puede trabajar en modo raíz si necesita funciones adicionales.


Linux
  1. Programación de tareas con el comando cron de Linux

  2. Programar una tarea con Linux al mando

  3. Importe funciones y variables a Bash con el comando fuente

  4. Ordenarse con ordenar en la línea de comando

  5. Primeros pasos con el comando tac de Linux

Primeros pasos con el administrador de ventanas i3 en Linux

El tutorial del comando fc con ejemplos para principiantes

Manipulación de texto en la línea de comando con grep

Seguimiento del tiempo con Timewarrior en la línea de comandos

Primeros pasos con el comando Tar

Comando de montaje de Linux con ejemplos