LINUX.ORG.RU
ФорумAdmin

SELinux (создание модуля)

 , , ,


2

1

Доброго времени суток. Нужна помощь. Создаю SELinux модуль для ПО, доступ к которому сможет получить обычный пользователь.Я перечитал уже много мануалов, применял на практике, собирал Франкенштейна из audit2allow (для извлечения опыта из ошибок). Но по ходу работы вылезают крутые «фичи». В общем буду говорить за себя, и мне кажется, что я где то заблуждаюсь в написании модуля. Взял 2 статьи на Хабре (ссылочки ниже) и по ним пробовал собрать модуль. И как то безуспешно, а об этом расскажу ниже. Тупик возник на втором гайде, когда сделал все строго по пунктам, а результат получился совсем другой.

Первый гайд - https://habr.com/ru/post/320100/ Второй гайд - https://habr.com/ru/post/322476/

Введение: Необходимо наложить контексты на ПО, создать пользователя (login=ovdcoadm; seuser=ovdcoadm_u), выделить ему роль (ovdcoadm_r) и в модуле объявить тип (ovdco_t) позволив ему управлять нашим ПО, ходить по SSH, да и вообще работать на сервере напрямую.

Что я собираю:

#ovdco.te

policy_module(ovdco, 1.0.0)

# объявляем новую роль
role ovdcoadm_r;
# тип для процесса
type ovdco_t;
# тип для исполняемого файла
type ovdco_exec_t;
# тип для конфиг-файлов
type ovdco_conf_t;
# тип для лог-файла
type ovdco_log_t;
# тип для временных файлов
type ovdco_tmp_t;
# тип для порта, который слушает ovdco ( протокол binkp )
type binkp_port_t;





# стандартный шаблон для НЕ-админа
userdom_unpriv_user_template(ovdcoadm)
#userdom_restricted_user_template(myguest)
# разрешаем dac_override
allow ovdco_t self:capability { dac_override dac_read_search };
# разрешаем sudo
sudo_role_template(ovdcoadm, ovdcoadm_r, ovdco_t)

# Макрос приложения: добавляет тип ovdco_t в список приложений
# и разрешает ему стартовать из типа  ovdco_exec_t
application_domain(ovdco_t, ovdco_exec_t)
# Макрос демона: добавляет тип ovdco_t в список демонов,
# разрешает его запускать через systemd
# и назначает переход: если systemd запустит файл с типом ovdco_exec_t,
# то процесс получит тип ovdco_t
init_daemon_domain(ovdco_t, ovdco_exec_t)
# разрешает типу ovdco_t исполнять стандартные бинарники ( /bin, /usr/bin )
corecmd_exec_bin(ovdco_t)
# разрешает типу ovdco_t подключать библиотеки
libs_use_ld_so(ovdco_t)
# разрешает типу ovdco_t читать состояние системы ( cpu, memory )
kernel_read_system_state(ovdco_t)
# разрешает типу ovdco_t писать в /tmp
files_rw_generic_tmp_dir(ovdco_t)
# разрешает типу ovdco_t читать конфиг сети ( /etc/resolv.conf итд )
sysnet_read_config(ovdco_t)
# разрешает типу ovdco_t получать случайные числа из /dev/(u)random
dev_read_rand(ovdco_t)
# разрешает типу ovdco_t получать аттрибуты файловой системы ( свободное место )
fs_getattr_xattr_fs(ovdco_t)
# разрешает типу ovdco_t делать dns resolve
sysnet_dns_name_resolve(ovdco_t)
# разрешает типу ovdco_t ходить в /var/log ( r/o )
logging_search_logs(ovdco_t)
# назначает правило: логи, которые создает процесс ovdco_t, 
# будут иметь тип ovdco_log_t
logging_log_filetrans(ovdco_t, ovdco_log_t, file)
# назначает правило: tmp-файлы, которые создает процесс ovdco_t, 
# будут иметь тип ovdco_tmp_t
files_poly_member_tmp(ovdco_t, ovdco_tmp_t)
# разрешает ovdco_t делать bind() на любой адрес
corenet_tcp_bind_generic_node(ovdco_t)
# разрешает ovdco_t общаться с postgresql по unix-сокету
postgresql_stream_connect(ovdco_t)
# разрешает ovdco_t общаться с postgresql по сети
corenet_tcp_connect_postgresql_port(ovdco_t)


