Поиск по сайту:

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


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

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

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

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

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

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

  1. Принуждение: SELinux запрещает доступ на основании правил политики SELinux — набора правил, управляющих механизмом безопасности.
  2. Разрешительный: SELinux не запрещает доступ, но отказы регистрируются для действий, которые были бы запрещены при выполнении в принудительном режиме.

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

Чтобы отобразить текущий режим SELinux, используйте getenforce. Если вы хотите переключить режим работы, используйте setenforce 0 (чтобы установить значение Разрешительный) или setenforce 1 (Принудительный)).

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

Кстати, если getenforce возвращает значение «Отключено», вам придется отредактировать /etc/selinux/config, указав желаемый режим работы, и перезагрузиться. В противном случае вы не сможете установить (или переключить) режим работы с помощью setenforce.

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

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

  1. Изменение порта по умолчанию, который прослушивает демон.
  2. Установка директивы 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, то увидим, что sshd не удалось запустить на порту 9999. SELinux, поскольку это зарезервированный порт для службы JBoss Management (сообщения журнала SELinux включают слово “AVC”, чтобы их можно было легко идентифицировано из других сообщений):


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

На этом этапе большинство людей, вероятно, отключили бы SELinux, но мы этого не сделаем. Мы увидим, что SELinux и sshd, прослушивающие разные порты, могут жить в гармонии друг с другом. Убедитесь, что у вас установлен и запущен пакет policycoreutils-python:


yum install policycoreutils-python

Чтобы просмотреть список портов, которые SELinux позволяет sshd прослушивать. На следующем изображении мы также видим, что порт 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 /габриэль/public_html):


DocumentRoot “/websrv/sites/gabriel/public_html”

Apache откажется обслуживать контент, поскольку index.html помечен типом default_t SELinux, к которому 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

Дополнительную информацию о SELinux см. в руководстве Fedora 22 SELinux и администратора.