Профили AppArmor в Docker / LXC

11

У меня есть контейнер Docker (LXC), который работает MySQL. Поскольку идея Docker, как правило, заключается в «одном запущенном процессе на контейнер», если я определю профили AppArmor для двоичного файла MySQL, будут ли они реализованы? Есть ли способ для меня, чтобы проверить это?

Нафтули Кей
источник
почему вы хотите использовать apparmor внутри контейнера?
c4f4t0r
3
В случае использования нулевого дня или другого эксплойта для базы данных, чтобы предотвратить доступ к чему - либо еще. Я доверяю Linux cgroups, но не так сильно . Лучше быть в безопасности, чем сожалеть, я бы предпочел, чтобы MySQL был заблокирован, чем чтобы MySQL нулевого дня нашел способ вырваться из cgroup.
Нафтули Кей

Ответы:

8

Во-первых, cgroups не используются для изоляции приложения от других в системе. Они используются для управления использованием ресурсов и доступа к устройству. Это различные пространства имен (PID, UTS, mount, user ...), которые обеспечивают некоторую (ограниченную) изоляцию.

Более того, процесс, запущенный внутри контейнера Docker, вероятно, не сможет управлять профилем AppArmor, в котором он запущен. В настоящее время используется подход к настройке определенного профиля AppArmor перед запуском контейнера.

Похоже, что драйвер выполнения libcontainer в Docker поддерживает настройку профилей AppArmor для контейнеров , но я не могу найти ни одного примера или ссылки в документе.

Очевидно, AppArmor также поддерживается с LXC в Ubuntu .

Вы должны написать профиль AppArmor для своего приложения и убедиться, что LXC / libcontainer / Docker / ... загружает его перед запуском процессов внутри контейнера.

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

В этом случае нет никакой связи между двоичным файлом и действующим профилем. Вы должны явно указать Docker / LXC, чтобы использовать этот профиль для вашего контейнера. Написание профиля для двоичного файла MySQL приведет к его применению только на хосте, а не в контейнере.

Siosm
источник
Это был мой (ограниченный) опыт до сих пор. У меня были проблемы при создании профиля из контейнера Docker, но если профиль был создан вне контейнера и затем скопирован в него, он должен просто работать ™, при условии, конечно, что вы запускаете AppArmor в контейнере перед запуском исполняемого файла.
Нафтули Кей
@Siosm: LCX! = Libcontainer. Вопрос был о драйвере LXC.
0xC0000022L
@ 0xC0000022L: модель применения профиля AppArmor одинакова для любого инструмента, используемого для ограничения процессов в контейнерах.
Siosm
3

Ответ очень вероятен: нет.

В разделе руководства по Ubuntu Server LXC обсуждается ваш точный вопрос и делается следующее утверждение:

Программы в контейнере не могут быть дополнительно ограничены - например, MySQL работает под профилем контейнера (для защиты хоста), но не сможет войти в профиль MySQL (для защиты контейнера).

Лучший способ избежать эксплойтов, имеющих нежелательные эффекты, - ограничить пользователя, запускающего контейнер, и использовать контейнеры LXC пользовательского пространства, которые используют функцию ядра. Однако в dockerнастоящее время - насколько мне известно - не поддерживает userns.

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

0xC0000022L
источник