В этой серии статей мы подробно рассмотрели как минимум два метода контроля доступа: стандартный уго/rwx разрешения (Управление пользователями и группами - Часть 3) и списки контроля доступа (Настройка списков управления доступом в файловых системах - часть 7).
Хотя они необходимы в качестве разрешений первого уровня и механизмов контроля доступа, они имеют некоторые ограничения, которые устраняются с помощью Linux с повышенной безопасностью (он же SELinux кратко).
Одним из таких ограничений является то, что пользователь может открыть файл или каталог для взлома с помощью плохо проработанной chmod команда и тем самым вызвать неожиданное распространение прав доступа. В результате любой процесс, запущенный этим пользователем, может делать все, что ему заблагорассудится, с файлами, принадлежащими пользователю, где, наконец, вредоносное или иным образом скомпрометированное программное обеспечение может получить доступ корневого уровня ко всему система.
Помня об этих ограничениях, Агентство национальной безопасности США (АНБ) впервые разработано SELinux, гибкий метод обязательного контроля доступа, чтобы ограничить способность процессов получать доступ или выполнять другие операции на системные объекты (такие как файлы, каталоги, сетевые порты и т. д.) в модель с наименьшими разрешениями, которую можно изменить позже как нужный. Вкратце, каждому элементу системы предоставляется только тот доступ, который необходим для работы.
В RHEL 7, SELinux встроен в само ядро и включен в Обеспечение соблюдения режим по умолчанию. В этой статье мы кратко объясним основные концепции, связанные с SELinux и его работа.
SELinux может работать тремя разными способами:
В getenforce
команда отображает текущий режим SELinux, тогда как сила
(за которым следует 1 или 0) используется для изменения режима на Обеспечение соблюдения или Разрешительныйсоответственно только во время текущего сеанса.
Чтобы обеспечить постоянство при выходе из системы и перезагрузке, вам необходимо отредактировать /etc/selinux/config
файл и установите для переменной SELINUX значение принуждение, снисходительный, или отключен:
# getenforce. # setenforce 0. # getenforce. # setenforce 1. # getenforce. # кот / etc / selinux / config.
Обычно вы будете использовать сила для переключения между режимами SELinux (принудительное разрешение и обратно) в качестве первого шага по устранению неполадок. Если для SELinux в настоящее время установлено значение принуждение пока вы испытываете определенную проблему, и то же самое исчезнет, когда вы установите для нее снисходительный, можете быть уверены, что столкнулись с проблемой разрешений SELinux.
Контекст SELinux состоит из среды управления доступом, в которой решения принимаются на основе пользователя, роли и типа SELinux (и, необязательно, уровня):
Давайте посмотрим, как все это работает, на следующих примерах.
В Защита SSH - Часть 8 мы объяснили, что изменение порта по умолчанию, где sshd прослушивает - это одна из первых мер безопасности для защиты вашего сервера от внешних атак. Давайте отредактируем /etc/ssh/sshd_config
файл и установите порт на 9999:
Порт 9999.
Сохраните изменения и перезапустите sshd:
# systemctl перезапуск sshd. # systemctl status sshd.
Как видите, sshd не запустился. Но что случилось?
Быстрый осмотр /var/log/audit/audit.log
указывает, что sshd было отказано в разрешении на запуск на порту 9999 (Сообщения журнала SELinux содержат слово «AVC», Чтобы их можно было легко идентифицировать по другим сообщениям), потому что это зарезервированный порт для Управление JBoss служба:
# cat /var/log/audit/audit.log | grep AVC | хвост -1.
На этом этапе вы можете отключить SELinux (но не делайте этого!), как объяснялось ранее, и попробуйте начать sshd снова, и он должен работать. Тем не менее semanage Утилита может сообщить нам, что нам нужно изменить, чтобы мы могли без проблем запускать sshd на любом выбранном нами порту.
Запустить,
# semanage port -l | grep ssh.
чтобы получить список портов, на которых SELinux позволяет sshd прослушивать.
Итак, давайте изменим порт в /etc/ssh/sshd_config
в порт 9998, добавьте порт в ssh_port_t context, а затем перезапустите службу:
# semanage порт -a -t ssh_port_t -p tcp 9998. # systemctl перезапуск sshd. # systemctl is-active sshd.
Как видите, на этот раз сервис был запущен успешно. Этот пример иллюстрирует тот факт, что SELinux контролирует номер порта TCP в соответствии с внутренними определениями своего собственного типа порта.
Это пример SELinux, управляющего процессом, обращающимся к другому процессу. Если бы вы реализовали mod_security и mod_evasive вместе с Apache в вашем RHEL 7 сервер, вам нужно разрешить httpd получить доступ Отправить почту чтобы отправить уведомление по почте после (D) DoS атака. В следующей команде опустите -П отметьте, если вы не хотите, чтобы изменение сохранялось после перезагрузки.
# semanage логическое -1 | grep httpd_can_sendmail. # setsebool -P httpd_can_sendmail 1. # semanage логическое -1 | grep httpd_can_sendmail.
Как видно из приведенного выше примера, SELinux логический настройки (или просто булевы) - это правила «истина / ложь», встроенные в политики SELinux. Вы можете перечислить все логические значения с помощью semanage логическое -l
, и, в качестве альтернативы, направьте его в grep, чтобы отфильтровать вывод.
Предположим, вы обслуживаете статический веб-сайт, используя каталог, отличный от каталога по умолчанию (/var/www/html
), сказать /websites (это может иметь место, если вы храните свои веб-файлы, например, на общем сетевом диске, и вам нужно смонтировать его в /websites).
а). Создать index.html файл внутри /websites со следующим содержанием:
SELinux тест
Если да,
# ls -lZ /websites/index.html.
вы увидите, что index.html файл был помечен default_t SELinux тип, к которому Apache не может получить доступ:
б). Изменить DocumentRoot директива в /etc/httpd/conf/httpd.conf
к /websites и не забудьте обновить соответствующий блок Справочника. Затем перезапустите Apache.
в). Просмотрите к http: //
, и вы должны получить ответ HTTP 503 Forbidden.
г). Затем измените метку /websitesрекурсивно к httpd_sys_content_t введите, чтобы предоставить Apache доступ только для чтения к этому каталогу и его содержимому:
# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"
д). Наконец, примените политику SELinux, созданную в г):
# restorecon -R -v / sites.
Теперь перезапустите Apache и перейдите к http: //
снова, и вы увидите, что файл html отображается правильно:
В этой статье мы рассмотрели основы SELinux. Обратите внимание, что из-за обширности темы полное подробное объяснение невозможно в одной статье, но мы считаю, что принципы, изложенные в этом руководстве, помогут вам перейти к более сложным темам, если вы захотите так.
Если можно, позвольте мне порекомендовать для начала два важных ресурса: Страница NSA SELinux и Пользователи и администраторы RHEL 7 SELinux гид.
Не стесняйтесь сообщать нам, если у вас есть какие-либо вопросы или комментарии.