Управление SELinux



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

Понимание работы и режимов SELinux

Если SELinux включен и ничего больше не настроено, все системные вызовы отклоняются. Чтобы указать, что именно разрешено, используется политика. В этой политике правила определяют, к какому исходному домену разрешен доступ к какому целевому домену. Исходный домен — это объект, который пытается получить доступ к чему-либо. Как правило, это процесс или пользователь. Целевой домен — это объект, к которому осуществляется доступ. Как правило, это файл, каталог или сетевой порт, чтобы точно определить, что разрешено; используются контекстные метки. Использование этих меток является сущностью SELinux, поскольку эти метки используются для определения правил доступа.

Основные элементы SELinux

Элемент

Описание элемента

 Policy
 
Набор правил, которые определяют, какой источник имеет доступ к какой цели.

 Source domain
 
Объект, который пытается получить доступ к цели. Обычно пользователь или процесс.

 Target domain
 
То, к чему пытается обратиться исходный домен. Обычно это файл или порт.

 Context

Метка безопасности, которая используется для классификации объектов в SELinux.

 Rule

Определенная часть политики, которая определяет, какой исходный домен имеет какие права доступа к какому целевому домену.

 Labels

То же, что и метка контекста, определенная для определения того, какой исходный домен имеет доступ к какому целевому домену.

В системе Linux вы можете включить или отключить SELinux. Когда SELinux включен, загружается поддержка ядра для SELinux, и некоторые приложения, осведомленные о SELinux, меняют свое поведение, потому что в системе, в которой включен SELinux, используются определенные библиотеки. Если SELinux отключен, никаких действий SELinux вообще не будет. Переключение между включенным SELinux и отключенным режимом SELinux требует перезагрузки вашей системы. Это потому, что SELinux — это функция, тесно связанная с ядром Linux.

Если в системе включен SELinux, вы можете выбрать перевод SELinux в принудительный режим (enforcing mode) или в разрешающий режим (permissive mode). В принудительном режиме SELinux полностью работает и обеспечивает соблюдение всех правил SELinux в политике. Если SELinux находится в разрешающем режиме, все действия, связанные с SELinux, регистрируются, но доступ не блокируется. Это делает разрешающий режим SELinux отличным режимом для устранения неполадок. Разрешительный режим также является отличным способом сделать что-то и увидеть результат с точки зрения SELinux. Это может помочь в создании новой и более эффективной политики.

Чтобы установить режим SELinux по умолчанию во время загрузки, используйте файл /etc/sysconfig/selinux.

[root@server1 ~]# cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

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

На сервере, на котором в данный момент включен SELinux, вы можете использовать команду getenforce, чтобы увидеть, находится ли он в принудительном или разрешительном режиме. Для переключения между разрешающим и принудительным режимом вы можете использовать setenforce. Команда setenforce 0 переводит SELinux в разрешающий режим, а setenforce 1 переводит SELinux в принудительный режим.

Еще одна полезная команда — sestatus. При использовании с параметром -v эта команда отображает подробную информацию о текущем состоянии SELinux на сервере. Ниже показаны выходные данные команды sestatus -v. Он не только показывает, какие части SELinux включены, но также показывает текущую версию загруженной политики и метки контекста для некоторых критических частей системы.

[root@server1 log]# sestatus -v
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
Process contexts:
Current context:
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Init context: system_u:system_r:init_t:s0
/usr/sbin/sshd system_u:system_r:sshd_t:s0-s0:c0.c1023
File contexts:
Controlling terminal: unconfined_u:object_r:user_devpts_t:s0
/etc/passwd system_u:object_r:passwd_file_t:s0
/etc/shadow system_u:object_r:shadow_t:s0
/bin/bash system_u:object_r:shell_exec_t:s0
/bin/login system_u:object_r:login_exec_t:s0
/bin/sh system_u:object_r:bin_t:s0 ->
system_u:object_r:shell_exec_t:s0
/sbin/agetty system_u:object_r:getty_exec_t:s0
/sbin/init system_u:object_r:bin_t:s0 ->
system_u:object_r:init_exec_t:s0
/usr/sbin/sshd system_u:object_r:sshd_exec_t:s0

Управление режимами SELinux

