В 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
для конкретного пользователя хоста - но как этого добиться?
Вы должны выяснить, что такое начальный 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:
acl(5)
Используя параметр командной строки --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
$
Результат:
Числа позже используются при установке двух переменных оболочки
$ container_uid=101
$ container_gid=101
(Переменные оболочки container_uid и container_gid не имеют никакого значения за пределами этого Почта. Они просто введены, чтобы облегчить чтение ответа)
Пользователь 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 не имеют никакого значения вне этого поста.Они просто введены, чтобы облегчить чтение ответа)
Нет необходимости указывать --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
Создайте доступный для записи каталог 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.