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

В nginx podman container nginx пользователь используется для запуска сервера nginx .

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

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

Та же папка внутри контейнера ls -alh :

drwxrwx--- 2 root root 4.0K Aug 10 22:23 .
drwxr-xr-x 1 root root 4.0K Aug 10 11:05 ..
-rw-rw---- 1 root root   46 Aug 10 22:24 .htpasswd

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

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

3
задан 24 August 2021 в 11:47
2 ответа

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

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

setfacl -R -m u:100030:rX,d:u:100030:rX folder

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

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

0
ответ дан 25 August 2021 в 22:44

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

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

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

$ podman run --rm docker.io/library/nginx grep nginx /etc/passwd
nginx:x:101:101:nginx user,,,:/nonexistent:/bin/false
$

Результат:

  • UID: 101
  • GID: 101

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

$ container_uid=101
$ container_gid=101

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

Посмотрите файлы /etc/subuid и /etc/subgid на хосте

Пользователь myuser имеет эти дополнительные UID и подгруппы GID.

$ grep myuser /etc/subuid
myuser:231072:65536
$ grep myuser /etc/subgid
myuser:231072:65536
$ 

Результат:

myuser имеет 65536 дополнительных UID и 65536 дополнительных GID.

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

$ subuid_size=65536
$ subgid_size=65536

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

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

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

Создайте общедоступный для записи каталог demo1

$ mkdir demo1
$ chmod 777 demo1
$

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

$ podman run --rm \
    -v ./demo1:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_root
$

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

$ podman run --rm \
    --user 101:101 \
    -v ./demo1:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_nginx
$

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

$ ls -l demo1
total 0
-rw-r--r--. 1  231172  231172 0 Aug 27 20:24 created_by_nginx
-rw-r--r--. 1 myuser myuser 0 Aug 27 20:22 created_by_root
$ 

Результат: Файл created_by_root принадлежит myuser:myuser

Demo 2 : сопоставьте пользователя myuser на хосте с пользователем nginx внутри контейнера

Создайте доступный для записи каталог demo2

$ mkdir demo2
$ chmod 777 demo2
$

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

$ subuid_size=65536
$ subgid_size=65536
$ container_uid=101
$ container_gid=101
$ podman run --rm \
    --uidmap=0:1:$container_uid \
    --uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid - 1)) \
    --uidmap=$container_uid:0:1 \
    --gidmap=0:1:$container_gid \
    --gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid - 1)) \
    --gidmap=$container_gid:0:1 \
    -v ./demo2:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_root
$

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

$ subuid_size=65536
$ subgid_size=65536
$ container_uid=101
$ container_gid=101
$ podman run --rm \
    --user 101:101 \
    --uidmap=0:1:$container_uid \
    --uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid - 1)) \
    --uidmap=$container_uid:0:1 \
    --gidmap=0:1:$container_gid \
    --gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid - 1)) \
    --gidmap=$container_gid:0:1 \
    -v ./demo2:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_nginx
$

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

$ ls -l demo2
total 0
-rw-r--r--. 1 myuser myuser 0 Aug 27 20:26 created_by_nginx
-rw-r--r--. 1  231072  231072 0 Aug 27 20:25 created_by_root
$ 

Результат: Файл created_by_nginx принадлежит myuser:myuser

Заключение

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

0
ответ дан 27 August 2021 в 19:33

Теги

Похожие вопросы