GNU/Linux >> Tutoriels Linux >  >> Linux

Comprendre la propriété des fichiers utilisateur dans Docker :comment éviter de modifier les autorisations des volumes liés

Deux options que j'ai trouvées :

CHOWN toutes les choses (après avoir fait votre travail)

J'ai fait docker run -v `pwd`/shared:/shared image , et le conteneur a créé des fichiers dans pwd/shared qui appartiennent au processus docker. Cependant, /shared m'appartient toujours. Donc, dans le processus docker, je fais

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

stat -c "%u:%g" /shared renvoie 1000:1000 dans mon cas, étant le uid:gid de mon utilisateur. Même s'il n'y a pas d'utilisateur 1000 dans le docker conatainer, l'id est là (et stat /shared dit simplement "inconnu" si vous demandez le nom d'utilisateur).

Quoi qu'il en soit, chown transfère docilement la propriété du contenu de /shared à 1000:1000 (qui, pour sa part, n'existe pas, mais hors du contenant, c'est moi). Je possède donc maintenant tous les fichiers. Le conteneur peut toujours modifier les choses s'il le souhaite, car de son point de vue, c'est root .

Et tout va bien dans le monde.

docker run -u ainsi tous les fichiers créés auront automatiquement le bon propriétaire

Une autre façon de faire est le -u indicateur lors de l'exécution du menu fixe.

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

De cette façon, l'utilisateur docker à l'intérieur du conteneur est youruid:yourgid .

Cependant : cela signifie renoncer à votre autorité racine dans le conteneur (apt-get install , etc.). Sauf si vous créez un utilisateur avec ce nouvel uid et l'ajoutez au root groupe.


Est-ce exact? Quelqu'un peut-il m'indiquer la documentation à ce sujet, je ne fais que conjecturer sur la base de l'expérience ci-dessus.

C'est peut-être simplement parce qu'ils ont tous les deux la même valeur numérique sur le noyau, et si je testais sur un système où mon utilisateur personnel n'était pas id 1000, les autorisations seraient modifiées dans tous les cas ?

Avoir une lecture de info coreutils 'chown invocation' , cela pourrait vous donner une meilleure idée du fonctionnement des autorisations/de la propriété des fichiers.

Fondamentalement, cependant, chaque fichier sur votre machine a un ensemble de bits qui définit ses autorisations et sa propriété. Lorsque vous chown un fichier, vous ne faites que définir ces bits.

Lorsque vous chown un fichier à un utilisateur/groupe particulier en utilisant le nom d'utilisateur ou le nom de groupe, chown cherchera dans /etc/passwd pour le nom d'utilisateur et /etc/group pour que le groupe tente de mapper le nom à un ID. Si le nom d'utilisateur / nom de groupe n'existe pas dans ces fichiers, chown échouera.

[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'

Cependant, vous pouvez chown un fichier utilisant les identifiants de ce que vous voulez (dans certaines limites supérieures d'entiers positifs, bien sûr), qu'il existe ou non un utilisateur / groupe avec ces identifiants sur votre machine.

[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

Les bits UID et GID sont définis sur le fichier lui-même, donc lorsque vous montez ces fichiers dans votre conteneur Docker, le fichier a le même UID de propriétaire/groupe que sur l'hôte, mais est maintenant mappé sur /etc/passwd dans le conteneur, qui sera probablement un utilisateur différent à moins qu'il n'appartienne à root (UID 0).

La vraie question est, bien sûr, « qu'est-ce que je fais à ce sujet ? Si bob est connecté en tant que bob sur la machine hôte donnée, il devrait pouvoir exécuter le conteneur en tant que bob et ne pas modifier les autorisations de fichiers sous son compte hôte. Dans l'état actuel des choses, il doit en fait exécuter le conteneur en tant qu'utilisateur docker pour éviter que son compte ne soit modifié.

Il semble qu'avec votre configuration actuelle, vous devrez vous assurer que vos UID > noms d'utilisateur sont en /etc/passwd sur votre hébergeur correspondent à vos UIDs> noms d'utilisateurs dans vos conteneurs /etc/passwd si vous souhaitez interagir avec votre répertoire utilisateur monté en tant que même utilisateur connecté sur l'hôte.

Vous pouvez créer un utilisateur avec un identifiant d'utilisateur spécifique avec useradd -u xxxx . Buuuut, cela semble être une solution désordonnée...

Vous devrez peut-être trouver une solution qui ne monte pas le répertoire d'accueil des utilisateurs hôtes.


Donc, je me suis retrouvé dans ce post en cherchant comment restaurer la propriété de tous les fichiers (appartenant à root) qui sont sortis d'un conteneur docker fonctionnant en tant que root , à mon utilisateur non privilégié dans l'hôte.

J'avais besoin que le processus à l'intérieur du conteneur s'exécute en tant que root, donc je ne peux pas utiliser -u sur docker run.

Je ne suis pas fier de ce que j'ai fait, mais à la fin de mon script bash, j'ai ajouté ceci :

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/'

Décomposons certaines lignes :

  • Exécutez /bin/sh à l'intérieur du conteneur :

--entrypoint /bin/sh

  • Passez l'uid de l'utilisateur actuel en tant que variable d'environnement au conteneur :

-e HOST_UID=`id -u`

  • Montez le dossier que vous souhaitez redonner à votre utilisateur (rempli de fichiers appartenant à root, générés par le conteneur précédent qui s'exécutait en tant que root ), sous le /tmp de ce nouveau conteneur :

-v ${HOST_FOLDER_OWNED_BY_ROOT} :/tmp

  • Exécuter chown récursivement avec l'uid de l'utilisateur hôte sur le répertoire cible (monté à l'intérieur du conteneur en /tmp ):

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

Ainsi, avec cela, j'ai récupéré les fichiers appartenant à mon utilisateur actuel sans avoir à "élever" les privilèges vers root ou vers sudo.

C'est sale, mais ça a marché. J'espère que j'ai aidé.


Linux
  1. Comment copier les autorisations et la propriété des fichiers dans un autre fichier sous Linux

  2. Comment conserver la propriété et les autorisations de fichiers intactes lors de la copie de fichiers ou de répertoires

  3. Linux chmod et chown - Comment modifier les autorisations et la propriété des fichiers sous Linux

  4. Comment forcer la propriété d'un utilisateur/groupe sur des fichiers sur un partage Samba

  5. Comment éviter de modifier les autorisations Linux d'un fichier lors de l'enregistrement via une connexion Samba ?

Autorisations Linux - Comment trouver les autorisations d'un fichier

Comment ouvrir le gestionnaire de fichiers Ubuntu en tant qu'utilisateur root

Comment limiter l'utilisateur root dans CentOS

Comment activer l'utilisateur root dans Ubuntu Server ?

Comment monter et afficher le fichier ISO en tant qu'utilisateur root et régulier sous Linux

Comprendre les autorisations de fichiers de base et la propriété sous Linux