1. Откройте консоль под рутом и введите getenforce. Обычно вы видите, что SELinux находится в enforcing mode.

2. Введите setenforce 0 и снова введите getenforce. SELinux теперь переключается в permissive mode.

3. Откройте файл /etc/sysconfig/selinux в редакторе и измените строку SELINUX= так, чтобы он читал SELINUX=disabled. Перезагрузите сервер.

4. После перезагрузки снова войдите под рутом и введите getenforce. Вы увидите, что SELinux теперь в disabled mode.

5. Попробуйте использовать команду setenforce 1. Вы увидите сообщение «setenforce: SELinux is disabled». Вы не можете переключаться между disabled mode и enforcing mode без перезагрузки сервера.

6. Снова откройте файл /etc/sysconfig/selinux и измените строку SELINUX=disabled обратно на SELINUX=enforcing. Перезагрузите вашу систему снова.

7. После перезагрузки введите sestatus -v и прочитайте информацию о текущем состоянии SELinux.
Что бы вы ни делали, не меняйте содержимое файла /etc/sysconfig/selinux. Система по умолчанию должна быть настроена на SELinux в режиме enforcing. Для устранения неполадок SELinux вы можете временно перевести его в режим permissive с помощью setenforce 0. В этом режиме вы можете устранить любую проблему SELinux, но, по крайней мере, вы будете уверены, что после перезагрузки ваш сервер будет запущен в режиме, в котором включен SELinux.
Обратите внимание, что на реальных серверах иногда отключается SELinux. Перевод SELinux в режим disabled, безусловно, облегчает администраторам запуск своих приложений. Тем не менее, это также делает его менее безопасным. Часто нет причины, кроме незнания системного администратора, переводить SELinux в отключенный режим, даже если разработчики некоторых приложений сообщают, что приложение поддерживается только в том случае, если SELinux отключен.

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

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

Понимание настроек контекста и политики

Настройки контекста являются важной частью операций SELinux.

Контекст — это метка, которая может быть применена к различным элементам:
  • файлы и каталоги
  • порты
  • процессы
  • пользователи
Метки контекста определяют природу элемента, а правила SELinux создаются для сопоставления меток контекста исходных объектов с метками контекста целевых объектов. Таким образом, установка правильных меток контекста является очень важным навыком для системных администраторов.

Мониторинг текущих контекстных меток

Чтобы увидеть текущие настройки контекста для этих объектов, многие команды предлагают поддержку опции -Z. Ниже показано, как ls -Z показывает настройки контекста для некоторых каталогов в /. Другие команды также поддерживают параметр -Z для отображения текущих настроек меток контекста.

Некоторыми примерами являются ps Zaux, который показывает список всех процессов, включая их метку контекста, или netstat -Ztulpen, который показывает все сетевые порты и метку текущего контекста, связанную с каждым портом.

[root@server1 /]# ls -Z
lrwxrwxrwx. root root system_u:object_r:bin_t:s0 bin -> usr/bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot
drwxr-xr-x root root ? dev
drwxr-xr-x. root root system_u:object_r:etc_t:s0 etc
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
lrwxrwxrwx. root root system_u:object_r:lib_t:s0 lib -> usr/lib
lrwxrwxrwx. root root system_u:object_r:lib_t:s0 lib64 -> usr/
lib64
drwxr-xr-x. root root system_u:object_r:mnt_t:s0 media
drwxr-xr-x. root root system_u:object_r:mnt_t:s0 mnt
drwxr-xr-x. root root system_u:object_r:usr_t:s0 opt
dr-xr-xr-x root root ? proc
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 root
drwxr-xr-x root root ? run
lrwxrwxrwx. root root system_u:object_r:bin_t:s0 sbin -> usr/sbin
drwxr-xr-x. root root system_u:object_r:var_t:s0 srv
dr-xr-xr-x root root ? sys
drwxrwxrwt. root root system_u:object_r:tmp_t:s0 tmp
drwxr-xr-x. root root system_u:object_r:usr_t:s0 usr
drwxr-xr-x. root root system_u:object_r:var_t:s0 var
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 web

Каждая контекстная метка всегда состоит из трех разных частей:


 User:

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

 Role:


role может быть распознана как _r в метке контекста. Большинство объектов помечены ролью object_r. В расширенном управлении SELinux конкретным пользователям SELinux могут быть назначены разрешения для определенных ролей SELinux.

 Type:


