Запустите контейнер без полномочий root, чтобы контейнер «root» не отображался на работающего пользователя. - PullRequest
1 голос
/ 08 октября 2019

Вопрос:

Как я могу использовать podman для запуска контейнера без полномочий root, чтобы пользователь root внутри контейнера не был сопоставлен с пользователем хоста, на котором запущен контейнер?

Подробности

В podman, при запуске контейнера без полномочий root, корневой uid контейнера (0) сопоставляется с uid хоста, тогда как все другие uid отображаются в соответствии с файлом /etc/subuid. Например:

$ grep $USER /etc/subuid
myuser:231072:65536
$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser)

$ podman run --rm -ti  -v /tmp:/tmp --entrypoint='["/sbin/my_init", "--"]' \
>            docker.io/phusion/baseimage:0.11 bash
[...]
*** Running bash...
root@e9f79e3fe659:/# touch /tmp/as_root

root@e9f79e3fe659:/# adduser --gecos '' --disabled-password inneruser
Adding user `inneruser' ...
Adding new group `inneruser' (1000) ...
Adding new user `inneruser' (1000) with group `inneruser' ...
Creating home directory `/home/inneruser' ...
Copying files from `/etc/skel' ...

root@e9f79e3fe659:/# setuser inneruser touch /tmp/as_inneruser

root@e9f79e3fe659:/# ls -n /tmp/as_root /tmp/as_inneruser
-rw-r--r-- 1 1000 1000 0 Oct  8 19:20 /tmp/as_inneruser
-rw-r--r-- 1    0    0 0 Oct  8 19:05 /tmp/as_root

root@e9f79e3fe659:/# exit
exit
*** bash exited with status 0.
[...]
*** Killing all processes...

$ ls -n /tmp/as_root /tmp/as_inneruser
-rw-r--r-- 1 232071 232071 0 out  8 16:20 /tmp/as_inneruser
-rw-r--r-- 1   1000   1000 0 out  8 16:05 /tmp/as_root

Как видно выше, пользователь root в контейнере был сопоставлен с uid пользователя хоста, на котором запущен контейнер (т.е. 1000), поэтому файлы, созданные root, имеют uid myuser (то есть 1000).

Принимая во внимание, что некорневые пользователи внутри контейнера отображаются в соответствии с отображением subuid работающего пользователя, то есть: пользователь inneruser внутри контейнера с uid 1000 был сопоставлен с uid232071 (231072 + 1000) хост-машины.

Повторение вопроса:

Как я могу использовать podman для запуска контейнера без полномочий root, так что пользователь root внутри контейнера являетсяне сопоставлен с пользователем хоста, на котором запущен контейнер?

Я пытался передать --subuidname=myuser podman, то есть:

$ podman run --subuidname=myuser --rm -ti  -v /tmp:/tmp --entrypoint='["/sbin/my_init", "--"]' \
>            docker.io/phusion/baseimage:0.11 bash

Но я получаю это сообщение:

Error: error creating libpod runtime: there might not be enough IDs available in the namespace
(requested 231072:231072 for /home/myuser/.local/share/containers/storage/overlay/l):
chown /home/myuser/.local/share/containers/storage/overlay/l: invalid argument

Я ожидал, что передача точного пространства имен, назначенного моему пользователю, приведет к отображению всех идентификаторов контейнера, включая корень контейнера (0), в набор идентификаторов, сопоставленных моему пользователю в /etc/subuid.

Технические детали:

* 1Файл 034 * был изменен с драйвера vfs на драйвер overlay с использованием fuse-overlayfs, то есть:

[storage]
  driver = "overlay"
  runroot = "/run/user/1000"
  graphroot = "/home/myuser/.local/share/containers/storage"
  [storage.options]
    size = ""
    remap-uids = ""
    remap-gids = ""
    ignore_chown_errors = ""
    remap-user = ""
    remap-group = ""
    ostree_repo = ""
    skip_mount_home = ""
    mount_program = "/home/myuser/bin/fuse-overlayfs"

Кроме этого, это стандартная версия podman 1.5.1, установленная в Ubuntu 18.04 с использованием официальные документы PPA .

...