Серия RHCSA: Основы обязательного управления доступом с SELinux в RHEL 7 – Часть 13

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

RHCSA Exam: SELinux Essentials and Control FileSystem Access

Хотя они необходимы в качестве разрешений первого уровня и механизмов контроля доступа, у них есть определенные ограничения, которые решаются с помощью Security Enhanced Linux (также известного как SELinux).

Одним из таких ограничений является то, что пользователь может подвергнуть файл или каталог угрозе безопасности через плохо продуманную команду chmod и таким образом вызвать неожиданное распространение прав доступа. В результате любой процесс, запущенный этим пользователем, может делать все, что угодно с файлами, принадлежащими пользователю, где в конечном итоге злонамеренное или иным образом скомпрометированное программное обеспечение может получить доступ на уровне root ко всей системе.

Учитывая эти ограничения, Национальное управление по безопасности США (NSA) впервые разработало SELinux, гибкий обязательный метод контроля доступа, чтобы ограничить способность процессов получать доступ или выполнять другие операции над объектами системы (такими как файлы, каталоги, сетевые порты и т. д.) до модели наименьших разрешений, которая может быть изменена позже по мере необходимости. Кратко говоря, каждому элементу системы предоставляется только необходимый доступ для функционирования.

В RHEL 7, SELinux встроен в само ядро и по умолчанию включен в режиме Enforcing. В этой статье мы кратко объясним основные концепции, связанные с SELinux и его функционированием.

Режимы SELinux

SELinux может работать в трех различных режимах:

  1. Enforcing: SELinux отказывает в доступе на основе правил политики SELinux, набора руководящих принципов, контролирующих работу безопасности.
  2. Permissive: SELinux не отказывает в доступе, но отказы регистрируются для действий, которые были бы отклонены в режиме Enforcing.
  3. 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
Set SELinux Mode

Обычно вы будете использовать 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):

  1. 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.
  2. Концепция роли действует как посредник между доменами и пользователями SELinux, определяя, к каким процессам и типам файлов можно получить доступ. Это защитит вашу систему от уязвимости к атакам на повышение привилегий.
  3. 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
Restart SSH Service

Как видите, 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
Inspect SSH Logs

На этом этапе вы можете отключить SELinux (но не делайте этого!) как было объяснено ранее, и попробовать снова запустить sshd, и это должно сработать. Однако утилита semanage может сказать нам, что нам нужно изменить, чтобы мы могли запустить sshd на любом порту без проблем.

Выполните,

# semanage port -l | grep ssh

чтобы получить список портов, на которых SELinux разрешает sshd слушать.

Semanage Tool

Итак, давайте измените порт в /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
Semanage Add Port

Как видите, служба была успешно запущена на этот раз. Этот пример иллюстрирует тот факт, что 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
Allow Apache to Send Mails

Как видно из приведенного выше примера, настройки булевых переменных 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 не имеет доступа:

Check SELinux File Permission

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-файл отображается правильно:

Verify Apache Page

Резюме

В этой статье мы рассмотрели основы SELinux. Обратите внимание, что из-за обширности темы подробное объяснение в одной статье невозможно, но мы верим, что принципы, изложенные в этом руководстве, помогут вам перейти к более продвинутым темам, если вы захотите это сделать.

Если позволите, позвольте мне порекомендовать два основных ресурса для начала: страницу NSA SELinux и руководство пользователя и администратора SELinux RHEL 7.

Не стесняйтесь сообщить нам, если у вас есть какие-либо вопросы или комментарии.

Source:
https://www.tecmint.com/selinux-essentials-and-control-filesystem-access/