Intereting Posts
grep -f patternfile не находит ничего или слишком сильно в зависимости от содержимого шаблона использование ярлыков для перемещения в командной строке bash Для чего предназначена папка «/ usr / local / src»? Как grep все строки, где начальная строка заканчивается шаблоном, а конечная строка заканчивается другим? Как узнать, сколько контейнера памяти lxc разрешено потреблять? Как узнать, находится ли я в оболочке без входа или в оболочке входа? Как восстановить стандартную тему XFCE по умолчанию («Adwaita-Manjaro-Dark») в Манджаро? При использовании опции spoofed IP с arping ответы не возвращаются Блок «Оверлей дерева устройств» уведомляет и загружает детей дважды gcc: -pthread: нет такого файла или каталога Создание AP на малине pi Включение python3 в vim в Fedora 24 Клавиша Remap CAPS_LOCK для виртуальных консолей и среды рабочего стола за один простой шаг Как диагностировать проблемы с производительностью ЦП? Bash, найти и удалить старые файлы

Что такое непривилегированный контейнер LXC?

Что означает, если контейнер Linux (контейнер LXC) называется «непривилегированным»?

Непривилегированные контейнеры LXC – это те, которые используют пространства имен пользователей ( userns ). Т.е. функция ядра, которая позволяет отображать диапазон UID на хосте в пространство имен, внутри которого может существовать пользователь с UID 0.

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

Релевантно:

  1. что для пользователя хоста определен диапазон подчиненных UID и GID ( usermod [-v|-w|--add-sub-uids|--add-sub-gids] )
  2. … и что этот диапазон отображается в конфигурации контейнера ( lxc.id_map = ... )

Таким образом, даже root может владеть непривилегированными контейнерами, так как эффективные UID контейнерных процессов на хосте будут попадать внутрь диапазона, определенного отображением.

Однако для root вы должны сначала определить подчиненные идентификаторы. В отличие от пользователей, созданных с помощью adduser , root не будет иметь ряд подчиненных идентификаторов, определенных по умолчанию.

Также имейте в виду, что полный диапазон, который вы даете, в вашем распоряжении, поэтому вы можете иметь 3 контейнера со следующими конфигурационными строками (показано только отображение UID):

  1. lxc.id_map = u 0 100000 100000
  2. lxc.id_map = u 0 200000 100000
  3. lxc.id_map = u 0 300000 100000

предполагая, что root владеет подчиненными UID между 100000 и 400000. Вся найденная документация предлагает использовать 65536 подчиненных идентификаторов для каждого контейнера, некоторые используют 100000, чтобы сделать его более доступным для человека.

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

С более чем 4 миллиардами (~ 2^32 ) возможными подчиненными идентификаторами, что означает, что вы можете быть щедрыми при работе с подчиненными диапазонами для ваших хост-пользователей.

Непривилегированный контейнер, принадлежащий и управляемый root

Втирать это снова. Непривилегированный гость LXC не должен запускаться непривилегированным пользователем на хосте.

Конфигурирование вашего контейнера с подчиненным отображением UID / GID следующим образом:

 lxc.id_map = u 0 100000 100000 lxc.id_map = g 0 100000 100000 

где пользовательский root на хосте принадлежит к тому, что данный подчиненный диапазон идентификаторов, позволит вам еще больше ограничить гостей.

Однако в таком сценарии есть одно важное дополнительное преимущество (и да, я проверял, что он работает): вы можете автоматически запускать свой контейнер при запуске системы.

Обычно при поиске в Интернете информации о LXC вам сообщают, что автозапуск непривилегированного гостя LXC невозможно. Однако это верно только по умолчанию для тех контейнеров, которые не находятся в общесистемном хранилище для контейнеров (обычно это что-то вроде /var/lib/lxc ). Если они (что обычно означает, что они были созданы root и начинаются с root), это совершенно другая история.

 lxc.start.auto = 1 

сделают работу довольно красиво, как только вы поместите ее в свою конфигурацию контейнера.

Получение разрешений и правильное конфигурирование

Я немного боролся с этим, поэтому я добавляю раздел здесь.

В дополнение к фрагменту конфигурации, включенному через lxc.include который обычно идет по имени /usr/share/lxc/config/$distro.common.conf (где $distro – это имя дистрибутива), вы должны проверить, есть ли а также /usr/share/lxc/config/$distro.userns.conf в вашей системе и включить это также. Например:

 lxc.include = /usr/share/lxc/config/ubuntu.common.conf lxc.include = /usr/share/lxc/config/ubuntu.userns.conf 

Кроме того, добавьте подчиненные идентификационные сопоставления:

 lxc.id_map = u 0 100000 65535 lxc.id_map = g 0 100000 65535 

это означает, что UID 100000 хоста является root внутри пространства имен пользователя гостевой системы LXC.

Теперь убедитесь, что разрешения правильные. Если имя вашего гостя будет сохранено в переменной окружения $lxcguest вы запустите следующее:

 # Directory for the container chown root:root $(lxc-config lxc.lxcpath)/$lxcguest chmod ug=rwX,o=rX $(lxc-config lxc.lxcpath)/$lxcguest # Container config chown root:root $(lxc-config lxc.lxcpath)/$lxcguest/config chmod u=rw,go=r $(lxc-config lxc.lxcpath)/$lxcguest/config # Container rootfs chown 100000:100000 $(lxc-config lxc.lxcpath)/$lxcguest/rootfs chmod u=rwX,go=rX $(lxc-config lxc.lxcpath)/$lxcguest/rootfs 

Это должно позволить вам запустить контейнер после первой попытки, возможно, предоставили некоторые ошибки, связанные с разрешением.

Чтобы следить за 0xC0000022L, решение которого отлично подходит для меня, я написал сценарий увеличения -uid-gid.pl perl, чтобы автоматизировать необходимые изменения владения, поэтому файлы в контейнерах LXC правильно отображаются.

Без него с этой предлагаемой настройкой файл в корневом каталоге контейнера LXC, принадлежащий 0 / root на главном хосте, будет в самом контейнере LXC сопоставлен с 65534 / nobody. Чтобы быть сопоставленным с 0 / корнем в контейнере LXC, они должны принадлежать 100000 на хосте.

Это описано здесь https://yeupou.wordpress.com/2017/06/23/setting-up-lxc-containers-with-mapped-giduid/, и скрипт можно получить непосредственно на gitlab https://gitlab.com /yeupou/stalag13/blob/master/usr/local/bin/increase-uid-gid.pl