Улучшаем защиту системы используя SELinux!

SELinux (Security-Enhanced Linux) - это модуль безопасности Linux (LSM), встроенный в ядро, реализует Mandatory Access Control (MAC). Большую часть над разработкой модуля выполнено) Агентством национальной безопасности США (National Security Agency) совсместно с RedHat. Был включен в Red Hat Enterprise Linux 4 и соответственно все клоны, которые собираются на основне более новых версий этого дистрибутива имеют его поддержку в своей системе - CentOS, Rocky Linux, Alma Linux. Так же SELinux возможно использовать и на других дистрибутивах, например, на Debian (https://wiki.debian.org/SELinux/Setup), но тогда стоит быть внимательны к выбору файловой системы, которая сможет поддерживать SELinux, так как свои метки безопастности хранит в расширенных атрибутах файловой системы (xattr).

Отобразить состояние SELinux и его режим работы поможет команда

# sestatus 


enforcing - политика SELinux применяется и ограничивает доступ своими правилами.

permissiveSELinux записывает предупреждения в логах, но не ограничивает доступ.

disabled - полностью выключен.

Важно обратить внимание на загруженный режим работы - targeted, Multi-Level Security (MLS), Multi-Category Security (MCS)

targeted - процессы, пользователи и файлы имеют свой контекст/метки (домен), которые и показывают, какой процесс или пользователь может иметь доступ к какому ресурсу, то есть, файлу или сетевому сокету на основании правил SELinux.

Multi-Level Security (MLS) - использует уровни доступа, по умолчанию есть 16 уровней доступа в SELinux MLS начиная с самого простого s0 и заканчивая самым строгим уровнем доступа s15, может быть задан диапазон s0-s1. 

Multi-Category Security (MCS) - использует категории, которые заданы процессам и файлам используя значения от c0 to c1023, может быть задан диапазон с 4 по 6c4.c6.

Все процессы и файлы имеют свой контекст или более удобно говорить метки (labels), чтобы увидеть командой ps SELinux контекст/метку процесса, то необходимо добавить ключ

# ps -auxZ | grep httpd


system_u - SELinux пользователь
system_r - SELinux роль
httpd_t - SELinux контекст/метка
s0 - уровень доступа MLS

Посмотреть SELinux контекст/метки директории

# ls -dZ 


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

secure_mode_policyload - запрещает менять SELinux политики на лету без перезагрузки операционной системы.

# getsebool -a | grep policyload


Вывести недавние события по SELinux
# ausearch -m avc -ts recent


avc - access vector cache  
pid - process ID (1186)
path -  file path /var/www/html/index.html
scontext - source context (system_u:system_r:httpd_t:s0)
tcontext - target context (unconfined_u:object_r:home_root_t:s0)
comm - command/executable (httpd)

Если повторно обратить внимание на контекст/метку процесса веб-сервера httpd (httpd_t), то он не сооветсвует контексту/метке файла index.html (home_root_t)
# ps -auxZ | grep httpd


Перепроверим SELinux контекст/метку файла index.html
# ls -Z 


Хотя причина сообщения в логе и проблема доступа веб-сервера httpd к файлу index.html ясна, но для демонстрации установим дополнительные утилиты поиска проблем с правилами SELinux

# yum install policycoreutils setools setools-console setroubleshoot

Ищем событие, которое нас интересует в логе сообщений
# grep sealert /var/log/messages


Посмотрим рекомендации по ID интересующего нас события
# sealert -l d1233914-eadc-4e13-9a6c-bdd5e684479d


Используем подсказку по восстановлению контекста на файле index.html
# /sbin/restorecon -v /var/www/html/index.html


restorecon - восстанавливает контекст основываясь на правилах, которые уже присутствуеют в конфигах системы (/etc/selinux/targeted/contexts/files)


После исправления контекста/метки файла процесс веб-сервера httpd смог получить работает
# curl localhost





На заметку команды по созданию и загрузки модуля с политиками, чтобы разрешить доступ 

# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -i my-httpd.pp

Некоторые другие команды:

Скопировать контекст одной директории на другую

# semanage fcontext -a -e /from/dir /to/dir

# man semanage-fcontext

# semanage user -l


https://wiki.gentoo.org/wiki/SELinux/Quick_introduction
https://wiki.debian.org/SELinux/Setup
https://wiki.debian.org/SELinux/Notes
https://www.linuxtopia.org/online_books/centos_linux_guides/centos_selinux_guide/rhlcommon-section-0019.html
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/using_selinux/getting-started-with-selinux_using-selinux


Комментарии