GNU/Linux >> Tutoriales Linux >  >> Linux

Compartir grupos complementarios con contenedores Podman

Los contenedores Rootless Podman son una característica realmente genial que permite a los usuarios ejecutar casi todos los contenedores en su directorio de inicio sin necesidad de privilegios adicionales.

Los contenedores sin raíz aprovechan el espacio de nombres de usuario, como expliqué en este blog.

A veces, el espacio de nombres de usuario y otras capas de seguridad del contenedor como SELinux hacen que sea más difícil compartir contenido dentro del contenedor. Hemos visto muchos usuarios que quieren compartir directorios del sistema en sus contenedores pero fallan con errores de permisos. Estos directorios generalmente se comparten a través de algún acceso de grupo, lo que permite al usuario leer/escribir contenido en los directorios.

[ También te puede interesar: Contenedores sin raíz con Podman ]

Por ejemplo, el usuario podría tener un directorio /mnt/engineering en su sistema, que es propiedad de root y grupo eng y con permisos establecidos en 770.

Veamos un ejemplo.

Agregue el eng grupo:

# groupadd eng

Hacer el directorio compartido:

# mkdir /var/lib/mycontainers/

Cambie el acceso de grupo para el directorio:

# chown root:eng /var/lib/mycontainers/

Cambia los permisos para que el grupo pueda escribir en el directorio:

# chmod 770 /mnt/engineering

Cambie el tipo SELinux del directorio para que los contenedores puedan usarlo:

# chcon -t container_file_t /mnt/engineering

A continuación, veamos los permisos en el directorio:

# ls -lZ /mnt/engineering/ -d
drwxrwx---. 2 root eng unconfined_u:object_r:user_tmp_t:s0 40 Feb  9 07:24 /mnt/engineering/

Ahora el usuario puede agregarse a eng grupo:

$ grep eng /etc/group
Eng:x:14905:dwalsh

Inicie sesión en el sistema y asegúrese de que el usuario esté en eng grupo:

$ id
uid=3267(dwalsh) gid=3267(dwalsh) groups=3267(dwalsh),10(wheel),14905(eng) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Asegúrese de que el usuario pueda leer/escribir contenido en el directorio:

$ touch /mnt/engineering/test
$ ls -l /mnt/engineering/
total 0
-rw-------. 1 dwalsh dwalsh 0 Feb  9 07:36 test

Ahora ejecute un contenedor usando este volumen, pero el contenedor obtiene el permiso denegado:

$ podman run --userns=keep-id -v /mnt/engineering/:/mnt/engineering ubi8 ls /mnt/engineering/
ls: cannot open directory '/mnt/engineering/': Permission denied

Ya que sabemos que SELinux no está bloqueando ya que configuramos la etiqueta correctamente, ¿qué pasó?

Espacio de nombres de usuario

El problema es el espacio de nombres de usuario.

$ podman run --userns=keep-id -v /mnt/engineering/:/mnt/engineering ubi8 id
uid=3267(dwalsh) gid=3267(dwalsh) groups=3267(dwalsh)

Tenga en cuenta que --userns=keep-id bandera se utiliza para garantizar que el UID dentro del contenedor no sea root sino el UID normal del usuario. Note arriba que cuando ejecuto el id comando fuera del contenedor, mis grupos incluyen el eng grupo, pero cuando se ejecuta el contenedor, el eng el grupo no aparece. Desde una perspectiva de seguridad, esto es bueno porque si los procesos del contenedor escaparan, no tendrían acceso a los directorios a los que tengo acceso de grupo. Si los usuarios quieren otorgar acceso, tienen un problema.

El problema es que es difícil otorgar acceso al contenedor a estos directorios. Creando un eng grupo dentro del contenedor no coincidiría con eng grupo en el host porque el espacio de nombres de usuario compensa el UID del grupo real.

Afortunadamente, el tiempo de ejecución de OCI crun admite una función especial para filtrar estos grupos adicionales en el contenedor. Esta habilidad está cubierta en podman run página man:

man podman run
...
       Note: if the user only has access rights via a group, accessing the de‐
       vice  from inside a rootless container will fail. The crun(1) runtime
       offers  a  workaround  for  this  by  adding  the  option  --annotation
       run.oci.keep_original_groups=1.

Y más explicado en el crun página man:

man crun
…
run.oci.keep_original_groups=1
       If the annotation run.oci.keep_original_groups is present, then crun
       will skip the setgroups syscall that is used to either set the addi‐
       tional groups specified in the OCI configuration, or to reset the list
       of additional groups if none is specified.

Si configuro esa anotación, mi Podman sin raíz ahora tiene acceso al volumen, como se ve a continuación:

$ podman run -ti --annotation run.oci.keep_original_groups=1 --userns=keep-id -v /mnt/engineering/:/mnt/engineering ubi8 ls /mnt/engineering/
-rw-------. 1 dwalsh dwalsh 0 Feb  9 12:36 test

Usamos una anotación ya que la Especificación OCI actualmente no tiene una forma de decirle esto al tiempo de ejecución de OCI. Hemos sugerido agregarlo a la especificación. En este momento, ningún otro tiempo de ejecución de OCI que no sea crun puede manejar esto, incluido runc . Quizás en el futuro, esta característica se agregue a la OCI.

contenedores.conf

Si el usuario desea que todos sus contenedores compartan los grupos de usuarios, puede agregar esta anotación a containers.conf en sus directorios de inicio.

$ cat ~/.config/containers/containers.conf
[containers]
annotations=["run.oci.keep_original_groups=1",]

Ahora, incluso el Podman predeterminado puede crear contenido en el volumen y los procesos de usuario fuera del contenedor ven el contenido correcto.

$ podman run -ti --userns=keep-id -v /mnt/engineering/:/mnt/engineering ubi8 touch /mnt/engineering/test2
$  ls -l /mnt/engineering/
total 0
-rw-------. 1 dwalsh dwalsh 0 Feb  9 07:36 test
-rw-r--r--. 1 dwalsh dwalsh 0 Feb  9 13:36 test2

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

Conclusión

Compartir contenido del host en un contenedor a través del montaje de volumen a veces puede ser bloqueado por varias características de seguridad de los contenedores. Por suerte Podman y crun tienen funciones avanzadas para permitir que contenedores específicos compartan este contenido y containers.conf permite a los usuarios configurar su sistema en todos los contenedores para obtener acceso a estos volúmenes.


Linux
  1. Asegure sus contenedores con SELinux

  2. ¿Siguen siendo importantes las distribuciones de Linux con los contenedores?

  3. Uso de archivos y dispositivos en contenedores sin raíz de Podman

  4. Administrar grupos de usuarios de Linux

  5. Administrar grupos y reglas de seguridad

Tutorial de Podman:comience a usar Podman

Domótica:Ejecución de Home Assistant con Podman

Modificar grupos en Linux con el comando groupmod

Eliminar grupos en Linux con el comando groupdel

Crear nuevos grupos en Linux con el comando Groupadd

Comandos de gestión de grupos en Linux