контекст type может быть распознан как _t в метке контекста. Вы можете видеть, что к каталогам в / применяется широкий спектр типов контекста.

Установка типов контекста

Как администратор, важно, чтобы вы знали, как устанавливать типы контекста. Вы можете установить эти типы контекста для файлов и каталогов и других объектов, таких как сетевые порты.

Вы можете использовать две команды для установки типа контекста:
  • semanage: это команда, которую вы должны использовать. Команда semanage записывает новый контекст в политику SELinux, из которой он применяется к файловой системе.
  • chcon: эта команда предназначена для использования только в определенных случаях и обычно ее следует избегать. Команда chcon записывает новый контекст в файловую систему, а не в политику. Все, что применяется с chcon, перезаписывается, когда файловая система перемаркируется (relabel), или исходный контекст восстанавливается из политики в файловую систему. Не используйте эту команду!
Команда semanage может быть не установлена по умолчанию. Введите yum whatprovides * / semanage, чтобы найти нужный пакет RPM, содержащий semanage, а затем установите его.
Чтобы установить контекст с помощью semanage, сначала нужно найти соответствующий контекст (более подробно эта тема будет рассмотрена в следующем разделе «Поиск нужного типа контекста»). Простой способ найти подходящий контекст — посмотреть на настройки контекста по умолчанию для уже существующих элементов. Например, если вы хотите изменить контекст для веб-сервера,  введите ls -Z /var/www, чтобы увидеть настройки контекста:

root@server1 /]# ls -Z /var/www
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html

Как видите, настройки контекста в /var/www/html установлены на httpd_sys_content_t.

Чтобы установить для этого типа контекста любой новый каталог, к которому вы хотите получить доступ веб-сервером Apache, используйте следующую команду:

semanage fcontext -a -t httpd_sys_content_t "/mydir(/.*)?"

В этой команде параметр -a используется для добавления типа контекста. Это то, что вам нужно сделать для всех каталогов, которые вы создали вручную. Затем вы используете -t для изменения типа контекста (в отличие от пользователя и роли). Последняя часть команды представляет собой регулярное выражение, которое используется для ссылки на каталог /mydir и все, что может существовать под этим каталогом.

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

restorecon -R -v / mydir

Вы увидите, что теперь применяется новый контекст, который позволяет процессу httpd получать доступ к каталогу.
Команда semanage — не самая простая команда для запоминания. К счастью, у неё есть хорошие справочные страницы. Введите man semanage и используйте G, чтобы пройти до конца страницы. Теперь вы увидите раздел «see also», в котором упоминается semanage-fcontext. Откройте эту справочную страницу, используя man semanage-fcontext, введите /examples, и вы увидите несколько примеров, в которых точно указано, что вам нужно знать.

Пример. Настройка меток контекста в Nondefault Apache Document Root.

1. Зайдите под рутом и введите yum install httpd elinks –y, чтобы установить httpd и elinks.

2. Создайте папку mkdir /web.

3. Введите vi /web/index.html и поместите в файл следующее содержимое: welcome to my web server.

4. Введите vi /etc/httpd/conf/httpd.conf, чтобы открыть файл конфигурации Apache и найти параметр DocumentRoot. Измените его так, чтобы оно читало DocumentRoot «/web».

5. В тот же файл конфигурации httpd.conf добавьте следующий раздел:
<Directory "/web">
AllowOverride None
Require all granted
</Directory>

6. Введите systemctl restart httpd; systemctl enable httpd.

7. Введите elinks http://localhost. Вы увидите веб-страницу по умолчанию, а не содержимое только что созданного файла index.html.

8. Введите setenforce 0, чтобы переключить SELinux в режим permissive.

9. Повторите Шаг 7. Теперь вы получите доступ к своей пользовательской веб-странице, которая доказывает, что SELinux что-то делал для блокирования доступа.

10. Введите semanage fcontext -a -t httpd_sys_content_t «/web (/.*)?», чтобы применить новую метку контекста к /web.

11. Введите restorecon -R -v /web. Опция -v (подробный) гарантирует, что вы видите, что происходит, и что вы увидите, что новый контекст применяется к /web.

