Перевод статьи подготовлен специально для студентов курса «Администратор Linux».




Здесь вы получите ответы на важные вопросы о жизни, вселенной и всем таком в Linux с улучшенной безопасностью.

«Важная истина, что вещи не всегда являются тем, чем кажутся, общеизвестна…»

?Дуглас Адамс, Автостопом по Галактике

Безопасность. Повышение надежности. Соответствие. Политика. Четыре Всадника Апокалипсиса сисадмина. В дополнение к нашим ежедневным задачам — мониторингу, резервному копированию, внедрению, настройке, обновлению и т. д. — мы также отвечаем за безопасность наших систем. Даже тех систем, где сторонний провайдер рекомендует нам отключить усиленную безопасность. Это похоже на работу Этана Ханта из “Миссия невыполнима”.

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

В духе “Автостопом по галактике”, здесь приведены 42 ответа на важные вопросы об управлении и использовании SELinux в ваших системах.

1. SELinux — это система принудительного управления доступом, что означает, что каждый процесс имеет метку (label). Каждый файл, каталог и системный объект так же имеют метки. Правила политики управляют доступом между промаркированными процессами и объектами. Ядро обеспечивает соблюдение этих правил.

2. Двумя наиболее важными концепциями являются: Labeling — маркировка (файлы, процессы, порты и т. д.) и Type enforcement (который изолирует процессы друг от друга на основе типов).

3. Правильный формат метки user:role:type:level (опционально).

4. Целью обеспечения многоуровневой безопасности (Multi-Level Security — MLS) является управление процессами (доменами) на основе уровня безопасности данных, которые они будут использовать. Например, секретный процесс не может прочитать сверхсекретные данные.

5. Обеспечение мультикатегорийной безопасности (Multi-Category Security — MCS) защищает похожие процессы друг от друга (например, виртуальные машины, механизмы OpenShift, песочницы SELinux, контейнеры и т. д.).

6. Параметры ядра для изменения режимов SELinux при загрузке:

  • autorelabel=1 > заставляет систему запускать перемаркировку
  • selinux=0 > ядро не загружает инфраструктуру SELinux
  • enforcing=0 > загрузка в permissive режиме

7. Если вам нужно перемаркировать всю систему:

# touch /.autorelabel
#reboot


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

8. Чтобы проверить, включен ли SELinux: # getenforce

9. Чтобы временно включить/отключить SELinux: # setenforce [1|0]

10. Проверка статуса SELinux: # sestatus

11. Файл конфигурации: /etc/selinux/config

12. Как работает SELinux? Вот пример маркировки для веб-сервера Apache:

  • Двоичное представление: /usr/sbin/httpd>httpd_exec_t
  • Каталог конфигурации: /etc/httpd>httpd_config_t
  • Каталог файлов лога: /var/log/httpd > httpd_log_t
  • Каталог содержимого: /var/www/html > httpd_sys_content_t
  • Скрипт запуска: /usr/lib/systemd/system/httpd.service > httpd_unit_file_d
  • Процесс: /usr/sbin/httpd -DFOREGROUND > httpd_t
  • Порты: 80/tcp, 443/tcp > httpd_t, http_port_t

Процесс, запущенный в контексте httpd_t, может взаимодействовать с объектом с меткой httpd_something_t.

13. Многие команды принимают аргумент -Z для просмотра, создания и изменения контекста:

  • ls -Z
  • id -Z
  • ps -Z
  • netstat -Z
  • cp -Z
  • mkdir -Z

Контексты устанавливаются, когда файлы создаются на основе контекста их родительского каталога (за некоторыми исключениями). RPM могут устанавливать контексты как во время инсталляции.

14. Существует четыре основных причины ошибок SELinux, которые более подробно описаны в пунктах 15-21 ниже:

  • Проблемы с маркировкой
  • Из-за чего-то, что SELinux должен знать
  • Ошибка в политике/приложении SELinux
  • Ваша информация может быть скомпрометирована

15. Проблема с маркировкой: если ваши файлы в /srv/myweb промаркированы неправильно, доступ может быть запрещен. Вот несколько способов исправить это:

  • Если вы знаете метку:
    # semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
  • Если вы знаете файл с эквивалентной маркировкой:
    # semanage fcontext -a -e /srv/myweb /var/www
  • Восстановив контекст (для обоих случаев):
    # restorecon -vR /srv/myweb

16. Проблема с маркировкой: если вы переместите файл вместо того, чтобы скопировать его, файл сохранит свой исходный контекст. Чтобы исправить эту проблему:

  • Измените контекстную команду с меткой:
    # chcon -t httpd_system_content_t /var/www/html/index.html
  • Измените контекстную команду с меткой ссылки:
    # chcon --reference /var/www/html/ /var/www/html/index.html
  • Восстановите контекст (для обоих случаев): # restorecon -vR /var/www/html/

17. Если SELinux нужно знать, что HTTPD прослушивает порт 8585, сообщите SELinux:

# semanage port -a -t http_port_t -p tcp 8585

18. SELinux нужно знать логические значения позволяющие изменять части политики SELinux во время выполнения без знаний о перезаписи политики SELinux. Например, если вы хотите, чтобы httpd отправлял электронную почту, введите: # setsebool -P httpd_can_sendmail 1

