Создание непривилегированного (userns) контейнера LXC с нуля, путем миграции привилегированного контейнера, чтобы быть непривилегированным

Большой, который я слушаю регулярно, является Шоу Действия Linux. Предъявитель шоу говорит настолько быстро, Вы получаете путь больше фактов/час, чем какой-либо другой подкаст Linux... забавный в местах также.

5
05.05.2014, 00:32
3 ответа
[1178520]Я просто делал нечто очень похожее, перемещая ВМ КВМ в непривилегированный LXC.

$ sudo ack-grep -a 'MyString' /

Я использовал для этого системные контейнеры (чтобы они могли запускаться автоматически при загрузке), но с маппируемыми UID/GIDs (пространства имен пользователей).

редактируйте /etc/subuid,subgid (я отобразил uid/gids 10M-100M в корне и использовал 100K на контейнер)

$ sudo ack-grep -aG '.*txt' MyString

для первого контейнера, используйте u/gids 10000000-10099999 в /var/lib/lxc/CTNAME/config

смонтируйте контейнерное хранилище на /var/lib/lxc/CTNAME/rootfs (или ничего не делайте, если не используете отдельный том/набор данных/что бы ни было на контейнер)

$ ack-grep --cpp 'SomeFunctionName'
chown 10000000: 10000000 /var/lib/lxc/CTNAME/rootfs

setfacl -m u:10000000:x /var/lib/lxc (или просто chmod o+x /var/lib/lxc)

lxc-usernsexec -m b:0:10000000:100000 -- /bin/bash

Теперь вы в первом пользовательском пространстве имен контейнеров. Все то же самое, но ваш процесс считает, что uid равен 0, в то время как на самом деле в пространстве имён хоста это uid 10000000. Проверьте /proc/self/uid_map, чтобы узнать, отображен ваш uid или нет. Вы заметите, что больше не можете читать из /root и кажется, что он никому не принадлежит/nogroup.

Находясь в пространстве имён пользователей, Я rsync с оригинального хоста.

Вне пространства имен пользователей вы увидите, что файлы в /var/lib/lxc/CTNAME/rootfs теперь принадлежат не ожидаемым (таким же) uids, как в исходной установке, а скорее 10000000+remote_uid. Это то, что вам нужно.

Вот и все. Когда вы синхронизируете данные, удалите все из /etc/fstab контейнера, чтобы он не пытался монтировать вещи, и он должен запуститься. Могут быть и другие изменения, проверьте, что делает LXC-шаблон для контейнерного дистрибутива. Вы определённо можете удалить ядро, grub, ntp и любые аппаратные пакеты в контейнере (вам даже не нужно запускать его, вы можете chroot в контейнер из пользовательского пространства имен)Если у вас нет запущенной удалённой ВМ, вы также можете смонтировать оригинальное хранилище ВМ в пространстве имён хоста и rsync/SSH обратно в localhost. Эффект будет тот же самый. Если вы (как кажется) просто хотите изменить контейнер с привилегиями на непривилегированный, вы можете просто добавить отображение uid/gid, добавить отображение, как описано выше, в конфигурацию контейнера, а затем сделать что-нибудь вроде:

Это должно быть все, что нужно сделать, теперь вы должны быть в состоянии запустить контейнер без привилегий. Приведенный выше пример крайне неэффективен, uidshift, вероятно, сделает это лучше (но я его еще не использовал).
HTH.[1178541]

6
27.01.2020, 20:34

Я хотел предупредить, что примерный код Борута Мрака изменит права собственности на файлы в хост-системе, а также когда символьные ссылки указывают на эти файлы в контейнере! Совсем не то, чего бы ты хотел!

Вы должны использовать флаг -h для chown/chgrp и/или -mount для поиска в случае, если у вас есть выделенная файловая система.

Вот моя более быстрая более умная версия:

find "/var/lib/lxc/$name/rootfs" -mount -uid '-65536' -printf '%U\n'|sort -n|uniq|while read i; do
        find "/var/lib/lxc/$name/rootfs" -mount -uid "$i" -exec chown -h "$((200000+i))" \{\} \;
done

find "/var/lib/lxc/$name/rootfs" -mount -gid '-65536' -printf '%G\n'|sort -n|uniq|while read i; do
        find "/var/lib/lxc/$name/rootfs" -mount -gid "$i" -exec chgrp -h "$((200000+i))" \{\} \;
done
3
27.01.2020, 20:34

Alpine Linux теперь использует uidmapshift, преобразованный в lua для преобразования привилегированных контейнеров в непривилегированные. Посмотрите на initd скрипт, чтобы увидеть другие разрешения и требования к папкам, которые устанавливаются/создаются. (/etc/subuid & /etc/subgid)

1
27.01.2020, 20:34

Теги

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