Введение в SELinux на CentOS 7 - Часть 2. Файлы и процессы

Вступление

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

Чтобы освежить вашу память из предыдущего урока, контекст безопасности файла - это type, а контекст безопасности процесса - domain.

_ * Примечание * + Команды, пакеты и файлы, показанные в этом руководстве, были протестированы на CentOS 7. Концепции остаются такими же для других распределений. _

В этом руководстве мы будем запускать команды от имени пользователя root, если не указано иное. Если у вас нет доступа к корневой учетной записи и вы используете другую учетную запись с привилегиями sudo, вам необходимо добавить команды перед ключевым словом + sudo +.

Создание тестовых учетных записей пользователей

Во-первых, давайте создадим четыре учетные записи пользователей, чтобы продемонстрировать возможности SELinux в процессе работы.

  • regularuser

  • switcheduser

  • гостевой пользователь

  • ограниченный пользователь

В настоящее время вы должны быть пользователем * root *. Давайте добавим следующую команду, чтобы добавить учетную запись * normaluser *:

useradd -c "Regular User" regularuser

Затем мы запускаем команду + passwd +, чтобы изменить ее пароль:

passwd regularuser

Вывод попросит у нас новый пароль. После этого аккаунт будет готов для входа в систему:

Changing password for user regularuser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

Давайте создадим и другие аккаунты:

useradd -c "Switched User" switcheduser
passwd switcheduser
useradd -c "Guest User" guestuser
passwd guestuser
useradd -c "Restricted Role User" restricteduser
passwd restricteduser

SELinux для процессов и файлов

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

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

Мы начнем обсуждение этой части руководства с понимания того, что означают SELinux contexts и domains.

Первая часть безопасности ставит label для каждого объекта в системе Linux. Метка похожа на любой другой атрибут файла или процесса (владелец, группа, дата создания и т. Д.); он показывает context ресурса. Так в чем же контекст? Проще говоря, контекст - это набор информации, связанной с безопасностью, которая помогает SELinux принимать решения по управлению доступом. Все в системе Linux может иметь контекст безопасности: учетная запись пользователя, файл, каталог, демон или порт могут иметь свои контексты безопасности. Однако контекст безопасности будет означать разные вещи для разных типов объектов. + ​

Контексты файлов SELinux

Давайте начнем с понимания контекстов файла SELinux. Давайте посмотрим на вывод обычной команды ls -l для каталога / etc.