19. SELinux нужно знать логические значения включения/выключения настроек SELinux:

  • Чтобы увидеть все логические значения: # getsebool -a
  • Чтобы увидеть описание каждого: # semanage boolean -l
  • Чтобы установить логическое значение: # setsebool [_boolean_] [1|0]
  • Для постоянной установки добавьте -P. Например: # setsebool httpd_enable_ftp_server 1 -P

20. Политики/приложения SELinux могут содержать ошибки, в том числе:

  • Необычные пути кода
  • Конфигурации
  • Перенаправление stdout
  • Утечки файловых дескрипторов
  • Исполняемая память
  • Плохо построенные библиотеки

Открывайте тикеты (не отправляйте отчет в Bugzilla; в Bugzilla нет SLA).

21. Ваша информация может быть скомпрометирована, если у вас есть ограниченные домены, пытающиеся:

  • Загрузить модули ядра
  • Отключить enforced режим SELinux
  • Писать в etc_t/shadow_t
  • Изменить правила iptables

22. Инструменты SELinux для разработки модулей политики:

# yum -y install setroubleshoot setroubleshoot-server

Перезагрузите или перезапустите auditd после установки.

23. Используйте
journalctl
для вывода списка всех логов, связанных с setroubleshoot:

# journalctl -t setroubleshoot --since=14:20

24. Используйте journalctl для вывода списка всех логов, связанных с определенной меткой SELinux. Например:

# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0

25. При возникновении ошибки SELinux используйте лог setroubleshoot с предложением несколько возможных решений.
Например, из journalctl:

Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e

# sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
SELinux is preventing httpd from getattr access on the file /var/www/html/index.html.

***** Plugin restorecon (99.5 confidence) suggests ************************

If you want to fix the label,
/var/www/html/index.html default label should be httpd_syscontent_t.
Then you can restorecon.
Do
# /sbin/restorecon -v /var/www/html/index.html


26. Логирование: SELinux записывает информацию во многих местах:

  • /var/log/messages
  • /var/log/audit/audit.log
  • /var/lib/setroubleshoot/setroubleshoot_database.xml

27. Логирование: поиск ошибок SELinux в логе аудита:

# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today

28. Для того чтобы найти сообщения SELinux Access Vector Cache (AVC) для определенной службы:

# ausearch -m avc -c httpd

29. Утилита audit2allow собирает информацию из логов запрещенных операций, а затем генерирует правила политики разрешений SELinux. Например:

  • Чтобы создать удобочитаемое описание причины отказа в доступе: # audit2allow -w -a
  • Чтобы просмотреть правило принудительного использования типов, разрешающее запрещенный доступ: # audit2allow -a
  • Чтобы создать пользовательский модуль: # audit2allow -a -M mypolicy
  • Опция -M создает файл принудительного применения типа (.te) с указанным именем и компилирует правило в пакет политики (.pp): mypolicy.pp mypolicy.te
  • Чтобы установить пользовательский модуль: # semodule -i mypolicy.pp

30. Чтобы настроить отдельный процесс (домен) для работы в permissive режиме: # semanage permissive -a httpd_t

31. Если вы больше не хотите, чтобы домен был permissive: # semanage permissive -d httpd_t

32. Чтобы отключить все permissive домены: # semodule -d permissivedomains

33. Включение MLS политики SELinux: # yum install selinux-policy-mls
в /etc/selinux/config:

SELINUX=permissive
SELINUXTYPE=mls


Убедитесь, что SELinux работает в permissive режиме: # setenforce 0
Используйте скрипт fixfiles, чтобы гарантировать, что файлы будут перемаркированы при следующей перезагрузке:

# fixfiles -F onboot # reboot

34. Создать пользователя с определенным диапазоном MLS: # useradd -Z staff_u john

Используя команду useradd, сопоставьте нового пользователя с существующим пользователем SELinux (в данном случае, staff_u).

35. Чтобы просмотреть соответствие между пользователями SELinux и Linux: # semanage login -l

36. Определите определенный диапазон для пользователя: # semanage login --modify --range s2:c100 john

37. Чтобы исправить метку в домашнем каталоге пользователя (при необходимости): # chcon -R -l s2:c100 /home/john

38. Для просмотра текущих категорий: # chcat -L

39. Чтобы изменить категории или начать создавать свои собственные, измените файл следующим образом:

/etc/selinux/_<selinuxtype>_/setrans.conf

40. Чтобы запустить команду или скрипт в определенном файле, роли и пользовательском контексте:

# runcon -t initrc_t -r system_r -u user_u yourcommandhere

  • -t контекст файла
  • -r контекст роли
  • -u контекст пользователя

41. Контейнеры, работающие с отключенным SELinux:

  • Podman: # podman run --security-opt label=disable …
  • Docker: # docker run --security-opt label=disable …

42. Если вам нужно предоставить контейнеру полный доступ к системе:

  • Podman: # podman run --privileged …
  • Docker: # docker run --privileged …

И теперь вы уже знаете ответ. Поэтому, пожалуйста: не паникуйте и включите SELinux.

Ссылки: