То, как я позволяю апачу вращаться, входит в систему пользовательский корневой каталог с включенным SELinux?

Миграция от nagios до icinga очень легка. Просто необходимо изменить 2 опции в icinga.conf и перезапуске с nagios файлами конфигурации, и все прекрасно. Миграция кактусов также легка, но не настолько легкий интегрировать ее приятно в webgui, pnp4nagios является предпочтительным решением icinga команды, и это интегрируется в webgui.

3
задан 6 June 2014 в 16:38
2 ответа

Фактическая проблема

Перевести вторая строка предоставленного вами журнала:

Процесс rotatelogs с PID 64617 попытался выполнить поиск в домашнем каталоге , который находится на устройстве md2 и на индексе 7208961. Доступ был отказано.

Контекст безопасности процесса rotatelogs : unlimited_u: system_r: httpd_rotatelogs_t: s0

Контекст безопасности домашнего каталога : system_u: object_r: home_root_t: s0

Вам необходимо разрешить rotatelogs читать домашний каталог. Разрешить httpd сделать это достаточно просто ( setsebool -P httpd_enable_homedirs = 1 ), но, к сожалению, rotatelogs не наследует свой тип от httpd. Что еще хуже, для rotatelogs нет параметра setsebool.

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

Короче говоря. , вам необходимо написать локальную политику.

Пошаговое решение

Создайте где угодно файл принудительного применения типа с именем homelogs.te со следующим содержимым:

module homelogs 1.0;

require {
        type httpd_rotatelogs_t;
        type home_root_t;
        type user_home_t;
        type user_home_dir_t;
        class dir { add_name getattr open read remove_name search write };
        class file { create getattr open read rename unlink write };
}

#============= httpd_rotatelogs_t =============
allow httpd_rotatelogs_t home_root_t:dir search;
allow httpd_rotatelogs_t user_home_dir_t:dir search;
allow httpd_rotatelogs_t user_home_t:dir { add_name getattr open read remove_name search write };
allow httpd_rotatelogs_t user_home_t:file { create getattr open read rename unlink write };

Теперь скомпилируйте его :

make -f / usr / share / selinux / devel / Makefile homelogs.pp

И установите его:

semodule -i homelogs.pp

Теперь rotatelogs должны иметь все разрешения, необходимые для выполнения своей задачи. в подкаталогах домов пользователей.


Как написать локальную политику

Это для тех, кто хочет получить более подробную информацию о том, как я написал локальную политику. У вас есть две возможности для написания политики.

audit2allow

Если вы совершенно новичок в написании локальных политик, один из вариантов - использовать Инструмент audit2allow , входящий в состав пакета policycoreutils-python , чтобы помочь вам написать его.

Чтобы исправить отклонения разрешений SELinux при запуске rotatelogs, вы можете запустить команду

grep rotatelogs /var/log/audit/audit.log | audit2allow -M homelogs

для загрузите журналы аудита, которые включают «ротационные журналы», в audit2allow . Инструмент автоматически проанализирует отказы в разрешении SELinux и создаст файл принудительного применения типа, а также файл скомпилированного пакета политик ( .pp ). В этот момент вы можете просто установить созданный пакет политик, запустив:

semodule -i  homelogs.pp

И точно так же вы устранили все проблемы SELinux, связанные с ротацией журналов ... верно?

Проблема с этим подходом заключается в том, что audit2allow не может предсказать, какие разрешения необходимы; он может только проанализировать, в каких разрешениях уже было отказано.

Пока обнаружен только отказ в поиске в домашнем каталоге (буквально / home ), поэтому audit2allow исправит только это. Подумайте, сколько раз вам придется повторно запускать инструмент каждый раз, когда вам будет отказано в следующем разрешении. И в зависимости от конфигурации rotatelogs может потребоваться несколько недель для отказа и регистрации определенного разрешения. Например, сколько времени потребуется ротации журналов, чтобы попытаться удалить старый файл журнала и получить отказ в разрешении на отключение?

Майкл Хэмптон указал в комментариях, что эту проблему можно решить, переведя SELinux в разрешающий режим:

setenforce 0

] В этом режиме SELinux будет предупреждать и регистрировать действия, но не применяет политику. Это позволяет rotatelogs выполнять все свои задачи, в то время как SELinux по-прежнему регистрирует все отказы в разрешениях. Затем можно запустить audit2allow в журнале аудита, установить автоматически созданную политику, setenforce 1 , чтобы вернуться в принудительный режим, и все будет готово.

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