12. Установите SELinux обратно в enforcing mode, используя setenforce 1.

13. Наберите elinks http://localhost. Теперь вы получите доступ к своей пользовательской веб-странице.

Поиск нужного типа контекста SELinux

Одна из сложных частей настройки контекста SELinux — найти нужный вам контекст.

Грубо говоря, есть три подхода:
  • Посмотреть на среду по умолчанию.
  • Читать файлы конфигурации.
  • Использовать man -k _selinux для поиска справочных страниц по SELinux для вашего сервиса.
Наиболее эффективный способ получения необходимой информации SELinux — использование man -k _selinux, который ищет в базе данных man-страниц man-страницы, которые соответствуют _selinux в названии или описании man-страницы. Однако на RHEL 7/CentOS 7 эти справочные страницы не установлены по умолчанию. Чтобы установить их, вам нужно установить пакет policycoreutils-devel, после чего вы можете использовать команду sepolicy manpage -a -p /usr/share/man/man8 для установки справочных страниц SELinux.

Ниже пройдемся по шагам установки справочных страниц SELinux:

1. Введите man -k _selinux. Вы, вероятно, увидите только одну или две справочные страницы.

2. Введите yum whatprovides * /sepolicy. Результат этой команды покажет вам имя RPM, который содержит бинарный файл sepolicy, который называется policycoreutils-devel.

3. Введите yum -y install policycoreutils-devel для установки этого пакета.

4. Введите sepolicy manpage -a -p /usr/share/man/man8 для установки страниц справки.

5. Введите man -k _selinux. Вы пока не увидите никаких изменений.

6. Введите mandb, чтобы обновить базу данных, которая содержит имена и описания всех установленных man-страниц.

7. После завершения команды mandb (это может занять несколько минут), введите man -k _selinux. Теперь вы увидите длинный список страниц.

8. Введите man -k _selinux | grep http, чтобы найти справочную страницу, которая документирует настройки SELinux для сервиса httpd. Обратите внимание, что это полный список всего, что вы можете сделать с SELinux в сервисе httpd.

Восстановление файловых контекстов SELinux по умолчанию

Выше вы узнали, как применять типы контекста, используя semanage. Вы также применили параметры контекста из политики к файловой системе, используя restorecon. Команда restorecon — полезная команда, потому что в политике параметры по умолчанию определены для большинства файлов и каталогов.

Если неверный параметр контекста применяется когда-либо, вам просто нужно ввести restorecon, чтобы повторно применить его из политики в файловую систему.

Использование restorecon таким способом может быть полезно для исправления проблем с новыми файлами. Прежде чем объяснить, как это сделать, давайте посмотрим, как применяются новые настройки контекста:
  • Если создается новый файл, он наследует настройки контекста из родительского каталога.
  • Если файл копируется в каталог, это считается новым файлом, поэтому он наследует настройки контекста из родительского каталога.
  • Если файл перемещен или скопирован с сохранением его свойств (с помощью cp -a), применяются исходные параметры контекста файла.
Особенно последняя из этих трех ситуаций легко исправляется с помощью restorecon.

Также возможно перемаркировать всю файловую систему. При этом все параметры контекста применяются к файловой системе, как указано в политике. Поскольку политика всегда должна быть ведущей и содержать правильные параметры контекста, хорошей идеей может быть перемаркировка файловой системы. Чтобы перемаркировать файловую систему, вы можете использовать команду restorecon -Rv / или создать файл с именем /.autorelabel. При следующем перезапуске сервера файловая система будет автоматически перемаркирована.

Действие по перемаркировке иногда происходит спонтанно. Если при устранении неполадок с сервером вы запустили сервер в режиме, в котором SELinux был отключен, и применили изменения к файловой системе, SELinux обнаружит, что файловая система изменилась, без SELinux, отслеживая ее. Это приведет к автоматической перемаркировке всей файловой системы. Обратите внимание, что на больших файловых системах перемаркировка файловой системы может занимать значительное количество времени.

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

*** Warning -- SELinux targeted policy relabel is required.
*** Relabeling could take a very long time, depending on file
*** system size and speed of hard drives. 

Использование restorecon для перемаркировки файлов 

1. По рутом введите ls -Z /etc/hosts. Вы увидите, что файл имеет контекстную метку net_config_t.

