В течение этой серии мы подробно рассмотрели как минимум два метода контроля доступа: стандартные разрешения ugo/rwx (Управление пользователями и группами – Часть 3) и списки контроля доступа (Настройка ACL на файловых системах – Часть 7).

Хотя они необходимы в качестве разрешений первого уровня и механизмов контроля доступа, у них есть определенные ограничения, которые решаются с помощью Security Enhanced Linux (также известного как SELinux).
Одним из таких ограничений является то, что пользователь может подвергнуть файл или каталог угрозе безопасности через плохо продуманную команду chmod и таким образом вызвать неожиданное распространение прав доступа. В результате любой процесс, запущенный этим пользователем, может делать все, что угодно с файлами, принадлежащими пользователю, где в конечном итоге злонамеренное или иным образом скомпрометированное программное обеспечение может получить доступ на уровне root ко всей системе.
Учитывая эти ограничения, Национальное управление по безопасности США (NSA) впервые разработало SELinux, гибкий обязательный метод контроля доступа, чтобы ограничить способность процессов получать доступ или выполнять другие операции над объектами системы (такими как файлы, каталоги, сетевые порты и т. д.) до модели наименьших разрешений, которая может быть изменена позже по мере необходимости. Кратко говоря, каждому элементу системы предоставляется только необходимый доступ для функционирования.
В RHEL 7, SELinux встроен в само ядро и по умолчанию включен в режиме Enforcing. В этой статье мы кратко объясним основные концепции, связанные с SELinux и его функционированием.
Режимы SELinux
SELinux может работать в трех различных режимах:
- Enforcing: SELinux отказывает в доступе на основе правил политики SELinux, набора руководящих принципов, контролирующих работу безопасности.
- Permissive: SELinux не отказывает в доступе, но отказы регистрируются для действий, которые были бы отклонены в режиме Enforcing.
- Disabled (само по себе ясно).
Команда getenforce
отображает текущий режим SELinux, тогда как команда setenforce
(за которой следует 1 или 0) используется для изменения режима на Enforcing или Permissive соответственно только на текущей сессии.
Чтобы сохранить настройки при выходе из системы и перезагрузке, вам потребуется изменить файл /etc/selinux/config
и установить переменную SELINUX в одно из значений: enforcing, permissive или disabled:
# getenforce # setenforce 0 # getenforce # setenforce 1 # getenforce # cat /etc/selinux/config

Обычно вы будете использовать setenforce, чтобы переключаться между режимами SELinux (из Enforcing в Permissive и обратно) как первый шаг отладки. Если SELinux в настоящее время установлен в enforcing, когда вы сталкиваетесь с определенной проблемой, и эта проблема исчезает, когда вы устанавливаете его в permissive, вы можете быть уверены, что речь идет о проблеме с разрешениями SELinux.
Контексты SELinux
A SELinux context consists of an access control environment where decisions are made based on SELinux user, role, and type (and optionally a level):
- A SELinux user complements a regular Linux user account by mapping it to a SELinux user account, which in turn is used in the SELinux context for processes in that session, in order to explicitly define their allowed roles and levels.
- Концепция роли действует как посредник между доменами и пользователями SELinux, определяя, к каким процессам и типам файлов можно получить доступ. Это защитит вашу систему от уязвимости к атакам на повышение привилегий.
- A type defines an SELinux file type or an SELinux process domain. Under normal circumstances, processes are prevented from accessing files that other processes use, and and from accessing other processes, thus access is only allowed if a specific SELinux policy rule exists that allows it.
Давайте посмотрим, как это все работает на примерах.
ПРИМЕР 1: Изменение порта по умолчанию для демона sshd
В Обеспечение безопасности SSH – Часть 8 мы объяснили, что изменение порта по умолчанию, на котором sshd слушает, является одной из первых мер безопасности для защиты вашего сервера от внешних атак. Давайте отредактируем файл /etc/ssh/sshd_config
и установим порт 9999:
Port 9999
Сохраните изменения и перезапустите sshd:
# systemctl restart sshd # systemctl status sshd