# макрос gen_user создает пользователя так-же, как semanage user -a
# он всегда должен быть в самом конце файла
gen_user(ovdcoadm_u, ovdcoadm, ovdcoadm_r, s0, s0)

Как мы видим - он должен создавать se-пользователя, роль, и несколько типов. И да! Он компилируется, все создает!

semanage * -l

[root@localhost ~]# semanage login -l

Login Name SELinux User MLS/MCS Range Service

__default__ user_u s0 * ovdcoadm ovdcoadm_u s0 * root root s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *

Local customization in /etc/selinux/targeted/logins ovdcoadm ovdcoadm_u s0 xdm sshd

В файле /etc/selinux/targeted/logins/ovdcoadm

cat /etc/selinux/targeted/logins/ovdcoadm sshd:ovdcoadm_u:s0 xdm:ovdcoadm_u:s0 ovdco:ovdcoadm_u:s0

[root@localhost ~]# semanage user -l

Labeling MLS/ MLS/ SELinux User Prefix MCS Level MCS Range SELinux Roles

guest_u user s0 s0 guest_r ovdcoadm_u user s0 s0 ovdcoadm_r root user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r staff_u user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r sysadm_u user s0 s0-s0:c0.c1023 sysadm_r system_u user s0 s0-s0:c0.c1023 system_r unconfined_r unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r user_u user s0 s0 user_r ovdcoadm_r xguest_u user s0 s0 xguest_r

В файле /etc/selinux/targeted/contexts/users/ovdcoadm_u

[root@localhost ~]# cat /etc/selinux/targeted/contexts/users/ovdcoadm_u system_r:local_login_t:s0 ovdcoadm_r:ovdco_t:s0 system_r:remote_login_t:s0 ovdcoadm_r:ovdco_t:s0 system_r:sshd_t:s0 ovdcoadm_r:ovdco_t:s0 system_r:crond_t:s0 ovdcoadm_r:ovdco_t:s0 system_r:xdm_t:s0 ovdcoadm_r:ovdco_t:s0 staff_r:staff_su_t:s0 ovdcoadm_r:ovdco_t:s0 staff_r:staff_sudo_t:s0 ovdcoadm_r:ovdco_t:s0 system_r:initrc_su_t:s0 ovdcoadm_r:ovdco_t:s0 staff_r:staff_t:s0 ovdcoadm_r:ovdco_t:s0 sysadm_r:sysadm_su_t:s0 ovdcoadm_r:ovdco_t:s0 sysadm_r:sysadm_sudo_t:s0 ovdcoadm_r:ovdco_t:s0

По идее все ровно встало, доступ к SSH есть и не только к нему.

Но на выходе когда мы заходим под этим пользователем, то его не пускает, a2a ничего не показывает по этой проблеме. Чтобы ничего не сломалось я работаю в permissive режиме. Вот как меня определяет машина, когда авторизуюсь через SSH:

id

[ovdcoadm@localhost ~]$ whoami ovdcoadm [ovdcoadm@localhost ~]$ id uid=1003(ovdcoadm) gid=1003(ovdcoadm) groups=1003(ovdcoadm) context=system_u:system_r:unconfined_t:s0-s0:c0.c1023

Как мы видим - она не может меня определить и выкидывает в unconfined_t. Вроде бы все объявлено, все делал строго по гайдами. А почему так - я не знаю. И это один из важных вопросов. Если есть предложения, то пишите. Если нужна дополнительная информация, то с удовольствием ее предоставлю!

Много много лишнего

policy_module(x_user, 1.0.0)

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

userdom_unpriv_user_template(x_user);