2. Введите cp /etc/hosts ~, чтобы скопировать файл в корневой домашний каталог. Поскольку копирование считается созданием нового файла, настройка контекста в файле ~/hosts установлена как admin_home_t. Используйте ls -Z ~/hosts, чтобы проверить это.

3. Используйте mv ~/hosts/etc и подтвердите, что вы хотите перезаписать существующий файл.

4. Введите ls -Z /etc/hosts, чтобы подтвердить, что для типа контекста все еще задано значение admin_home_t.

5. Используйте restorecon -v /etc/hosts, чтобы повторно применить правильный тип контекста. Опция -v показывает вам, что происходит.

6. Введите touch /.autorelabel и перезапустите сервер. При перезапуске обязательно нажимайте клавишу Esc на клавиатуре, чтобы увидеть загрузочные сообщения.

Вы увидите, что файловая система автоматически перемаркируется.

Использование логических (boolean) настроек для изменения настроек SELinux

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

Примером логического значения является ftpd_anon_write, который по умолчанию выключен. Это означает, что даже если вы настроили свой FTP-сервер для разрешения анонимных записей, логическое значение все равно будет отказывать, и анонимный пользователь не сможет загружать какие-либо файлы. Если существует конфликт между настройкой параметра в файле конфигурации службы и логическим значением, логическое значение всегда имеет приоритет. Но булевы значения легко изменить.

Чтобы получить список логических значений в вашей системе, используйте getsebool -a. Если вы ищете логические значения, установленные для конкретной службы, используйте grep для фильтрации результатов. Ниже вы можете увидеть, как эта команда используется для отображения текущих логических значений, соответствующих FTP.

Альтернативный способ показать текущие логические настройки — использовать команду semanage boolean -l. Эта команда предоставляет некоторые дополнительные сведения, потому что она показывает текущее логическое значение и значение по умолчанию.

root@server1 ~]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off

Чтобы изменить логическое значение, вы можете использовать setsebool. Если вы хотите переключить логическое значение ftpd_anon_write, чтобы разрешить, например, анонимную запись, используйте setsebool ftpd_anon_write. Это изменяет значение среды выполнения  логического значения, но не меняет его постоянно. Чтобы применить постоянные изменения к логическому значению, используйте setsebool -P. Обратите внимание, что это занимает больше времени, потому что части политики должны быть перекомпилированы для применения изменения.

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

1. Под рутом введите getsebool -a | grep ftp. Вы увидите логическое значение ftpd_anon_write с его текущим значением off.

2. Введите setsebool ftpd_anon_write on. Это меняет значение во время выполнения.

3. Введите getsebool ftpd_anon_write. Показывает значение логического значения как on.

4. Введите semanage boolean -l | grep ftpd_anon. Обратите внимание, что эта команда показывает, что конфигурация среды выполнения включена, но постоянная настройка по-прежнему выключена.

5. Введите setsebool -P ftpd_anon_write on, чтобы включить среду выполнения и настройку по умолчанию.

6. Повторите semanage boolean -l | grep ftpd_anon. Обратите внимание, что теперь он включен в положение on.

Диагностика и устранение нарушений политики SELinux

Конфигурирование системы с помощью SELinux может быть сложной задачей. Чтобы облегчить понимание происходящего, SELinux регистрирует все, что делает. Основным источником получения информации журнала является журнал аудита, который находится в /var/log/audit/audit.log. Сообщения SELinux записываются с type=AVC в журнале аудита. Итак, чтобы увидеть, что делает SELinux, вы можете использовать команду grep AVC /var/log/audit/audit.log.

Если сообщения SELinux были зарегистрированы, эта команда показывает результат, как показано ниже:

[root@server1 audit]# grep AVC audit.log
type=USER_AVC msg=audit(1414933364.949:11): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc: received setenforce notice (enforcing=0) exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'
type=AVC msg=audit(1414933365.304:13): avc: denied { read } for pid=1330 comm="alsactl" name="asound.state" dev="dm-1" ino=72731037 scontext=system_u:system_ r:alsa_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=file
type=AVC msg=audit(1414933365.304:13): avc: denied { open } for pid=1330 comm="alsactl" path="/var/lib/alsa/asound.state" dev="dm-1" ino=72731037 scontext= system_u:system_r:alsa_t: s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=file
type=AVC msg=audit(1414933365.304:14): avc: denied { getattr } for pid=1330 comm="alsactl" path="/var/lib/alsa/asound.state" dev="dm-1" ino=72731037 scontext= system_u:system_r:alsa_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=file