Как видите, sshd не запустился. Но что произошло?
A quick inspection of /var/log/audit/audit.log
indicates that sshd has been denied permissions to start on port 9999 (SELinux log messages include the word “AVC” so that they might be easily identified from other messages) because that is a reserved port for the JBoss Management service:
# cat /var/log/audit/audit.log | grep AVC | tail -1

На этом этапе вы можете отключить SELinux (но не делайте этого!) как было объяснено ранее, и попробовать снова запустить sshd, и это должно сработать. Однако утилита semanage может сказать нам, что нам нужно изменить, чтобы мы могли запустить sshd на любом порту без проблем.
Выполните,
# semanage port -l | grep ssh
чтобы получить список портов, на которых SELinux разрешает sshd слушать.

Итак, давайте измените порт в /etc/ssh/sshd_config
на Порт 9998, добавим порт в контекст ssh_port_t, а затем перезапустим сервис:
# semanage port -a -t ssh_port_t -p tcp 9998 # systemctl restart sshd # systemctl is-active sshd

Как видите, служба была успешно запущена на этот раз. Этот пример иллюстрирует тот факт, что SELinux контролирует номер TCP-порта в соответствии с его собственными внутренними определениями типов портов.
ПРИМЕР 2: Разрешение httpd отправлять доступ к sendmail
Это пример управления SELinux процессом, получающим доступ к другому процессу. Если вы собираетесь внедрить mod_security и mod_evasive вместе с Apache в вашем сервере RHEL 7, вам нужно разрешить httpd получать доступ к sendmail для отправки уведомления по электронной почте в случае атаки (D)DoS. В следующей команде опустите флаг -P, если вы не хотите, чтобы изменение сохранялось после перезагрузки.
# semanage boolean -1 | grep httpd_can_sendmail # setsebool -P httpd_can_sendmail 1 # semanage boolean -1 | grep httpd_can_sendmail

Как видно из приведенного выше примера, настройки булевых переменных SELinux (или просто булевы) – это правила true / false, встроенные в политики SELinux. Вы можете перечислить все булевы с semanage boolean -l
и, альтернативно, направить вывод через grep, чтобы отфильтровать его.
ПРИМЕР 3: Сервирование статического сайта из каталога, отличного от стандартного
Предположим, вы сервируете статический веб-сайт, используя другой каталог, чем стандартный (/var/www/html
), скажем, /websites (это может быть случай, если вы храните ваши веб-файлы на общем сетевом диске, например, и нужно его подключить к /websites).
a). Create an index.html file inside /websites with the following contents:
<html> <h2>SELinux test</h2> </html>
Если да,
# ls -lZ /websites/index.html
Вы увидите, что файл index.html был помечен типом default_t SELinux, к которому Apache не имеет доступа:

b). Change the DocumentRoot directive in /etc/httpd/conf/httpd.conf
to /websites and don’t forget to update the corresponding Directory block. Then, restart Apache.
c). Browse to http://<web server IP address>
, and you should get a 503 Forbidden HTTP response.
d). Next, change the label of /websites, recursively, to the httpd_sys_content_t type in order to grant Apache read-only access to that directory and its contents:
# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"
e). Finally, apply the SELinux policy created in d):
# restorecon -R -v /websites
Теперь перезапустите Apache и перейдите по адресу http://<IP-адрес веб-сервера>
снова, и вы увидите, что html-файл отображается правильно:

Резюме
В этой статье мы рассмотрели основы SELinux. Обратите внимание, что из-за обширности темы подробное объяснение в одной статье невозможно, но мы верим, что принципы, изложенные в этом руководстве, помогут вам перейти к более продвинутым темам, если вы захотите это сделать.
Если позволите, позвольте мне порекомендовать два основных ресурса для начала: страницу NSA SELinux и руководство пользователя и администратора SELinux RHEL 7.
Не стесняйтесь сообщить нам, если у вас есть какие-либо вопросы или комментарии.
Source:
https://www.tecmint.com/selinux-essentials-and-control-filesystem-access/