ls -l /etc/*.conf

Это покажет нам знакомый вывод:

...
-rw-r--r--. 1 root root    19 Aug 19 21:42 /etc/locale.conf
-rw-r--r--. 1 root root   662 Jul 31  2013 /etc/logrotate.conf
-rw-r--r--. 1 root root  5171 Jun 10 07:35 /etc/man_db.conf
-rw-r--r--. 1 root root   936 Jun 10 05:59 /etc/mke2fs.conf
...

Просто, правда? Давайте теперь добавим флаг -Z:

ls -Z /etc/*.conf

Теперь у нас есть дополнительный столбец информации после владения пользователем и группой:

...
-rw-r--r--. root root system_u:object_r:locale_t:s0    /etc/locale.conf
-rw-r--r--. root root system_u:object_r:etc_t:s0       /etc/logrotate.conf
-rw-r--r--. root root system_u:object_r:etc_t:s0       /etc/man_db.conf
-rw-r--r--. root root system_u:object_r:etc_t:s0       /etc/mke2fs.conf
...

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

-rw-r--r--. root    root  system_u:object_r:etc_t:s0       /etc/logrotate.conf

Контекст безопасности - это часть:

system_u:object_r:etc_t:s0

Есть четыре части, и каждая часть контекста безопасности отделена двоеточием (:). Первая часть - это контекст SELinux user для файла. Мы обсудим пользователей SELinux позже, но сейчас мы видим, что это * system_u *. Каждая учетная запись пользователя Linux сопоставляется с пользователем SELinux, и в этом случае пользователь * root *, которому принадлежит файл, сопоставляется с пользователем * system_u * SELinux. Это сопоставление выполняется политикой SELinux.

Вторая часть определяет SELinux role, которая является * object_r *. Чтобы освежить в памяти роли SELinux, вернитесь к первой статье SELinux.

Здесь важнее всего третья часть, type файла, который указан здесь как * etc_t *. Это та часть, которая определяет, к какому типу относится файл или каталог. Мы видим, что большинство файлов относятся к типу * etc_t * в каталоге + / etc +. Гипотетически вы можете думать о типе как о «группе» или attribute для файла: это способ классификации файла.

Мы также видим, что некоторые файлы могут принадлежать другим типам, например + locale.conf +, который имеет тип * locale_t *. Даже если все файлы, перечисленные здесь, имеют одинаковых пользователей и владельцев групп, их типы могут быть разными.

В качестве другого примера, давайте проверим контексты типов для домашних каталогов пользователей:

ls -Z /home

Домашние каталоги будут иметь другой тип контекста: * user_home_dir_t *

drwx------. guestuser      guestuser      unconfined_u:object_r:user_home_dir_t:s0      guestuser
drwx------. root           root           system_u:object_r:lost_found_t:s0 lost+found
drwx------. regularuser    regularuser    unconfined_u:object_r:user_home_dir_t:s0      regularuser
drwx------. restricteduser restricteduser unconfined_u:object_r:user_home_dir_t:s0      restricteduser
drwx------. switcheduser   switcheduser   unconfined_u:object_r:user_home_dir_t:s0      switcheduser
drwx------. sysadmin       sysadmin       unconfined_u:object_r:user_home_dir_t:s0      sysadmin

Четвертая часть контекста безопасности, * s0 , связана с multilevel security или MLS. По сути, это еще один способ применения политики безопасности SELinux, и эта часть показывает sensitivity ресурса ( s0 *). Мы кратко поговорим о чувствительности и категориях позже. Для большинства ванильных установок SELinux первые три контекста безопасности более важны.

Контексты процесса SELinux

Давайте теперь поговорим о контексте безопасности процесса.

Запустите службы Apache и SFTP. Мы установили эти службы в первом руководстве по SELinux.

service httpd start
service vsftpd start

Мы можем запустить команду + ps + с несколькими флагами, чтобы показать процессы Apache и SFTP, запущенные на нашем сервере:

ps -efZ | grep 'httpd\|vsftpd'

Еще раз флаг -Z используется для отображения контекстов SELinux. Выходные данные показывают пользователя, выполняющего процесс, идентификатор процесса и идентификатор родительского процесса:

system_u:system_r:httpd_t:s0            root        7126    1       0 16:50 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0            apache      7127    7126    0 16:50 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0            apache      7128    7126    0 16:50 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0            apache      7129    7126    0 16:50 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0            apache      7130    7126    0 16:50 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0            apache      7131    7126    0 16:50 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:ftpd_t:s0-s0:c0.c1023 root        7209    1       0 16:54 ?        00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 7252 2636  0 16:57 pts/0 00:00:00 grep --color=auto httpd\|vsftpd

Контекст безопасности - это часть:

system_u:system_r:httpd_t:s0

Контекст безопасности состоит из четырех частей: пользователь, роль, домен и чувствительность. Пользователь, роль и чувствительность работают так же, как и для файлов (объяснение в предыдущем разделе). Домен уникален для процессов.

В приведенном выше примере мы видим, что несколько процессов выполняются в домене * httpd_t *, а один - в домене * ftpd_t *.

Так что домен делает для процессов? Это дает процессу контекст для запуска. Это как пузырь вокруг процесса, который confines его. Он сообщает процессу, что он может сделать, а что нет. Это ограничение гарантирует, что каждый домен процесса может работать только с определенными типами файлов и ничего более.

Используя эту модель, даже если процесс захвачен другим вредоносным процессом или пользователем, худшее, что он может сделать, это повредить файлы, к которым у него есть доступ. Например, демон vsftp не будет иметь доступа к файлам, используемым, скажем, sendmail или samba. Это ограничение реализовано на уровне ядра: оно применяется, когда политика SELinux загружается в память, и, таким образом, контроль доступа становится mandatory.

Соглашения об именах

Прежде чем идти дальше, обратите внимание на соглашение об именах SELinux. SELinux Для пользователей добавляется суффикс «_u», для ролей - «_r», а для типов (для файлов) или доменов (для процессов) - «_t».

Как процессы получают доступ к ресурсам

До сих пор мы видели, что файлы и процессы могут иметь разные контексты, и что они ограничены их собственными типами или доменами. Так как же работает процесс? Для запуска процесс должен получить доступ к своим файлам и выполнить с ними некоторые действия (открыть, прочитать, изменить или выполнить). Мы также узнали, что каждый процесс может иметь доступ только к определенным типам ресурсов (файлы, каталоги, порты и т. Д.).

SELinux устанавливает эти правила доступа в политике. Правила доступа следуют стандартной структуре allow Statement:

allow <domain> <type>:<class> { <permissions> };

Мы уже говорили о доменах и типах. * Class * определяет, что на самом деле представляет ресурс (файл, каталог, символическая ссылка, устройство, порты, курсор и т. Д.)

Вот что означает этот общий оператор allow:

  • Если процесс относится к определенной области

  • И объект ресурса, к которому он пытается получить доступ, имеет определенный класс и тип

  • Затем разрешите доступ

  • Остальное запретить доступ

Чтобы увидеть, как это работает, давайте рассмотрим контексты безопасности демона httpd, работающего в нашей системе CentOS 7:

system_u:system_r:httpd_t:s0     7126 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     7127 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     7128 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     7129 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     7130 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     7131 ?        00:00:00 httpd

Домашним каталогом по умолчанию для веб-сервера является + / var / www / html. Давайте создадим файл в этом каталоге и проверим его контекст:

touch /var/www/html/index.html
ls -Z /var/www/html/*

Файловый контекст для нашего веб-контента будет * httpd_sys_content_t *:

-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

Мы можем использовать команду + sesearch + для проверки типа доступа, разрешенного для демона httpd:

sesearch --allow --source httpd_t --target httpd_sys_content_t --class file

Флаги, используемые с командой, довольно понятны: исходный домен * httpd_t *, тот же домен, в котором работает Apache. Нас интересуют целевые ресурсы, которые являются файлами и имеют контекст типа * httpd_sys_content_t *. Ваш вывод должен выглядеть так:

Found 4 semantic av rules:
  allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } ;
  allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
  allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
  allow httpd_t httpdcontent : file { ioctl read write create getattr setattr lock append unlink link rename execute open } ;

Обратите внимание на первую строку:

allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } ;

Это говорит о том, что демон httpd (веб-сервер Apache) имеет контроль ввода-вывода, чтение, получение атрибутов, блокировку и открытый доступ к файлам типа * httpd_sys_content *. В этом случае ваш файл + index.html имеет такой же тип.

Пройдя еще дальше, давайте сначала изменим веб-страницу (+ / var / www / html / index.html). Отредактируйте файл, чтобы он содержал этот контент:

<html>
   <title>
       This is a test web page
   </title>
   <body>
       <h1>This is a test web page</h1>
   </body>
</html>

Затем мы изменим права доступа к папке + / var / www / + и ее содержимому, а затем перезапустим демон httpd:

chmod -R 755 /var/www
service httpd restart

Затем мы попытаемся получить к нему доступ из браузера:

изображение: https: //assets.digitalocean.com/articles/SELinuxCentOS7/2.jpg [Доступ к веб-странице с правильной настройкой SELiunux]

_ * Примечание * + В зависимости от того, как настроен ваш сервер, вам может потребоваться включить порт 80 в брандмауэре IPTables для пропуска входящего HTTP-трафика извне сервера. Мы не будем вдаваться в подробности включения портов в IPTables здесь. Есть несколько отличных DigitalOcean articles по теме, которую вы можно использовать. _

Все идет нормально. Демон httpd авторизован для доступа к файлу определенного типа, и мы можем видеть его при доступе через браузер. Теперь давайте изменим контекст файла. Для этого мы будем использовать команду + chcon +. Флаг + - type + для команды позволяет нам указать новый тип для целевого ресурса. Здесь мы меняем тип файла на * var_t *.

chcon --type var_t /var/www/html/index.html

Мы можем подтвердить изменение типа:

ls -Z /var/www/html/
-rwxr-xr-x. root root unconfined_u:object_r:var_t:s0   index.html

Далее, когда мы пытаемся получить доступ к веб-странице (т.е. демон httpd пытается прочитать файл), вы можете получить ошибку * Forbidden * или страницу CentOS «Testing 123»:

изображение: https: //assets.digitalocean.com/articles/SELinuxCentOS7/3.jpg [Доступ к веб-странице с неправильной настройкой SELinux]

Так что здесь происходит? Очевидно, что в некотором доступе теперь отказано, но чей это доступ? Что касается SELinux, веб-сервер авторизован для доступа только к определенным типам файлов, и var_t не является одним из таких контекстов. Поскольку мы изменили контекст файла index.html на var_t, Apache больше не может его читать, и мы получаем ошибку.

Чтобы все заработало снова, давайте изменим тип файла с помощью команды + restorecon +. Ключ -v показывает изменение меток контекста:

restorecon -v /var/www/html/index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0

Если мы попытаемся получить доступ к странице сейчас, она снова покажет текст «Это тестовая веб-страница».

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

Контекстное наследование для файлов и каталогов

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

Таким образом, если у нас есть процесс с именем «proc_a», порождающий другой процесс с именем «proc_b», то этот процесс будет запущен в том же домене, что и «proc_a», если иное не указано политикой SELinux.

Аналогично, если у нас есть каталог с типом «some_context_t», любой файл или каталог, созданный в нем, будет иметь тот же тип контекста, если в политике не указано иное.

Чтобы проиллюстрировать это, давайте проверим контекст каталога + / var / www / +:

ls -Z /var/www

Каталог + html + в + / var / www / + имеет контекст типа * httpd_sys_content_t *. Как мы видели ранее, файл + index.html + внутри него имеет тот же контекст (то есть, контекст родителя):

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

Это наследство не сохраняется, когда файлы копируются в другое место. В операции копирования скопированный файл или каталог принимает контекст типа целевого расположения. В приведенном ниже фрагменте кода мы копируем файл + index.html + (с контекстом типа «httpd_sys_content_t») в каталог + / var / +:

cp /var/www/html/index.html /var/

Если мы проверим контекст скопированного файла, мы увидим, что он изменился на * var_t *, контекст его текущего родительского каталога:

ls -Z /var/index.html
-rwxr-xr-x. root root unconfined_u:object_r:var_t:s0   /var/index.html

Это изменение контекста может быть отменено предложением + - preserver = context + в команде + cp +.

Когда файлы или каталоги перемещаются, оригинальные контексты сохраняются. В следующей команде мы перемещаем + / var / index.html + в каталог + / etc / +:

mv  /var/index.html  /etc/

Когда мы проверяем контекст перемещенного файла, мы видим, что контекст * var_t * был сохранен в каталоге + / etc / +:

ls -Z /etc/index.html
-rwxr-xr-x. root root unconfined_u:object_r:var_t:s0   /etc/index.html

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

SELinux в действии: тестирование ошибки контекста файла

Во-первых, давайте создадим каталог с именем + www + в корневом каталоге. Мы также создадим папку с именами + html и` + www`.

mkdir -p /www/html

Если мы запустим команду + ls -Z +, мы увидим, что эти каталоги были созданы с контекстом * default_t *:

ls -Z /www/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 html

Затем мы копируем содержимое каталога + / var / www / html в` + / www / html`:

cp /var/www/html/index.html /www/html/

Скопированный файл будет иметь контекст * default_t *. Это контекст родительского каталога.

Теперь мы изменим файл + httpd.conf, чтобы он указывал на этот новый каталог в качестве корневой папки веб-сайта. Нам также придется ослабить права доступа к этому каталогу.

vi /etc/httpd/conf/httpd.conf

Сначала мы закомментируем существующее местоположение для корня документа и добавим новую директиву + DocumentRoot + в + / www / html +:

# DocumentRoot "/var/www/html"

DocumentRoot "/www/html"

Мы также закомментируем раздел прав доступа для существующего корня документа и добавим новый раздел:

#<Directory "/var/www">
#    AllowOverride None
   # Allow open access:
#    Require all granted
#</Directory>

<Directory "/www">
   AllowOverride None
   # Allow open access:
   Require all granted
</Directory>

Мы оставляем расположение каталога + cgi-bin + как есть. Мы не будем вдаваться в подробные настройки Apache здесь; мы просто хотим, чтобы наш сайт работал в целях SELinux.

Наконец, перезапустите демон httpd:

service httpd restart

После перезапуска сервера доступ к веб-странице вызовет ту же ошибку «403 Forbidden» (или страницу по умолчанию «Testing 123»), которую мы видели ранее.

Ошибка возникает из-за того, что содержимое файла + index.html изменилось во время операции копирования. Его необходимо изменить в исходный контекст (httpd_sys_content_t).

Но как мы это делаем?

Изменение и восстановление контекстов файлов SELinux

В предыдущем примере кода мы видели две команды для изменения содержимого файла: + chcon + и + restorecon +. Запуск + chcon + является временной мерой. Вы можете использовать его для временного изменения контекста файла или каталога для устранения ошибок отказа в доступе. Однако этот метод является только временным: файловая система переименовывается или запускает команду + restorecon +, чтобы вернуть файл в исходный контекст.

Кроме того, для запуска + chcon + требуется, чтобы вы знали правильный контекст для файла; флаг + - type + определяет контекст для цели. + restorecon + не нужно это указывать. Если вы запустите + restorecon +, к файлу будет применен правильный контекст, и изменения будут сделаны постоянными.

Но если вы не знаете правильный контекст файла, как система узнает, какой контекст применять при запуске + restorecon +?

Для удобства SELinux «запоминает» контекст каждого файла или каталога на сервере. В CentOS 7 контексты файлов, уже существующих в системе, перечислены в файле + / etc / selinux / target / contexts / files / file_contexts +. Это большой файл, в котором перечислены все типы файлов, связанные с каждым приложением, поддерживаемым дистрибутивом Linux. Контексты новых каталогов и файлов записываются в файл + / etc / selinux / target / contexts / files / file_contexts.local +. Поэтому, когда мы запускаем команду + restorecon +, SELinux ищет правильный контекст из одного из этих двух файлов и применяет его к цели.

Фрагмент кода ниже показывает выдержку из одного из файлов:

cat /etc/selinux/targeted/contexts/files/file_contexts
...
/usr/(.*/)?lib(/.*)?    system_u:object_r:lib_t:s0
/opt/(.*/)?man(/.*)?    system_u:object_r:man_t:s0
/dev/(misc/)?agpgart    -c      system_u:object_r:agp_device_t:s0
/usr/(.*/)?sbin(/.*)?   system_u:object_r:bin_t:s0
/opt/(.*/)?sbin(/.*)?   system_u:object_r:bin_t:s0
/etc/(open)?afs(/.*)?   system_u:object_r:afs_config_t:s0
...