На первый взгляд, сообщения журнала SELinux выглядят сложными. Если вы посмотрите немного ближе, они не так сложны для понимания.

Давайте внимательнее посмотрим на последнюю строку в файле журнала:

type=AVC msg=audit(1414933365.304:14): avc: denied { getattr } for pid=1330 comm="alsactl" path="/var/lib/alsa/asound.state" dev="dm-1" ino=72731037 scontext=system_u:system_r:alsa_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=file

Первая соответствующая часть в этой строке — это текст avc: denies {gettattr}. Это означает, что запрос getattr был отклонен, поэтому какой-то процесс попытался прочитать атрибуты файла, и это было отклонено. После этого сообщения мы можем увидеть comm=alsactl, что означает, что команда, пытающаяся выполнить запрос getattr, была alsactl, и мы можем увидеть path="/var/lib/alsa/asound.state«, который является файлом, к которому этот процесс пытался получить доступ.

В последней части строки журнала мы можем получить информацию об исходном контексте и целевом контексте. Исходный контекст (который является параметром контекста команды alsactl) установлен в alsa_t, а целевой контекст (который является параметром контекста файла asound.state) установлен в file_t. И, видимо, SELinux это не очень понравилось.

Упрощение анализа SELinux

На основании информации, которую вы найдете в audit.log, вы можете решить, что вам нужно сделать, чтобы решить проблему. Если вы не можете этого сделать, то есть sealert. Во-первых, вам нужно установить sealert с помощью yum -y install setroubleshoot-server. Затем рекомендуется перезапустить сервер, чтобы убедиться, что все задействованные процессы перезапущены правильно. В следующий раз, когда сообщение SELinux записывается в журнал аудита, более простое для понимания сообщение записывается в системный журнал и по умолчанию может быть прочитано в /var/log/messages.

Ниже показан пример вывода:

Nov 2 10:01:40 server1 setroubleshoot: Plugin Exception restorecon
Nov 2 10:01:40 server1 setroubleshoot: SELinux is preventing /usr/sbin/httpd from getattr access on the file. For complete SELinux messages. run sealert -l 0ed02423-1149-4561-b6a08ea-2957329ea
Nov 2 10:01:40 server1 python: SELinux is preventing /usr/sbin/httpd from getattr access on the file.

***** Plugin catchall_labels (83.8 confidence) suggests *******************
If you want to allow httpd to have getattr access on the file
Then you need to change the label on $FIX_TARGET_PATH
Do # semanage fcontext -a -t FILE_TYPE '$FIX_TARGET_PATH'
where FILE_TYPE is one of the following: NetworkManager_exec_t,
NetworkManager_log_t, --removed 5 pages of the "one of the following" output --

Then execute:
restorecon -v '$FIX_TARGET_PATH'
***** Plugin catchall (17.1 confidence) suggests **************************
If you believe that httpd should be allowed getattr access on the file
by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

Полезность в sealert состоит в том, что он пытается проанализировать то, что произошло, и на основе анализа он предлагает то, что вам нужно сделать, чтобы решить проблему. Не очень полезная часть заключается в том, что в некоторых случаях (как было в этом примере) отображаются сотни возможных типов контекста, и администратор должен выбрать правильный.
Итак, если вы не знаете, что делаете, вы рискуете легко потеряться.
Работая с sealert, вы видите, что вызываются разные плагины, и каждый плагин имеет показатель достоверности. Если, как в примере, приведенном выше, один плагин дает оценку достоверности 83,8%, а другой дает оценку достоверности 17,1%, может быть очевидно, что первым подходом является то, что вам следует делать. К сожалению, однако, это не всегда так легко читается.

Итак. Если вы не уверены, что SELinux пытается вам рассказать, установите setroubleshoot-server и проанализируйте, что показывает sealert. Информация, которую показывает sealert, часто намного более читабельна. Иногда это совсем не поможет, а иногда информация может оказаться весьма полезной.

Добавить комментарий