Создание вручную

Имея некоторое представление о файле Type Enforcement, вы можете решить проблемы с разрешениями до того, как они возникнут, написав его вручную. Я создал файл Type Enforcement (с расширением .te ). Не имеет значения, где находится файл принудительного применения типов.

В файле принудительного применения типов есть три раздела.

Раздел модуля

module homelogs 1.0;

В разделе модуля перечислены имя и версия модуля, который вы будете создавать с помощью своей локальной политики. Имя должно быть уникальным, иначе вы замените уже существующий модуль с таким же именем. Вы можете проверить имена установленных модулей с помощью semodule -l .

Требуемый раздел

require {
        type httpd_rotatelogs_t;
        type home_root_t;
        type user_home_t;
        type user_home_dir_t;
        class dir { add_name getattr open read remove_name search write };
        class file { create getattr open read rename unlink write };
}

Как упоминалось здесь :

Этот [раздел] информирует загрузчик политики, который типы, классы и роли требуются в системной политике перед установкой этого модуля. Если какое-либо из этих полей не определено, команда semodule завершится ошибкой.

В вашей ситуации ротационные журналы будут взаимодействовать с несколькими типами . После запуска ls -Z в исполняемом файле rotatelogs и в каталогах желаемого пути я обнаружил, что потребуются следующие типы:

  • httpd_rotatelogs_t
  • home_root_t
  • user_home_t
  • user_home_dir_t

Вам также необходимо взаимодействовать с некоторыми классами . Полный список классов и их прав доступа здесь . В вашей ситуации мы будем работать только с файлом классов и каталогом классов . Вы также должны указать разрешения каждого класса, с которым вы будете взаимодействовать. Основываясь на полном списке, я решил требовать эти классы и разрешения (пара, вероятно, не обязательна, но я допустил ошибку):

class dir:

  • add_name - Добавить файл в каталог
  • getattr - Получить атрибуты файла для файла, такие как режим доступа. (например, stat, некоторые ioctls. ... )
  • открыть - Открыть каталог
  • прочитать - Прочитать содержимое файла
  • remove_name - Удалить файл из каталога
  • поиск - Доступ для поиска
  • write - Общий доступ на запись; требуется для добавления или удаления файла класса

:

  • create -
  • getattr - Получить атрибуты файла для файла, например режим доступа. (например, stat, некоторые ioctls. ...)
  • open - Открыть файл
  • читать - Прочитать содержимое файла
  • переименовать - Переименовать файл
  • unlink ] - Удалить жесткую ссылку (удалить)
  • написать - Записать в файл

Раздел правил

allow httpd_rotatelogs_t home_root_t:dir search;
allow httpd_rotatelogs_t user_home_dir_t:dir search;
allow httpd_rotatelogs_t user_home_t:dir { add_name getattr open read remove_name search write };
allow httpd_rotatelogs_t user_home_t:file { create getattr open read rename unlink write };

Раздел rules читается довольно легко. Например:

разрешить httpd_rotatelogs_t user_home_t: dir {add_name getattr open read remove_name search write};

примерно означает:

Разрешить командам с типом httpd_rotatelogs_t для выполнения операций add_name, geattr, открытия, чтения, удаления_имя, поиска и записи в каталогах с типом user_home_t.

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

Компиляция и установка

Это избыточно, но я упомяну его еще раз. Вам необходимо скомпилировать файл Type Enforcement в пакет политик. При запуске make файл принудительного применения типов должен находиться в вашем текущем рабочем каталоге.

make -f / usr / share / selinux / devel / Makefile homelogs.pp

Наконец, установите политику Пакет как модуль:

semodule -i homelogs.pp


Полезные ресурсы по написанию настраиваемых политик:

12
ответ дан 3 December 2019 в 04:41

Не смог добавить комментарий в отличном ответе выше, поэтому мне придется добавить новый "ответ":

Если вы не можете скомпилировать свежеприготовленный модуль из-за отсутствия файла /usr/share/selinux/devel/Makefile, обязательно установите пакет selinux-policy-devel:

yum установите selinux-policy-devel

Теперь этот файл будет существовать, а вы можете продолжить с остальным.

3
ответ дан 3 December 2019 в 04:41

Теги

Похожие вопросы