Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Серверы Linux. Часть VII. Система контроля доступа SELinux

Оригинал: Introduction to SELinux
Автор: Paul Cobbaut
Дата публикации: 24 мая 2015 г.
Перевод: A.Панин
Дата перевода: 15 июля 2015 г.

Глава 19. Знакомство с системой контроля доступа SELinux

19.18. Расширенные атрибуты файлов

Расширенные атрибуты файлов используются SELinux для хранения контекстов безопасности. Эти атрибуты могут быть исследованы с помощью утилиты ls в процессе функционирования SELinux.

[root@RHEL5 home]# ls --context 
drwx------  paul paul system_u:object_r:user_home_dir_t paul
drwxr-xr-x  root root user_u:object_r:user_home_dir_t  project42
drwxr-xr-x  root root user_u:object_r:user_home_dir_t  project55
[root@RHEL5 home]# ls -Z
drwx------  paul paul system_u:object_r:user_home_dir_t paul
drwxr-xr-x  root root user_u:object_r:user_home_dir_t  project42
drwxr-xr-x  root root user_u:object_r:user_home_dir_t  project55
[root@RHEL5 home]#

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

[root@RHEL5 etc]# getfattr -m . -d hosts
# file: hosts
security.selinux="system_u:object_r:etc_t:s0\000"

19.19. Контекст безопасности процесса

Для просмотра контекстов безопасности SELinux отдельных процессов в утилиту ps была добавлена поддержка нового параметра.

[root@RHEL5 etc]# ps -ZC mingetty
LABEL                             PID TTY          TIME CMD
system_u:system_r:getty_t        2941 tty1     00:00:00 mingetty
system_u:system_r:getty_t        2942 tty2     00:00:00 mingetty

19.20. Утилита chcon

Используйте утилиту chcon для изменения контекстов безопасности SELinux.

В данном примере показана методика использования утилиты chcon для изменения типа файла.

[root@rhel55 ~]# ls -Z /var/www/html/test42.txt 
-rw-r--r--  root root user_u:object_r:httpd_sys_content_t /var/www/html/test4\
2.txt
[root@rhel55 ~]# chcon -t samba_share_t /var/www/html/test42.txt 
[root@rhel55 ~]# ls -Z /var/www/html/test42.txt 
-rw-r--r--  root root user_u:object_r:samba_share_t    /var/www/html/test42.txt

Ознакомьтесь со страницей руководства man chcon.

19.21. Пример

В отношении веб-сервера Apache 2 по умолчанию используется политика целевого ограничения доступа к ресурсам SELinux (targeted). В следующем примере показано, что любой файл, созданный в директории /var/www/html, будет по умолчанию получать тип httpd_sys_content_t.

[root@centos65 ~]# touch /var/www/html/test42.txt
[root@centos65 ~]# ls -Z /var/www/html/test42.txt
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/h\
tml/test42.txt

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

[root@centos65 ~]# touch /root/test42.txt
[root@centos65 ~]# ls -Z /root/test42.txt 
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/test42.txt

Убедитесь в том, что служба веб-сервера Apache 2 исполняется.

[root@centos65 ~]# service httpd restart 
Stopping httpd:                                            [  OK  ]
Starting httpd:

Сработает ли следующая команда? Да, сработает.

[root@centos65 ~]# wget http://localhost/test42.txt
--2014-04-12 20:56:47--  http://localhost/test42.txt
Распознаётся localhost... ::1, 127.0.0.1
Подключение к localhost|::1|:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 0 [text/plain]
Сохранение в:  test42.txt 
...

Почему же она работает? Потому, что процессы веб-сервера Apache 2 исполняются в домене httpd_t, а файлы из директории /var/www/html имеют тип httpd_sys_content_t.

[root@centos65 ~]# ps -ZC httpd | head -4
LABEL                             PID TTY          TIME CMD
unconfined_u:system_r:httpd_t:s0 1666 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 1668 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 1669 ?        00:00:00 httpd

Теперь давайте переведем SELinux в режим принудительного использования политик ограничения доступа (Enforcing) и изменим тип рассматриваемого файла.

[root@centos65 ~]# chcon -t samba_share_t /var/www/html/test42.txt 
[root@centos65 ~]# ls -Z /var/www/html/test42.txt 
-rw-r--r--. root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/t\
est42.txt
[root@centos65 ~]# setenforce 1
[root@centos65 ~]# getenforce 
Enforcing

Теперь возможны два варианта: либо сервер будет корректно функционировать, либо сервер не сможет получить доступ к файлу. Сервер корректно функционирует при использовании SELinux в разрешающем режиме (Permissive), но не может получить доступа к файлу в режиме принудительного использования политик ограничения доступа (Enforcing).

[root@centos65 ~]# wget http://localhost/test42.txt
--2014-04-12 21:05:02--  http://localhost/test42.txt
Распознаётся localhost... ::1, 127.0.0.1
Подключение к localhost|::1|:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 403 Forbidden
2014-04-12 21:05:02 ОШИБКА 403: Forbidden.

После этого вы сможете обнаружить в файле журнала сложное сообщение...

