GNU/Linux >> Tutoriales Linux >  >> Linux

Comprensión de la propiedad del archivo del usuario en la ventana acoplable:cómo evitar cambiar los permisos de los volúmenes vinculados

Dos opciones que he encontrado:

CHOWN todas las cosas (después de hacer tu trabajo)

He hecho docker run -v `pwd`/shared:/shared image y el contenedor ha creado archivos dentro de pwd/shared que son propiedad del proceso docker. Sin embargo, /shared sigue siendo de mi propiedad. Así que dentro del proceso docker, lo hago

chown -R `stat -c "%u:%g" /shared` /shared

stat -c "%u:%g" /shared devuelve 1000:1000 en mi caso, siendo el uid:gid de mi usuario. Aunque no hay ningún usuario 1000 dentro del contenedor docker, la identificación está allí (y stat /shared solo dice "desconocido" si le pide el nombre de usuario).

De todos modos, chown transfiere obedientemente la propiedad de los contenidos de /shared a 1000:1000 (que, por lo que a él respecta, no existe, pero fuera del contenedor, soy yo). Así que ahora soy dueño de todos los archivos. El contenedor todavía puede modificar cosas si quiere, porque desde su perspectiva, es root .

Y todo está bien en el mundo.

docker run -u por lo que todos los archivos creados tendrán automáticamente el propietario correcto

Otra forma de hacer esto es el -u marca en la ejecución de la ventana acoplable.

docker run -v `pwd`/shared:/shared -u `stat -c "%u:%g" /shared` ubuntu bash

De esta forma, el usuario de la ventana acoplable dentro del contenedor es youruid:yourgid .

Sin embargo: esto significa renunciar a su autoridad de root dentro del contenedor (apt-get install , etc.). A menos que cree un usuario con ese nuevo uid y lo agregue al root grupo.


¿Es eso correcto? ¿Puede alguien señalarme la documentación de esto? Solo estoy conjeturando en base al experimento anterior.

¿Quizás esto se debe a que ambos tienen el mismo valor numérico en el kernel, y si probé en un sistema donde mi usuario doméstico no era id 1000, entonces los permisos cambiarían en todos los casos?

Tener una lectura de info coreutils 'chown invocation' , eso podría darle una mejor idea de cómo funcionan los permisos/la propiedad de los archivos.

Básicamente, sin embargo, cada archivo en su máquina tiene un conjunto de bits agregados que definen sus permisos y propiedad. Cuando chown un archivo, solo está configurando estos bits.

Cuando chown un archivo a un usuario/grupo en particular utilizando el nombre de usuario o nombre de grupo, chown buscará en /etc/passwd para el nombre de usuario y /etc/group para que el grupo intente asignar el nombre a una ID. Si el nombre de usuario/grupo no existe en esos archivos, chown fallará.

[email protected]:/test# touch test
[email protected]:/test# ll
total 8
drwxr-xr-x  2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r--  1 root root    0 Oct 22 18:15 test
[email protected]:/test# chown test:test test
chown: invalid user: 'test:test'

Sin embargo, puede chown un archivo que usa ID para lo que quieras (dentro de algunos límites superiores de números enteros positivos, por supuesto), ya sea que haya un usuario/grupo que exista con esas ID en tu máquina o no.

[email protected]:/test# chown 5000:5000 test
[email protected]:/test# ll
total 8
drwxr-xr-x  2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r--  1 5000 5000    0 Oct 22 18:15 test

Los bits de UID y GID se configuran en el propio archivo, por lo que cuando monta esos archivos dentro de su contenedor docker, el archivo tiene el mismo UID de propietario/grupo que tiene en el host, pero ahora está asignado a /etc/passwd en el contenedor, que probablemente será un usuario diferente a menos que sea propiedad de root (UID 0).

La verdadera pregunta es, por supuesto, '¿qué debo hacer al respecto?' Si bob está conectado como bob en la máquina anfitriona dada, debería poder ejecutar el contenedor como bob y no modificar los permisos de archivo en su cuenta de host. Tal como está, en realidad necesita ejecutar el contenedor como ventana acoplable de usuario para evitar que se altere su cuenta.

Parece que, con su configuración actual, deberá asegurarse de que sus UID> nombres de usuario en /etc/passwd en su host coincida con sus UID> nombres de usuario en sus contenedores /etc/passwd si desea interactuar con su directorio de usuarios montado como el mismo usuario que inició sesión en el host.

Puede crear un usuario con una identificación de usuario específica con useradd -u xxxx . Buuuut, eso parece una solución complicada...

Es posible que deba encontrar una solución que no monte un directorio de inicio de usuarios de host.


Entonces, terminé en esta publicación buscando cómo restaurar la propiedad de todos los archivos (propiedad de root) que salieron de un contenedor docker ejecutándose como root , a mi usuario sin privilegios en el host.

Necesitaba que el proceso dentro del contenedor se ejecutara como raíz, por lo que no puedo usar -u en la ejecución de la ventana acoplable.

No estoy orgulloso de lo que hice, pero al final de mi script bash, agregué esto:

docker run --rm -it \
    --entrypoint /bin/sh \
    -e HOST_UID=`id -u` \
    -v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp \
    alpine:latest \
    -c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'

Desglosemos algunas de las líneas:

  • Ejecute /bin/sh dentro del contenedor:

--punto de entrada /bin/sh

  • Pase el uid del usuario actual como una variable de entorno al contenedor:

-e HOST_UID=`id -u`

  • Monte cualquier carpeta que desee volver a poseer para su usuario (llena de archivos propiedad de root, generada por el contenedor anterior que se ejecutó como root ), bajo el /tmp de este nuevo contenedor :

-v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp

  • Ejecutar chown recursivamente con el uid del usuario del host sobre el directorio de destino (montado dentro del contenedor en /tmp ):

-c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'

Entonces, con esto, le devolví los archivos a mi usuario actual sin tener que "escalar" los privilegios a root o sudo.

Está sucio, pero funcionó. Espero haber ayudado.


Linux
  1. ¿Cómo cambiar los permisos del usuario raíz a todos los usuarios?

  2. Comprensión de cómo Umask controla los permisos iniciales de archivo/directorio en Linux

  3. Cómo administrar permisos/propiedades de archivos y directorios en Linux

  4. ¿Cómo evito cambiar los permisos de Linux de un archivo al guardar a través de una conexión samba?

  5. ¿Cómo sé los permisos de un usuario específico en Linux con acceso de root?

Permisos de Linux:cómo encontrar los permisos de un archivo

Cómo abrir el administrador de archivos de Ubuntu como usuario root

Cómo limitar el usuario root en CentOS

¿Cómo habilitar el usuario raíz en Ubuntu Server?

Cómo montar y ver un archivo ISO como raíz y usuario normal en Linux

Comprender los permisos básicos de archivos y la propiedad en Linux