Чтобы навсегда изменить контекст нашего файла index.html в + / www / html +, мы должны выполнить двухэтапный процесс.

  • Сначала мы запускаем команду + semanage fcontext +. Это запишет новый контекст в файл + / etc / selinux / target / contexts / files / file_contexts.local +. Но это не переименует файл сам. Мы сделаем это для обоих каталогов.

semanage fcontext --add --type httpd_sys_content_t "/www(/.*)?"
semanage fcontext --add --type httpd_sys_content_t "/www/html(/.*)?"

Чтобы убедиться, что мы можем проверить базу данных контекста файла (обратите внимание, что мы используем файл + file_contexts.local +):

cat /etc/selinux/targeted/contexts/files/file_contexts.local

Вы должны увидеть обновленные контексты:

# This file is auto-generated by libsemanage
# Do not edit directly.

/www(/.*)?    system_u:object_r:httpd_sys_content_t:s0
/www/html(/.*)?    system_u:object_r:httpd_sys_content_t:s0

Далее мы запустим команду + restorecon +. Это переназначит файл или каталог с тем, что было записано на предыдущем шаге:

restorecon -Rv /www

Это должно сбросить контекст на трех уровнях: каталог + / www + верхнего уровня, каталог + / www / html под ним и файл` + index.html` под + / www / html +:

restorecon reset /www context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /www/html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /www/html/index.html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0

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

Существует отличный инструмент под названием + matchpathcon +, который может помочь в устранении проблем, связанных с контекстом. Эта команда рассмотрит текущий контекст ресурса и сравнит его с тем, что указано в базе данных контекста SELinux. Если отличается, он предложит необходимые изменения. Давайте проверим это с файлом + / www / html / index.html +. Мы будем использовать флаг + -V +, который проверяет контекст:

matchpathcon -V /www/html/index.html

Выходные данные + matchpathcon + должны показывать, что контекст проверен.

/www/html/index.html verified.

Для неправильно помеченного файла в сообщении будет указан контекст:

/www/html/index.html has context unconfined_u:object_r:default_t:s0, should be system_u:object_r:httpd_sys_content_t:s0

Переход домена

До сих пор мы видели, как процессы обращаются к ресурсам файловой системы. Теперь посмотрим, как процессы получают доступ к другим процессам.

Domain transition - это метод, при котором процесс меняет свой контекст с одного домена на другой. Чтобы понять это, допустим, у вас есть процесс с именем proc_a, работающий в контексте contexta_t. При переходе домена proc_a может запускать приложение (программу или исполняемый скрипт) с именем app_x, которое может вызвать другой процесс. Этот новый процесс может называться proc_b, и он может выполняться в домене contextb_t. Таким образом, contexta_t transitioning для contextb_t через app_x. Исполняемый файл app_x работает как entrypoint для contextb_t. Поток может быть проиллюстрирован ниже:

