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

Зачем это делать? Есть много причин. Для меня главной причиной было выдать доступ для техподдержки для рутинных операций (таких как ребут, чистка логов, диагностика итд), но без доступа к критичным данным и изменению системных функций.
Предположения
В тексте будет содержаться много технической информации, поэтому автор предполагает, что читатель:
- Прочитал прошлую статью
- Имеет под рукой CentOS 7
- На котором установлены пакеты setools-console, policycoreutils-devel, selinux-policy-devel, policycoreutils-newrole
- И включен SELinux в режиме enforcing с политикой targeted или minimum
Это все про вас? Тогда поехали!
Пользователи и роли
Основное назначение пользователей — хранить список ролей, которые он может использовать.
Пользователи по-умолчанию уже представлены в политике targeted или minimum, можете посмотреть командой semanage user -l.

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

Создание пользователя (простой способ)
Самый простой способ создать пользователя из готовых ролей — использовать semanage user -a.
Предположим, нам нужен просто новый пользователь с дополнительным набором ролей:

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

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

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

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

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

Что и требовалось доказать — мы сделали админа, который может админить только веб. К сожалению, количество ролей «по-умолчанию» сильно ограничено. Список можно посмотреть тут.
Создание пользователя (правильный способ)
Давайте сделаем все тоже самое, но например для администрирования docker, причем напишем его с нуля.
Модуль будет очень простой. Что нам нужно разрешить?
- Вход по ssh
- Доступ к sudo (UNIX-права никто не отменял)*
- Администрирование файлов, папок и сервиса докера
- Исполнение бинарников докера (docker, runcon)
- Коннект к сокету докера
*
Группа 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)
Скомпилируем и установим модуль:

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

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

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

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