Быстро Создавайте Модули Selinux С Помощью Утилиты Sepolicy.

В упаковке политикаcoreutils-развитие Утилита Python включена сеполитика , что значительно упрощает написание модуля.

В этой статье мы рассмотрим процесс создания модуля для Nmap с помощью этой утилиты.



Быстро создавайте модули SELinux с помощью утилиты sepolicy.

ТЛ; Д.

Р.

В предыдущих статьях мы подробно рассмотрели создание модуля политики и связанные с этим вопросы.

Сейчас я расскажу вам, как сделать вашу жизнь намного проще с помощью мужчина 8 Другие статьи из серии

  1. Разработка модуля SELinux для приложения
  2. Разработка модуля SELinux для пользователя
  3. Настройка среды SELinux на примере сервера LAMP
  4. Тёмные моменты SELinux


Постановка задачи

Проблемы, которые мы решим в этой статье:
  • Напишите модуль для nmap.
  • Разрешить пользователям выполнять сканирование.

  • Ограничьте любые деструктивные действия.



Создание заготовки

В sepolicy имеется режим генерации базовых модулей, вызываемый командой sepolicygenerate (или sepolgen).

Давайте создадим шаблон нашего модуля:

  
  
  
  
  
  
  
  
  
   

# sepolgen -n nmap --application /usr/bin/nmap -u user_u -u staff_u Loaded plugins: fastestmirror Created the following files: /root/nmap_module/nmap.te # Type Enforcement file /root/nmap_module/nmap.if # Interface file /root/nmap_module/nmap.fc # File Contexts file /root/nmap_module/nmap_selinux.spec # Spec file /root/nmap_module/nmap.sh # Setup Script

Давайте посмотрим на аргументы командной строки:
  • -n — имя модуля.

  • --application — тип/приложение.

  • /usr/bin/nmap — путь к исполняемому файлу.

  • -u Staff_u -u user_u — список пользователей, которые могут использовать это приложение.

Поскольку путь /usr/bin/nmap уже описан как трассировка_exec_t, сборка модуля как есть приведет к конфликту.

Поэтому перед сборкой модуля удаляем файл nmap.fc, а после сборки делаем chcon.

# rm nmap.fc rm: remove regular file 'nmap.fc'? y # .

/nmap.sh Building and Loading Policy + make -f /usr/share/selinux/devel/Makefile nmap.pp Compiling minimum nmap module /usr/bin/checkmodule: loading policy configuration from tmp/nmap.tmp /usr/bin/checkmodule: policy configuration loaded /usr/bin/checkmodule: writing binary representation (version 17) to tmp/nmap.mod Creating minimum nmap.pp policy package rm tmp/nmap.mod tmp/nmap.mod.fc + /usr/sbin/semodule -i nmap.pp .

# chcon -t nmap_exec_t /usr/bin/nmap



Отладка

Модуль в настоящее время работает в вседозволительный -mode, т.е.

политики проверяются, но реальной блокировки не происходит. Это можно понять из строки разрешительный nmap_t в файле nmap.te. Теперь запустим nmap с различными опциями, чтобы сгенерировать достаточное количество логов.

Я рекомендую сначала запустить команду семодуль -DB выключить неаудит -rules (правила, которые предотвращают запись в журнал тех или иных запретов).



# chmod u+s /usr/bin/nmap # semodule -DB $ id user_u:user_r:user_t:s0 $ nmap -sS -A -PI jnode.in .

$ nmap -A -sU -PI jnode.in .

$ nmap jnode.in -o out.log .



Давайте посмотрим на результаты:

# audit2allow -bl -R -t nmap_t allow nmap_t self:capability {net_raw dac_read_search dac_override}; allow nmap_t self:unix_dgram_socket { create ioctl }; allow nmap_t self:packet_socket { bind create getopt ioctl read setopt write }; allow nmap_t self:rawip_socket { create setopt write }; corenet_tcp_connect_http_port(nmap_t) corenet_tcp_connect_smtp_port(nmap_t) corenet_tcp_connect_ssh_port(nmap_t) kernel_read_network_state(nmap_t) kernel_read_system_state(nmap_t) userdom_use_inherited_user_ptys(nmap_t)

При этом мы видим, что out.log создан с контекстом user_home_dir_t — нужно создать новый тип (nmap_result_log_t) и дать необходимые права доступа.



Завершение