изображение: https: //assets.digitalocean.com/articles/SELinuxCentOS7/4.jpg [Переход домена SELinux]

Случай перехода домена довольно распространен в SELinux. Давайте рассмотрим процесс vsftpd, работающий на нашем сервере. Если он не запущен, мы можем запустить команду + service vsftpd start +, чтобы запустить демон.

Далее мы рассмотрим процесс systemd. Это предок всех процессов. Это замена процесса инициализации System V и выполняется в контексте * init_t *. :

ps -eZ  | grep init
system_u:system_r:init_t:s0         1 ?        00:00:02 systemd
system_u:system_r:mdadm_t:s0      773 ?        00:00:00 iprinit

Процесс, выполняющийся в домене * init_t *, является недолговечным: он вызывает двоичный исполняемый файл + / usr / sbin / vsftpd +, который имеет контекст типа * ftpd_exec_t *. Когда двоичный исполняемый файл запускается, он становится самим демоном vsftpd и запускается в домене * ftpd_t *.

Мы можем проверить доменные контексты файлов и процессов:

ls -Z /usr/sbin/vsftpd

Показывает нам:

-rwxr-xr-x. root root system_u:object_r:ftpd_exec_t:s0 /usr/sbin/vsftpd

Проверка процесса:

ps -eZ | grep vsftpd

