Рейтинг:3

podman: контейнер без рута: разрешения для пользователя контейнера

флаг za

В нгинкс подман контейнер нгинкс пользователь используется для запуска нгинкс сервер.

На хост-машине лс-алх:

drwxrwx--- 2 myuser myuser 4.0K 10 авг 22:23 .
drwxrwx--- 3 myuser myuser 4.0K 10 авг 22:59 ..
-rw-rw---- 1 myuser myuser 46 авг 10 22:24 .htpasswd

Та же папка внутри контейнера лс-алх:

drwxrwx--- 2 root root 4.0K 10 авг 22:23 .
drwxr-xr-x 1 root root 4.0K 10 авг 11:05 ..
-rw-rw---- 1 root root 46 10 августа 22:24 .htpasswd

нгинкс пользователь внутри контейнера не может получить доступ .htpasswd потому что о-rwx.

Вопрос: какой шаблон обычно используется для обработки таких случаев в безродный контейнер универсальный? Возможно, можно создать группу (впоследствии используемую как владелец файловой группы), которая собирает все диапазоны из подчиненный/субгид для конкретного пользователя хоста - но как этого добиться?

Рейтинг:2
флаг in

С помощью параметра командной строки --uidmap Вы можете указать, как мой пользователь UID и мой пользователь sub UID сопоставляются с контейнером. (См. справочная страница за подман беги).

Параметр командной строки --gidmap работает так же, но для GID вместо UID.

Давайте посмотрим UID и GID для пользователя нгинкс в образе контейнера docker.io/библиотека/nginx

$ podman run --rm docker.io/library/nginx grep nginx /etc/passwd
nginx:x:101:101:пользователь nginx,,,:/несуществующий:/bin/false
$

Результат:

  • UID: 101
  • GID: 101

Числа позже используются при установке двух переменных оболочки.

$ контейнер_uid = 101
$ контейнер_гид = 101

(Переменные оболочки container_uid и container_gid не имеют никакого значения вне этого поста. Они просто введены, чтобы облегчить чтение ответа)

Загляните в файлы /etc/subuid и /etc/subgid на хосте.

Пользователь мой пользователь имеет эти дополнительные UID и дополнительные GID.

$ grep myuser /etc/subuid
мой пользователь: 231072: 65536
$ grep myuser /etc/subgid
мой пользователь: 231072: 65536
$ 

Результат:

мой пользователь имеет 65536 дополнительных UID и 65536 дополнительных GID.

Числа позже используются при установке двух переменных оболочки.

$ subuid_size = 65536
$ subgid_size = 65536

(Переменные оболочки subuid_size и subgid_size не имеют никакого значения вне этого поста. Они просто введены, чтобы облегчить чтение ответа)

Вместо того, чтобы смотреть вверх subuid_size и subgid_size в /etc/subuid и /etc/субгид, более общий метод — запустить команды

 subuid_size=$(( $(podman info --format "{{ range .Host.IDMappings.UIDMap }}+{{.Size }}{{end }}" ) - 1 ))
 subgid_size=$(( $(podman info --format "{{ range .Host.IDMappings.GIDMap }}+{{.Size }}{{end }}" ) - 1 ))

Преимущество в том, что это также работает, когда файл /etc/nsswitch.conf используется вместо /etc/subuid и /etc/субгид. (Видеть человек)

Демо 1: сопоставить пользователя мой пользователь на хосте пользователю корень внутри контейнера

Нет необходимости указывать --uidmap ни --gidmap потому что это стандартное отображение.

Создайте доступный для записи каталог для всего мира демо1

$ мкдир демо1
$ chmod 777 демо1
$

Создайте новый файл, работающий как корень внутри контейнера:

$ подман запустить --rm \
    -v ./demo1:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_root
$

Создайте новый файл, работающий как нгинкс внутри контейнера:

$ подман запустить --rm \
    --пользователь 101:101 \
    -v ./demo1:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_nginx
$

Список файлов на хосте

$ ls -l демо1
всего 0
-rw-r--r--. 1 231172 231172 0 27 авг 20:24 created_by_nginx
-rw-r--r--. 1 мой пользователь мой пользователь 0 27 авг 20:22 created_by_root
$ 

Результат: файл created_by_root принадлежит мой пользователь:мой пользователь

Демо 2: сопоставить пользователя мой пользователь на хосте пользователю нгинкс внутри контейнера

Создайте доступный для записи каталог для всего мира демо2

$ мкдир демо2
$ chmod 777 демо2
$

Создайте новый файл, работающий как корень внутри контейнера:

$ subuid_size = 65536
$ subgid_size = 65536
$ контейнер_uid = 101
$ контейнер_гид = 101
$ подман запустить --rm \
    --uidmap=0:1:$container_uid \
    --uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid)) \
    --uidmap=$container_uid:0:1 \
    --gidmap=0:1:$container_gid \
    --gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid)) \
    --gidmap=$container_gid:0:1 \
    -v ./demo2:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_root
$

Создайте новый файл, работающий как нгинкс внутри контейнера.

$ subuid_size = 65536
$ subgid_size = 65536
$ контейнер_uid = 101
$ контейнер_гид = 101
$ подман запустить --rm \
    --пользователь $container_uid:$container_gid \
    --uidmap=0:1:$container_uid \
    --uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid)) \
    --uidmap=$container_uid:0:1 \
    --gidmap=0:1:$container_gid \
    --gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid)) \
    --gidmap=$container_gid:0:1 \
    -v ./demo2:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_nginx
$

Список файлов на хосте

$ ls -l демо2
всего 0
-rw-r--r--. 1 мой пользователь мой пользователь 0 27 авг 20:26 created_by_nginx
-rw-r--r--. 1 231072 231072 0 27 авг 20:25 created_by_root
$ 

Результат: файл created_by_nginx принадлежит мой пользователь:мой пользователь

Заключение

Использовать --uidmap и --gidmap так же, как и в Демо 2.

Совет по устранению неполадок

Я написал совет по устранению неполадок: Невозможно получить доступ к переданным устройствам или файлам в контейнере без корневого каталога (проблема сопоставления UID/GID) который содержит метод, описанный в Демо 2

флаг cn
Это должен быть лучший ответ. Это решает многие из моих проблем, связанных с попытками иметь одного пользователя хоста без полномочий root для запуска нескольких контейнеров, которые работают с разными внутренними uid/gid, и все они должны получать доступ и записывать на тома, подключенные к хосту. Спасибо огромное!
Рейтинг:0
флаг cl
A.B

Вы должны выяснить, что такое начальный UID хоста для контейнера. нгинкс UID (просто коснитесь файла из контейнера, используя пользователя, под которым нгинкс работает, или проверьте его файлы журналов, или проверьте работающую нгинкс процесс. Затем используйте статистика или же лс-лн от начального хост-пользователя): какое-то большое значение UID, допустим, 100030.

Затем от непривилегированного пользователя исходного хоста вы можете использовать setfactl чтобы предоставить дополнительный доступ пользователю 100030. Это должно быть что-то вроде:

setfacl -R -m u:100030:rX,d:u:100030:rX папка

Если вы хотите нгинкс чтобы пользователь мог писать (что может быть плохой идеей), вы можете заменить rX с RWX или делайте это только в избранных каталогах. Дублирование, начинающееся с д: означает По умолчанию ACL, поэтому вновь созданные каталоги и файлы также наследуют те же дополнительные ACL. Когда ACL установлены, вывод лс отображает + и маску ACL вместо группы, так что это может выглядеть неожиданно.

Вот различные ссылки на ACL:

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.