👨⚕️️ Реализация мандатного контроля доступа с помощью SELinux или AppArmor в Linux

Чтобы преодолеть ограничения и расширить механизмы безопасности, предоставляемые стандартными разрешениями ugo/rwx и списками контроля доступа, Агентство национальной безопасности США (NSA) разработало гибкий метод мандатного контроля доступа (MAC), известный как SELinux (сокращение от Security Enhanced). Linux) для того, чтобы, между прочим, ограничивать способность процессов получать доступ или выполнять другие операции над системными объектами (такими как файлы, каталоги, сетевые порты и т. д.) с наименьшими возможными правами, при этом допуская возможность последующих модификаций этой модели.

Другим популярным и широко используемым MAC является AppArmor, который помимо функций, предоставляемых SELinux, включает в себя режим обучения, который позволяет системе «изучать» поведение конкретного приложения и устанавливать ограничения, настраивая профили для безопасного использования приложения.

В CentOS 7 SELinux включен в само ядро и по умолчанию включен в режиме Enforcing (подробнее об этом в следующем разделе), в отличие от openSUSE и Ubuntu, которые используют AppArmor.

?️ Как временно или постоянно отключить SELinux

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

Введение в SELinux и как его использовать в CentOS 7

Security Enhanced Linux может работать двумя различными способами:

  • Enforcing:  SELinux запрещает доступ на основе правил политики SELinux, набора руководящих принципов, которые управляют механизмом безопасности.
  • Permissive:SELinux не запрещает доступ, но в журнале регистрируются отказы для действий, которые были бы запрещены при запуске в принудительном режиме.

SELinux также можно отключить.

Хотя это не сам режим работы, это все же вариант.

Однако научиться использовать этот инструмент лучше, чем просто игнорировать его. Имейте это в виду!

Чтобы отобразить текущий режим SELinux, используйте getenforce.

Если вы хотите переключить режим работы, используйте setenforce 0 (чтобы установить для него Permissive) или setenforce 1 (Enforcing).

Поскольку это изменение не выдержит перезагрузки, вам потребуется отредактировать файл /etc/selinux/config и установить для переменной SELINUX значениеenforcing, permissive, или disabled, чтобы обеспечить постоянство при перезагрузках:



Напомним, что если Getenforce возвращает Disabled, вам нужно отредактировать /etc/selinux/config с нужным режимом работы и перезагрузиться.

В противном случае вы не сможете установить (или переключить) режим работы с помощью setenforce.

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

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

Два классических случая, когда нам, скорее всего, придется иметь дело с SELinux:

  • Изменение порта по умолчанию, на котором слушает демон.
  • Установка директивы DocumentRoot для виртуального хоста вне /var/www/html.

Давайте посмотрим на эти два случая на следующих примерах.

ПРИМЕР 1: Изменение порта по умолчанию для демона sshd

Первое, что большинство системных администраторов делают для защиты своих серверов, — это изменение порта, который слушает демон SSH, в основном, чтобы «отвести» сканеры портов внешних злоумышленников.

Для этого мы используем директиву Port в /etc/ssh/sshd_config, за которой следует новый номер порта следующим образом (в этом случае мы будем использовать порт 9999):

Port 9999 

После попытки перезапустить службу и проверить ее состояние мы увидим, что она не запустилась:

# systemctl restart sshd # systemctl status sshd



Если мы посмотрим на /var/log/audit/audit.log, то увидим, что SELinux запретил запуск sshd на порт 9999, поскольку это зарезервированный порт для службы управления JBoss (сообщения журнала SELinux включают слово « AVC », чтобы их можно было легко идентифицировать из других сообщений):

# cat /var/log/audit/audit.log | grep AVC | tail -1 



В этот момент большинство людей, вероятно, отключат SELinux, но мы этого не сделаем.

Мы увидим, что SELinux и sshd, слушающий другой порт, могут жить вместе в гармонии.

Убедитесь, что у вас установлен и включен пакет policycoreutils-python:

# yum install policycoreutils-python 

На следующем рисунке мы также видим, что порт 9999 был зарезервирован для другой службы, и поэтому мы не можем пока использовать его для запуска другой службы:

# semanage port -l | grep ssh 

Конечно, мы могли бы выбрать другой порт для SSH, но если мы уверены, что нам не потребуется использовать этот конкретный компьютер для каких-либо служб, связанных с JBoss, мы можем затем изменить существующее правило SELinux и вместо этого назначить этот порт SSH:

# semanage port -m -t ssh_port_t -p tcp 9999 

После этого мы можем использовать первую команду semanage, чтобы проверить, был ли порт назначен правильно, или опцию -lC (сокращение от list custom):

# semanage port -lC # semanage port -l | grep ssh



Теперь мы можем перезапустить SSH и подключиться к сервису через порт 9999. Обратите внимание, что это изменение переживет перезагрузку.

ПРИМЕР 2: Выбор DocumentRoot вне /var/www/html для виртуального хоста:

Если вам нужно настроить виртуальный хост Apache, используя каталог, отличный от /var/www/html, в качестве DocumentRoot (например, /websrv/sites/gabriel/public_html):

DocumentRoot "/websrv/sites/gabriel/public_html" 

Apache откажется обслуживать контент, потому что index.html был помечен типом SELinux default_t, к которому Apache не может получить доступ:

# wget http://localhost/index.html # ls -lZ /websrv/sites/gabriel/public_html/index.html



Как и в предыдущем примере, вы можете использовать следующую команду, чтобы убедиться, что это действительно проблема, связанная с SELinux:

# cat /var/log/audit/audit.log | grep AVC | tail -1 



Чтобы рекурсивно изменить метку /websrv/sites/gabriel/public_html на httpd_sys_content_t, выполните:

# semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?" 

Приведенная выше команда предоставит Apache доступ только для чтения к этому каталогу и его содержимому.

Наконец, чтобы применить политику (и сразу же поменять метку), выполните:

# restorecon -R -v /websrv/sites/gabriel/public_html 

Теперь вы должны иметь доступ к каталогу:

# wget http://localhost/index.html 

Отправка комментария

0 Комментарии