[root@centos65 ~]# tail -3 /var/log/audit/audit.log 
type=SYSCALL msg=audit(1398200702.803:64): arch=c000003e syscall=4 succ\
ess=no exit=-13 a0=7f5fbc334d70 a1=7fff553b4f10 a2=7fff553b4f10 a3=0 it\
ems=0 ppid=1666 pid=1673 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=4\
8 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin\
/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1398200702.804:65): avc:  denied  { getattr } for  p\
id=1673 comm="httpd" path="/var/www/html/test42.txt" dev=dm-0 ino=26324\
1 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:objec\
t_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1398200702.804:65): arch=c000003e syscall=6 succ\
ess=no exit=-13 a0=7f5fbc334e40 a1=7fff553b4f10 a2=7fff553b4f10 a3=1 it\
ems=0 ppid=1666 pid=1673 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=4\
8 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin\
/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

А в файле системного журнала /var/log/messages не будет никаких сообщений о неудачной загрузке файла.

19.22. Приложение setroubleshoot

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

[root@centos65 ~]# yum -y install setroubleshoot setroubleshoot-server

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

После перезагрузки системы, перезапуска службы сервера httpd, повторной активации режима принудительного использования политик ограничения доступа SELinux попробуем снова воспользоваться утилитой wget для загрузки файла... который снова не будет передан сервером (из-за огрничений SELinux).

[root@centos65 ~]# service httpd restart
Stopping httpd:                                         [FAILED]
Starting httpd:                                         [  OK  ]
[root@centos65 ~]# getenforce 
Permissive
[root@centos65 ~]# setenforce  1
[root@centos65 ~]# getenforce 
Enforcing
[root@centos65 ~]# wget http://localhost/test42.txt
--2014-04-12 21:44:13--  http://localhost/test42.txt
Распознаётся localhost... ::1, 127.0.0.1
Подключение к localhost|::1|:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 403 Forbidden
2014-04-12 21:44:13 ОШИБКА 403: Forbidden.

Файл журнала из директории /var/log/audit/ будет все так же бесполезен, но в этот раз следует обратить особое внимание на файл системного журнала /var/log/messages.

[root@centos65 ~]# tail -2 /var/log/messages
Apr 12 21:44:16  centos65  setroubleshoot: SELinux is preventing /usr/sbin/h\
ttpd from getattr access on the file /var/www/html/test42.txt. For complete \
SELinux messages. run sealert -l b2a84386-54c1-4344-96fb-dcf969776696
Apr 12 21:44:16  centos65  setroubleshoot: SELinux is preventing /usr/sbin/h\
ttpd from getattr access on the file /var/www/html/test42.txt. For complete \
SELinux messages. run sealert -l b2a84386-54c1-4344-96fb-dcf969776696

Воспользуемся приведенной в системном журнале командой...

[root@centos65 ~]# sealert -l b2a84386-54c1-4344-96fb-dcf969776696
SELinux is preventing /usr/sbin/httpd from getattr access on the file /va\
r/www/html/test42.txt.

*****  Plugin restorecon (92.2 confidence) suggests  *********************

If you want to fix the label. 
/var/www/html/test42.txt default label should be httpd_sys_content_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/www/html/test42.txt
...

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

[root@centos65 ~]# /sbin/restorecon -v /var/www/html/test42.txt
/sbin/restorecon reset /var/www/html/test42.txt context unconfined_u:objec\
t_r:samba_share_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[root@centos65 ~]# wget http://localhost/test42.txt
--2014-04-12 21:54:03--  http://localhost/test42.txt
Распознаётся localhost... ::1, 127.0.0.1
Подключение к localhost|::1|:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK

Все работает!

19.23. Логические значения

Логические значения по своей сути являются переключателями, регулирующими ограничения политики доступа (on - ограничение активировано, off - деактивировано).

[root@centos65 ~]# getsebool -a | head
abrt_anon_write --> off
abrt_handle_event --> off
allow_console_login --> on
allow_cvs_read_shadow --> off
allow_daemons_dump_core --> on
allow_daemons_use_tcp_wrapper --> off
allow_daemons_use_tty --> on
allow_domain_fd_use --> on
allow_execheap --> off
allow_execmem --> on

Вы можете устанавливать и получать отдельные логические значения.

[root@centos65 ~]# setsebool httpd_read_user_content=1
[root@centos65 ~]# getsebool httpd_read_user_content
httpd_read_user_content --> on
[root@centos65 ~]# setsebool httpd_enable_homedirs=1
[root@centos65 ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on

Вы можете устанавливать эти логические значения на постоянной основе.

[root@centos65 ~]# setsebool -P httpd_enable_homedirs=1
[root@centos65 ~]# setsebool -P httpd_read_user_content=1

В результате использования данных команд осуществляется повторная генерация файла описания логических значений из директории /etc/selinux/targeted (именно поэтому в файле присутствует комментарий о нежелательности его непосредственного редактирования)!

[root@centos65 ~]# cat /etc/selinux/targeted/modules/active/booleans.local 
# This file is auto-generated by libsemanage
# Do not edit directly.

httpd_enable_homedirs=1
httpd_read_user_content=1

Предыдущий раздел: Оглавление Следующий раздел:
19.12. Виртуальная файловая система /selinux   Глава 20. Система контроля версий git