In other words: may root owned unprivileged containers be "less unprivileged" than ones owned by standard accounts?
Не думаю. Важно то, что находится в
/proc/$PID/uid_map
процессов в пользовательском пространстве имен контейнера, а не в/etc/subuid
. Предположим, вы выполняете следующее из исходного пользовательского пространства имен (, то есть не из контейнера )для$PID
процесса, работающего в контейнере:$ cat /proc/$PID/uid_map 0 200000 1000
Это означает, что диапазон UID
[0-1000)
процесса $PID будет сопоставлен с диапазоном UID[200000-201000)
вне его пользовательского пространства имен (контейнера ). UID за пределами диапазона[200000-201000)
будут сопоставлены с 65534($(cat /proc/sys/kernel/overflowuid)
)в контейнере. Это может произойти, например, если вы не создадите новое пространство имен PID. В этом случае процесс в контейнере будет видеть процессы снаружи, но их UID будет 65534.Таким образом, при правильном сопоставлении UID, даже если контейнер запущен с правами root, его процессы будут иметь непривилегированные UID вне его.
Подчиненные UID в
/etc/subuid
никоим образом не связаны с одним UID снаружи. Цель этого файла — позволить непривилегированным пользователям запускать контейнеры, использующие более одного UID (, что характерно для большинства операционных систем Linux ). По умолчанию вы можете сопоставить свой UID, только если вы непривилегированный пользователь. То есть, если ваш UID равен 1000 и$PID
относится к процессу в контейнере, вы можете сделать толькоecho "$N 1000 1" >/proc/$PID/uid_map
для любого
$N
непривилегированного пользователя. Все остальное не разрешено. Если бы вы могли нанести на карту более длинный диапазон, то естьecho "$N 1000 50" >/proc/$PID/uid_map
вы получите доступ к UID
[1000-1050)
за пределами контейнера через контейнер. И, конечно же, если бы вы могли изменить начало внешнего диапазона UID, у вас был бы простой способ получить root.Итак,/etc/subuid
определяет внешние диапазоны, которые вам разрешено использовать. Этот файл используетсяnewuidmap
, который является root с идентификатором setuid.$ cat /etc/subuid woky:200000:50 $ echo '0 200000 50' >/proc/$PID/uid_map -bash: echo: write error: Operation not permitted $ newuidmap $PID 0 200000 50 $ # success
Детали намного сложнее, и я, вероятно, не тот человек, чтобы объяснять это, но я думаю, что лучше не иметь ответа. :-)Вы можете проверить man-страницы
user_namespaces(7)
иnewuidmap(1)
и мои собственные исследования Первый процесс в новом пользовательском пространстве имен Linux должен вызывать setuid ()? . К сожалению, я не совсем уверен, как LXC использует этот файл.
Systemd -загрузка является загрузкой systemd -независимо от того, какой дистрибутив Linux вы используете. Systemd -boot — это относительно простое приложение выбора, которое не настраивается производителем дистрибутива. Версия загрузки системы -, поставляемая Fedora, которая в настоящее время установлена на вашем компьютере, также способна загружать Manjaro, Debian и даже Windows, если хотите.
При обновлении загрузки systemd -файлы берутся из текущего дистрибутива. Программа bootctl проверяет установленную версию systemd -boot и обновляет только в том случае, если доступная версия новее установленной версии.Версия определяется путем проверки фактического файла, а не имени файла. Точнее, версия определяется путем поиска строки #### LoaderInfo: systemd-boot NNN ####
в загрузочном бинарном файле systemd -, где NNN
— трехзначный номер версии.