Вопрос или проблема
У меня есть скрипт, выполняемый приложением Java с контекстом testmod_t
. Этот скрипт выполняет
chage -M -1 user
, чтобы установить у пользователя отсутствие срока действия. Однако, когда SELinux работает в режиме принудительного соблюдения, команда, похоже, ничего не делает, и в журнале аудита появляется следующее сообщение.
type=USER_MGMT msg=audit(1719390859.006:1359): pid=4342 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:testmod_t:s0 msg='op=change-age acct="" exe="/usr/bin/chage" hostname=? addr=? terminal=? res=failed'UID="root" AUID="unset"
Когда SELinux работает в режиме разрешений, команда chage
работает корректно, и в журнале аудита появляется следующее сообщение:
type=USER_MGMT msg=audit(1719219933.759:2056): pid=8851 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:testmod_t:s0 msg='op=change-max-age id=1018 exe="/usr/bin/chage" hostname=? addr=? terminal=? res=success'UID="root" AUID="unset" ID="user"
В журнале аудита нет сообщения “отказано”.
Когда я попробовал
cat /var/log/audit/audit.log | audit2allow -M testmod
, он также выводит “ничего не нужно делать”.
Есть ли что-то еще, что я мог бы сделать, чтобы выяснить, почему SELinux влияет на мой скрипт?
Если вы думаете, что SELinux блокирует что-то, но вы не видите отказа в журнале аудита, возможно, это из-за тихих отказов. Эти отказы происходят, но не подлежат аудиту, потому что существует правило, которое явно отключает аудит. Это правило называется dontaudit.
Из документации RHEL по SELinux:
Приложения и функции системной библиотеки часто запрашивают больше прав доступа, чем требуется для выполнения их задач. Чтобы поддерживать наименьшие права без заполнения журналов аудита отказами AVC для безобидного запроса приложений, политика может подавлять отказы AVC, не позволяя при этом разрешений, используя правила dontaudit. Эти правила распространены в стандартной политике. Недостаток dontaudit заключается в том, что, хотя SELinux и отказывает в доступе, сообщения об отказах не записываются, что затрудняет устранение неполадок.
Чтобы восстановить политику SELinux, игнорируя все правила dontaudit, выполните команду semodule -DB
. Опция -D
отключает правила dontaudit; опция -B
восстанавливает политику.
Затем попробуйте, смогут ли вы вызвать событие журнала аудита. Если да, исправьте это, а затем повторно включите правила dontaudit, выполнив: semodule -B
.
Для получения полного списка правил dontaudit выполните команду sesearch --dontaudit
. Уточните поиск, используя опцию домена -s
и команду grep
. Например:
» sesearch --dontaudit -s smbd_t | grep squid
dontaudit smbd_t squid_port_t : tcp_socket name_bind ;
dontaudit smbd_t squid_port_t : udp_socket name_bind ;
Ответ или решение
Если вы столкнулись с ситуацией, когда SELinux блокирует выполнение вашей команды, но в журнале аудита не появляются сообщения о запрете, это может быть связано с наличием «тихих отказов» (silent denials). Данные отказы происходят, но не регистрируются в журнале аудита, потому что существует правило, которое явно отключает аудит. Это правило называется «dontaudit».
Понимание «dontaudit» правил в SELinux
Согласно документации SELinux для RHEL, приложения и функции системных библиотек часто запрашивают больше прав доступа, чем необходимо для выполнения своих задач. Чтобы поддерживать минимальные привилегии без заполнения журналов аудита сообщениями о запретах AVC для безобидных проверок приложений, политика может заглушить отказы AVC без предоставления разрешений, используя правила dontaudit
. Эти правила часто встречаются в стандартной политике. Однако недостатком dontaudit
является то, что, хотя SELinux и отказывает в доступе, сообщения об отказе не логируются, что затрудняет диагностику.
Исправление проблемы с помощью semodule
Чтобы восстановить политику SELinux, игнорируя все правила dontaudit
, выполните команду:
semodule -DB
Здесь ключ -D
отключает правила dontaudit
, а -B
выполняет перекомпиляцию политики. После этого попробуйте снова выполнить вашу команду. Если какая-либо ошибка возникает и записывается в журнал аудита, вы сможете её зафиксировать и решить.
Обратное включение правил dontaudit
После того как вы зафиксировали и устранили проблему, не забудьте снова включить правила dontaudit
, выполнив:
semodule -B
Поиск правил dontaudit
Чтобы получить полный список правил dontaudit
, используйте команду:
sesearch --dontaudit
Нarrow down your searches using the -s
domain option along with grep
. Например:
sesearch --dontaudit -s testmod_t
Заключение
Обращая внимание на возможные «тихие отказы» в SELinux, вы сможете более эффективно справляться с проблемами, связанными с безопасностью и правами доступа. Ваша способность идентифицировать и диагностировать такие ситуации решает множество задач, связанных с администрированием систем и поддержанием безопасности. Не забывайте всегда мониторить журналы и поддерживать актуальность политики SELinux для более безопасной работы ваших приложений.