- PVSM.RU - https://www.pvsm.ru -
В процессе эксплуатации систем с SELinux я выделил несколько интересных кейсов, решения которых вряд-ли описаны в Интернете. Сегодня я решил поделиться с вами своими наблюдениями в надежде, что число сторонников SELinux еще немного возрастет :)
Если вы не знали, то сообщаю: весь SELinux насквозь файловый, и никакой магии там нет. Поэтому можно прям при включенном SELinux переустановить пакет полиси, если что-то пошло не так.
Пример для centos 7 & selinux-policy-minimum
#!/bin/sh
setenforce 0
semanage export > exports.semanage
yum remove -y selinux-policy-minimum
rm -rf /etc/selinux/minimum
yum install -y selinux-policy-minimum
semodule -RB
semanage import -f exports.semanage
Причина в том, что некоторые программы пытаются изменить контекст ( по аналогии с setuid/setgid ) перед exec(3), но используют неверный контекст для этого.
Пример: демон crond, который обрабатывает crontab пользователя user, контекст которого неизвестен. В этом случае он execlp(3) вернет ошибку 'Invalid context'.
Если по каким-то причинам авторелейбл не произошел и файл остался вообще без контекста, либо с мусором вместо контекста, доступ к нему так-же может быть заблокирован из-за того, что open(3) упадет при попытке сравнить контексты.
Как происходит включение SELinux?
Проблемы наступают на этапе два: ядро знает только о контекстах модулей, которые были явно включены до перезагрузки. Например, если не был включен модуль systemd, то:
Это проблема возникает тогда, когда после обновления не могут быть решены циклические зависимости между модулями или контекстами. Например:
При обновлении до версии 1.1 модуль local_module будет установлен после того, как будут применены настройки контекста для "/opt/local", что может привести к циклической зависимости. На самом деле от одного модуля это бывает редко, а вот когда их 30 и они ссылаются друг на друга и несут часть настроек "снаружи" ( через semanage fcontext или semanage port например ) — вот тогда проблемы почти гарантированы.
semanage export > outfile
semanage fcontext -D
semanage user -D
semanage port -D
semanage login -D
# update your packages
semanage import -f outfile
Autorelabeling — боль для владельцев больших серверов. Средний сервер с базой данных может перезагружаться 3-4 часа из-за включения SELinux, что абсолютно неприемлемо для бизнеса.
На самом деле метки на файлах лежат в extended-атрибутах файловой системы, доступ к которым можно получить при помощи команд getfattr(1)/setfattr(1)/attr(1). Атрибут называется security.selinux и содержит контекст в виде строки. При этом даже на выключенном SELinux работает команда matchpathcon из libselinux-utils, которая показывает дефолтный контекст для того или иного пути.
Совмещая оба этих факта, получаем возможность сделать audorelabel прямо во время работы сервера, не тратя на это время при перезагрузке.
Сегодня днем я выложил свой код на github [1], утилита называется offrestorecon. Не забудьте предварительно включить все нужные модули и удалить файл /.autorelabel!
Используйте ключ -P для setsebool, либо semanage boolean
Если вам интересна тема SELinux, присылайте комментарии по своим странным кейсам и их решениям, я буду добавлять их в эту статью. Возможно, что это сделает жизнь следующих security-админов немного проще.
Автор: kreon
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/sistemnoe-administrirovanie/260148
Ссылки в тексте:
[1] github: https://github.com/kreon/offrestorecon
[2] Источник: https://habrahabr.ru/post/332886/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.