Разработка SELinux-модуля для пользователя

в 20:53, , рубрики: CentOS, linux, policy_module, selinux, setenforce 1, user, информационная безопасность, Разработка под Linux

Это вторая статья из цикла

Разработка SELinux-модуля для пользователя - 1 Сегодня мы поговорим о SELinux-пользователях, их создании, привязке, правам и другим вещам.

Зачем это делать? Есть много причин. Для меня главной причиной было выдать доступ для техподдержки для рутинных операций (таких как ребут, чистка логов, диагностика итд), но без доступа к критичным данным и изменению системных функций.

Предположения

В тексте будет содержаться много технической информации, поэтому автор предполагает, что читатель:

  • Прочитал прошлую статью
  • Имеет под рукой CentOS 7
  • На котором установлены пакеты setools-console, policycoreutils-devel, selinux-policy-devel, policycoreutils-newrole
  • И включен SELinux в режиме enforcing с политикой targeted или minimum

Это все про вас? Тогда поехали!

Пользователи и роли

Основное назначение пользователей — хранить список ролей, которые он может использовать.
Пользователи по-умолчанию уже представлены в политике targeted или minimum, можете посмотреть командой semanage user -l.

Разработка SELinux-модуля для пользователя - 2

Как известно из прошлой статьи, именно роли являются контейнерами для типов, а именно на типы вешаются все необходимые правила.

Таким образом, пользователь просто расширяет это дерево, создавая больше возможных вариантов. Обратите внимание: если у пользователя есть та или иная роль, он может самостоятельно переключиться в нее, используя команду newrole. Таким образом, разрешив пользователю роль sysadm_r или unconfined_r, вы автоматически даете ему неограниченные права на систему.

Пользователи и пользователи

Между Unix-пользователем (тем, который имеет UID) и SELinux-пользователем (тем, который имеет контекст) есть тонкая связь, которой можно управлять при помощи команды semanage login. Связь это односторонняя: id -Z user1 вам ничего не покажет. Специальный пользователь __default__ обозначает всех пользователей, не перечисленных в системе.

Разработка SELinux-модуля для пользователя - 3

Создание пользователя (простой способ)

Самый простой способ создать пользователя из готовых ролей — использовать semanage user -a.

Предположим, нам нужен просто новый пользователь с дополнительным набором ролей:

Разработка SELinux-модуля для пользователя - 4

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

Разработка SELinux-модуля для пользователя - 5

Контекст

Об этом мало где пишут, но мало просто создать пользователя. Если его контекст отличается от default_context, для него необходимо настроить файл контекстов. Подробнее см. man user_contexts.

Настроим файл и для webadm_u:

Разработка SELinux-модуля для пользователя - 6

Проверка

Зайдем под пользователем webadm:

Разработка SELinux-модуля для пользователя - 7

Сменим uid на 0 и попробуем что-нибудь «сломать»:

Разработка SELinux-модуля для пользователя - 8

Сменим роль на webadm_r и попробуем теперь:

Разработка SELinux-модуля для пользователя - 9

Что и требовалось доказать — мы сделали админа, который может админить только веб. К сожалению, количество ролей «по-умолчанию» сильно ограничено. Список можно посмотреть тут.

Создание пользователя (правильный способ)

Давайте сделаем все тоже самое, но например для администрирования docker, причем напишем его с нуля.

Модуль будет очень простой. Что нам нужно разрешить?

  1. Вход по ssh
  2. Доступ к sudo (UNIX-права никто не отменял)*
  3. Администрирование файлов, папок и сервиса докера
  4. Исполнение бинарников докера (docker, runcon)
  5. Коннект к сокету докера

*

Группа docker на последней версии CentOS7 не имеет доступа к /run/docker.sock по-умолчанию.

Напишем модуль и контекст-файл:

# новый модуль
policy_module(dockeradm, 1.0.3)
# объявляем новую роль
role dockeradm_r;
# стандартный шаблон для НЕ-админа
userdom_unpriv_user_template(dockeradm)
# разрешаем dac_override
allow dockeradm_t self:capability { dac_override dac_read_search };
# разрешаем sudo
sudo_role_template(dockeradm, dockeradm_r, dockeradm_t)
# разрешаем управлять файлами и папками контейнеров
container_admin(dockeradm_t)
# разрешаем исполнять исполняемые файлы контейнера
container_runtime_exec(dockeradm_t)
# разрешаем коннект к сокетам контейнера
container_stream_connect(dockeradm_t)
# макрос gen_user создает пользователя так-же, как semanage user -a
# он всегда должен быть в самом конце файла
gen_user(dockeradm_u, dockeradm, dockeradm_r, s0, s0)

Скомпилируем и установим модуль:

Разработка SELinux-модуля для пользователя - 10

Настроим пользователя и контекст:

Разработка SELinux-модуля для пользователя - 11

Проверим, что нас пускает в систему:

Разработка SELinux-модуля для пользователя - 12

Проверим наши права:

Разработка SELinux-модуля для пользователя - 13

Как говорит Apache, It works!

Подведение итогов

Создание SELinux-пользователей — важный шаг к созданию полноценного рабочего окружения, в котором каждый сотрудник занимается своим делом и при этом не мешает другим. Будь то хостинг-провайдер, студия разработки или банк, всегда есть ситуации, когда разделение доступа необходимо. Включайте SELinux и наслаждайтесь :)

Автор: kreon

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js