#сформирует user ... строчку, в целом можно заменить на user x_user_u roles { x_user_r ....

gen_user(x_user_u, user, x_user_r, s0, s0 - mls_systemhigh, mcs_allcats)

Дальше, пользователя которого планируем использовать мапим в x_user_u

semanage login -a y_user -s x_user_u

И оформляем контексты по умолчанию для прользователя:

cd /etc/selinux/targeted/contexts/users/
cp ./user_u ./x_user_u
Заменяем дефолтные контексты

system_r:local_login_t:s0 x_user_r:x_user_t:s0
system_r:remote_login_t:s0 x_user_r:x_user_t:s0
system_r:sshd_t:s0 x_user_r:x_user_t:s0

Проверяем

[root@localhost users]# ssh y_user@localhost
y_user@localhost password: 
Last login: Sun Apr 21 13:36:09 2019 from 192.168.3.1
[y_user@localhost ~]$ id -Z
x_user_u:x_user_r:x_user_t:s0-s0:c0.c1023
[y_user@localhost ~]$ 

Profit

Шел пользователя стартует в собственном домене x_user_t, дальнейшие разрешения добавляем в политику по вкусу

sparks ★★★ ()
Ответ на: комментарий от sparks

Ради интереса создал аналогию твоему примеру. И действительно все работает! Стал уже грешить на корявую версию CentOS'a

Сам код x_user.te

policy_module(x_user, 1.0.0)
role x_user_r;
userdom_unpriv_user_template(x_user);
gen_user(x_user_u, user, x_user_r, s0, s0 - mls_systemhigh, mcs_allcats)

Лог действий

[root@localhost ~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          user_u               s0                   *
ovdcoadm             ovdcoadm_u           s0                   *
root                 root                 s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *

Local customization in /etc/selinux/targeted/logins
astk_adm             astkadm_u            s0
xdm               sshd
[root@localhost ~]# semanage user -l

                Labeling   MLS/       MLS/
SELinux User    Prefix     MCS Level  MCS Range                      SELinux Roles

guest_u         user       s0         s0                             guest_r
ovdcoadm_u      user       s0         s0                             ovdcoadm_r
root            user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
staff_u         user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
sysadm_u        user       s0         s0-s0:c0.c1023                 sysadm_r
system_u        user       s0         s0-s0:c0.c1023                 system_r unconfined_r
unconfined_u    user       s0         s0-s0:c0.c1023                 system_r unconfined_r
user_u          user       s0         s0                             user_r
x_user_u        user       s0         s0-s0:c0.c1023                 x_user_r
xguest_u        user       s0         s0                             xguest_r
[root@localhost ~]# semanage login -a ^C
[root@localhost ~]# cd /etc/selinux/targeted/contexts/users/
[root@localhost users]# cp ./user_u ./x_user_u
[root@localhost users]# ll
total 40
-rw-r--r--. 1 root root 706 Apr 18 14:58 astkadm_u
-rw-r--r--. 1 root root 253 Nov 12  2016 guest_u
-rw-r--r--. 1 root root 418 Apr 22 10:41 ovdcoadm_u
-rw-r--r--. 1 root root 389 Nov 12  2016 root
-rw-r--r--. 1 root root 514 Nov 12  2016 staff_u
-rw-r--r--. 1 root root 496 Nov 12  2016 sysadm_u
-rw-r--r--. 1 root root 578 Nov 12  2016 unconfined_u
-rw-r--r--. 1 root root 375 Apr 18 17:37 user_u
-rw-r--r--. 1 root root 307 Nov 12  2016 xguest_u
-rw-r--r--. 1 root root 375 Apr 22 10:59 x_user_u
[root@localhost users]# semanage login -a user -s x_user_u
[root@localhost users]# ssh user@localhost
user@localhost's password:
[user@localhost ~]$ id
uid=1005(user) gid=1005(user) groups=1005(user) context=x_user_u:x_user_r:x_user_t:s0-s0:c0.c1023
[user@localhost ~]$

PirateTM ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.