Разрешить безопасное поведение определенной программы в SELinux

8

У меня есть программа, работающая внутри контейнера Docker, который загружает файл .so, который изменяет поведение программы посредством перехвата и манипулирования памятью. Это поведение блокируется SELinux со следующим сообщением в журнале аудита:

type = AVC msg = аудит (1548166862.066: 2419): avc: отказано {execheap} для pid = 11171 comm = "myProgram" scontext = system_u: system_r: container_t: s0: c426, c629 tcontext = system_u: system_r: container_t: s0: c426, c629 tclass = процесс разрешен = 0

Я крайне настаиваю на том, чтобы просто выполнить это, так audit2allowкак я не хочу допускать такого специфического поведения где-либо еще (поскольку это было бы довольно рискованно).

  • Как я могу сказать SELinux, чтобы это поведение было максимально безопасным?
  • Могу ли я сделать это так, чтобы в будущем я мог порождать больше контейнеров Docker, выполняющих ту же программу?
Томас
источник

Ответы:

4

audit2allowвероятно , генерирует правило для разрешения execheapдля container_tпроцесса типа. Вы всегда можете сначала сгенерировать модуль и проверить его, прежде чем загружать его.

Возможная проблема заключается в том, что теперь любому процессу с container_tтипом разрешена та же операция. Чтобы избежать этого, вам, возможно, потребуется создать собственный настраиваемый тип (используя container_tшаблон) и разрешить только execheapэтот специальный тип.

Этот пост в блоге Дэна Уолша объясняет, как написать такую ​​специальную политику. Вы также можете комбинировать это с audit2allowгенерацией фактических правил. Основные шаги:

  1. Создайте базовую контейнерную политику, например container_execheap:

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

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

  2. Скомпилируйте и загрузите модуль политики (необходимые файлы разработки, включая make-файл, должны быть предоставлены selinux-policy-develпакетом):

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    Новый тип может быть настроен как разрешающий домен:

    semanage permissive -a container_execheap_t
    

    Для разрешающих доменов регистрируются отказы AVC, но правила не применяются. Таким образом, легко сгенерировать пропущенные правила позже, используя audit2allow.

  3. Запустите свой контейнер в этом новом контексте, что-то вроде docker run ... --security-opt label:type:container_execheap_t ...

  4. Генерация ожидаемых ошибок. Затем запустите audit2allowдля генерации правил, разрешающих эти операции container_execheap_t. Вы можете обновить тот же .teфайл модуля (не забудьте увеличить номер версии) новыми правилами. Скомпилируйте и установите обновленный модуль.

  5. Когда больше ошибок не генерируется, переведите пользовательский тип контейнера обратно в принудительный режим semanage -d container_execheap.

sebasth
источник
Похоже, ваш ответ - путь, к сожалению, хотя у меня нет собственного опыта создания политик SELinux. Это то, что я придумал, просматривая пост в блоге, на который вы ссылались, и другую документацию. У меня такое чувство, что я делаю это неправильно ... не могли бы вы помочь мне, указав мне правильное направление? Имеет ли смысл моя политика вообще?
Томас
Спасибо, теперь у меня есть кое-что, что работает! Это то, что я закончил. Однако я получил кучу ошибок относительно дубликатов во время компиляции, я предполагаю, что это проблема во включенных политиках, а не в моей собственной? Я также не совсем уверен, почему строка внутри оператора gen_require должна заканчиваться символом «вместо» (последний выдает ошибку). В любом случае, еще раз спасибо за помощь!
Томас
Я думаю, что можно игнорировать эти конкретные ошибки, см. Bugzilla . Цитирование с использованием `'- это то, как оно работает на языке M4 , который используется для написания модулей ссылочной политики. Вы можете проверить (используя ps axZи т. Д.), Что ваш контейнер работает в правильном контексте, если вы хотите перепроверить после установки и настройки своей пользовательской политики.
sebasth