Итак, нам нужно сделать следующее:
  • Разрешите необходимый доступ к сети.

  • Разрешить запись логов.

  • Создайте новый тип для журналов.

  • Создайте правило перехода типов для журналов.

  • Предоставьте пользователям и приложению права на редактирование этих журналов.

Редактируем модуль и получаем следующий код:

policy_module(nmap, 1.0.0) ######################################## # # Declarations # attribute_role nmap_roles; roleattribute system_r nmap_roles; type nmap_t; type nmap_exec_t; application_domain(nmap_t, nmap_exec_t) role nmap_roles types nmap_t; # log files type type nmap_result_log_t; files_type(nmap_result_log_t) # home transition userdom_user_home_dir_filetrans(nmap_t, nmap_result_log_t, { dir file }) # permissive nmap_t; ######################################## # # nmap local policy # allow nmap_t self:process { setrlimit }; allow nmap_t self:fifo_file manage_fifo_file_perms; allow nmap_t self:unix_stream_socket create_stream_socket_perms; domain_use_interactive_fds(nmap_t) files_read_etc_files(nmap_t) auth_use_nsswitch(nmap_t) miscfiles_read_localization(nmap_t) sysnet_dns_name_resolve(nmap_t) optional_policy(` gen_require(` type user_t; role user_r; ') nmap_run(user_t, user_r) # nmap log files access manage_files_pattern(user_t, nmap_result_log_t, nmap_result_log_t) ') optional_policy(` gen_require(` type staff_t; role staff_r; ') nmap_run(staff_t, staff_r) # autogenerated macro from nmap.if # nmap log files access manage_files_pattern(staff_t, nmap_result_log_t, nmap_result_log_t) ') # from audit2allow allow nmap_t self:capability { dac_override net_raw dac_read_search }; allow nmap_t self:packet_socket { bind create getopt ioctl read setopt write }; allow nmap_t self:rawip_socket { create setopt write }; kernel_read_network_state(nmap_t) kernel_read_system_state(nmap_t) userdom_use_inherited_user_ptys(nmap_t) corenet_tcp_connect_all_ports(nmap_t) #nmap log files access manage_files_pattern(nmap_t, nmap_result_log_t, nmap_result_log_t)

Пересобираем модуль:

# .

/nmap.sh .



И проверяем в принудительном режиме:

$ nmap -A -PI -sX -p 53 jnode.in -o out.log Starting Nmap 6.40 ( http://nmap.org ) at 2018-05-13 13:29 CEST WARNING: Running Nmap setuid, as you are doing, is a major security risk. Nmap scan report for jnode.in (79.137.74.224) Host is up (0.012s latency).

PORT STATE SERVICE VERSION 53/tcp open domain ISC BIND hostmaster .

$ ls -laZ out.log -rw-rw-r--.

root user user_u:object_r:nmap_result_log_t:s0 out.log $ rm out.log $



Что еще может сделать сеполитика?

Показать списки макросов интерфейса

# sepolicy interface -v -l|grep filetrans|grep user_home_dir userdom_user_home_dir_filetrans(domain, private_type, object_class, name) Create objects in a user home directory with an automatic type transition to a specified private type. # sepolicy interface -v -l|grep corenet_tcp_connect|grep all corenet_tcp_connect_all_ports(domain) Connect TCP sockets to all ports. # sepolicy interface -v -l|grep files_pattern|grep manage manage_files_pattern

Отслеживайте возможные переходы типов

# sepolicy transition -s user_t -t nmap_t user_t @ nmap_exec_t --> nmap_t

Следите за «общими» типами обмена данными

# sepolicy communicate -s user_t -t nmap_t xserver_tmpfs_t user_tmp_t user_fonts_t nmap_result_log_t

А также генерировать документацию, показывать статус логических значений и другие полезные вещи.

На самом деле очень хорошая утилита.



Вместо заключения

SELinux не так страшен, как его описывают. Используйте вспомогательные утилиты, и написание политики станет для вас легким и приятным занятием.

Если вы хотите узнать больше, приходите на PHDays 18, где я буду проводить четырехчасовой семинар по настройке среды SELinux .

P.S. Вы можете скачать исходники этого модуля (и других) Здесь .

Теги: #информационная безопасность #Системное администрирование #настройка Linux #учебник #centos 7 #Centos 7 #selinux #rhel7 #sepolgen

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.