SELinux в Linux

SELinux — это система принудительного контроля доступа, реализованная на уровне ядра. Сначала применяется классическая система прав, в случае, если эта первичная проверка пройдена управление переходит к SELinux.

    Есть три режима работы:
  • Enforcing - режим по-умолчанию. При выборе этого режима все действия, которые каким-то образом нарушают текущую политику безопасности, будут блокироваться, а попытка нарушения будет зафиксирована в журнале;
  • Permissive - в случае использования этого режима, информация о всех действиях, которые нарушают текущую политику безопасности, будут зафиксированы в журнале, но сами действия не будут заблокированы;
  • Disabled - полное отключение SELinux.
Текущий режим можно посмотреть командой
sestatus
или
getenforce
Команда setenforce позволяет быстро переключаться между режимами Enforcing и Permissive до перезагрузки, потом возвращается значение по-умолчанию
режим Enforcing
setenforce 1
режим Permissive
setenforce 0
Для того, чтобы выбрать режим по-умолчанию, который будет применяться при каждой загрузке системы нужно изменить значение строки SELINUX= на enforcing, permissive или disabled в файле
/etc/selinux/config
или выполнить команду
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
вместо disabled можно подставить необходимое значение.
Все процессы, каталоги и файлы в рамках SELinux имеют контекст безопасности. Проверить контекст безопасности SELinux для файлов и каталогов можно командой
ls -Z
или
ll -Z
для процессов
ps -Z
Вывод информации относящейся в SELinux выглядит следующим образом
user:role:type:mls
при этом поле mls скрыто.
Например, в данном случае тип httpd_sys_content_t это целевая политика
system_u:object_r:httpd_sys_content_t
тип user_home_t присваивается всем файлам в каталоге пользователя
unconfined_u:object_r:user_home_t

Доступ разрешен только между элементами с одинаковым типом, поэтому веб-сервер Apache может читать файл /var/www/html/index.html, который имеет тип httpd_sys_content_t. Так как Apache запущен с типом httpd_t и не имеет заполненных полей userid:username, он не может получить доступ к файлу в домашнем каталоге пользователя с типом user_home_t.

Для изменения контекста файлов и каталогов используется команда chcon, изменения осуществленные с ее помощью будут сохранятся после перезагрузки, но при изменении меток файловых систем пропадут.
Например, изменения типа у файла
chcon -v --type=httpd_sys_content_t test.txt
Для того, чтобы SELinux корректно работал даже после изменения меток файловых систем можно использовать semanage, например
изменение контекста всех файлов в каталоге /var/www
semanage fcontext -a -t httpd_sys_content_t "/var/www(/.\*)?"
изменение контекста указанного файла
semanage fcontext -a -t user_home_t "test.txt"

При копировании контекст безопасности файла будет совпадать с контекстом каталога назначения, при перемещении же, контекст безопасности будет совпадать с контекстом источника.

Восстановить контекст по умолчанию или назначить его для файлов таким же как у каталога можно командой restorecon, например
restorecon -v /var/www/html/index.html
или рекурсивно
restorecon -Rv /var/www/html
Базовые политики SELinux позволяют получить доступ только к заранее предопределенным портам, которые жестко связаны с сервисом. Например нужно, чтобы Apache прослушивал 81 порт. В таком случае, нужно добавить правило при помощи команды semanage
semanage port -a -t http_port_t -p tcp 81
Полный список портов, к которым SELinux предоставляет доступ, можно просмотреть командой
semanage port -l
Незначительные изменения в политиках SELinux можно проводить без полного изменения самой политики. Для этого достаточно модифицировать логические значения, связанные с дополнительными функциями, определенными в политике. Для того, чтобы просмотреть все доступные функции, нужно выполнить команду
getsebool -a
Для того, чтобы изменить какой-либо параметр, нужно использовать команду setsebool. Например, для того, чтобы разрешить модулям и скриптам сервиса httpd подключаться к сети нужно выполнить
setsebool -P httpd_can_network_connect on
Можно сконфигурировать дополнительные модули и подключить их командой
semodule -i module.pp
Журнал SELinux по умолчанию записывается процессом auditd в файл
/var/log/audit/audit.log
Если этот процесс не запущен, то SELinux ведет журнал в файле
/var/log/messages
в этом случае все сообщения системы контроля доступа маркируются ключом AVC, что позволяет быстро найти нужные строки.