Показывает нам:

system_u:system_r:ftpd_t:s0-s0:c0.c1023 7708 ? 00:00:00 vsftpd

Итак, процесс, запущенный в домене * init_t *, выполняет двоичный файл с типом * ftpd_exec_t *. Этот файл запускает демон в домене * ftpd_t *.

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

Переход домена зависит от трех строгих правил:

  • Родительский процесс исходного домена должен иметь разрешение на выполнение для приложения, расположенного между обоими доменами (это entrypoint).

  • Контекст файла для приложения должен быть идентифицирован как entrypoint для целевого домена.

  • Исходный домен должен быть разрешен для перехода в целевой домен.

Взяв приведенный выше пример демона vsftpd, давайте запустим команду + sesearch + с различными ключами, чтобы проверить, соответствует ли демон этим трем правилам.

Во-первых, исходный домен init_t должен иметь разрешение на выполнение приложения точки входа с контекстом ftpd_exec_t. Так что, если мы запустим следующую команду:

sesearch -s init_t -t ftpd_exec_t -c file -p execute -Ad

Результат показывает, что процессы в домене init_t могут читать, получать атрибуты, выполнять и открывать файлы контекста ftpd_exec_t:

Found 1 semantic av rules:
  allow init_t ftpd_exec_t : file { read getattr execute open } ;

Далее мы проверяем, является ли двоичный файл точкой входа для целевого домена ftpd_t:

sesearch -s ftpd_t -t ftpd_exec_t -c file -p entrypoint -Ad

И действительно, это так:

Found 1 semantic av rules:
  allow ftpd_t ftpd_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;

И, наконец, исходный домен init_t должен иметь разрешение на переход в целевой домен ftpd_t:

sesearch -s init_t -t ftpd_t -c process -p transition -Ad

Как мы видим ниже, исходный домен имеет такое разрешение:

Found 1 semantic av rules:
  allow init_t ftpd_t : process transition ;

Неопределенные домены

Когда мы представили концепцию доменов, мы сравнили ее с гипотетическим пузырем вокруг процесса: тем, что определяет, что процесс может и не может делать. Это то, что ограничивает процесс.

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

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

Заключение

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

Related