Linux c улучшенной безопасностью (SELinux)

Linux c улучшенной безопасностью (SELinux)

Эта статья освещает основные принципы SELinux.


Режимы SELinux (getenforce, setenforce)


Текущий режим SELinux можно посмотреть, набрав команду getenforce или sestatus.

# getenforce
Enforcing
#
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 26
Policy from config file:        targeted
#

Режим может быть динамически сброшен командой setenforce.

# setenforce Permissive
# getenforce
Permissive
#

Допустимы следующие значения режима:
  • Enforcing : SELinux в режиме «предписания».
  • 1 : Эквивалент "Enforcing".
  • Permissive : SELinux в режиме «разрешения».
  • 0 : Эквивалент "Permissive".
Исправив параметр SELINUX в файле "/etc/selinux/config" вы сделаете режим постоянным. Файл содержит описания доступных режимов.
# cat /etc/selinux/config

# 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,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

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

Файл SELinux и контекст процесса

Конекст файла SELinux отображается, если вы выполните команду ls с флагом «-Z»
# touch test.txt
# ls -lZ test.txt
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 test.txt
#
Отображение контекста процесса SELinux возможно с использованием флага «-Z» команды ps.
# ps -efZ | grep httpd
system_u:system_r:httpd_t:s0    root      1781     1  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1805  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1806  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1807  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1810  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1811  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1812  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1815  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1816  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
system_u:system_r:httpd_t:s0    apache    1817  1781  0 19:12 ?        00:00:00 /usr/sbin/httpd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 2684 2476  0 20:02 pts/0 00:00:00 grep httpd
#

Восстановление контекста файлов по-умолчанию (semanage, restorecon)

Вместо того чтобы пытаться запомнить определённые команды SELinux, мы можем просто посмотреть man страницы для интересующего нас сервиса.
# man -k _selinux
abrt_selinux         (8)  - Security-Enhanced Linux Policy for the ABRT daemon
ftpd_selinux         (8)  - Security-Enhanced Linux policy for ftp daemons
git_selinux          (8)  - Security Enhanced Linux Policy for the Git daemon
httpd_selinux        (8)  - Security Enhanced Linux Policy for the httpd daemon
kerberos_selinux     (8)  - Security Enhanced Linux Policy for Kerberos
mysql_selinux        (8)  - Security-Enhanced Linux Policy for the MySQL daemon
named_selinux        (8)  - Security Enhanced Linux Policy for the Internet Name server (named) daemon
nfs_selinux          (8)  - Security Enhanced Linux Policy for NFS
pam_selinux          (8)  - PAM module to set the default security context
rsync_selinux        (8)  - Security Enhanced Linux Policy for the rsync daemon
samba_selinux        (8)  - Security Enhanced Linux Policy for Samba
squid_selinux        (8)  - Security-Enhanced Linux Policy for the squid daemon
ypbind_selinux       (8)  - Security Enhanced Linux Policy for NIS
#
Используя вывод последней команды мы можем посмотреть man страницу для «ftpd_selinux», которая даёт информацию относительно SELinux для FTP демона.
# man ftpd_selinux
В начале man страницы описаны команды для того чтобы дать FTP демону права читать и писать в директорию «/var/ftp».
# semanage fcontext -a -t public_content_t "/var/ftp(/.*)?"
# restorecon -F -R -v /var/ftp
Для Apache мы должны использовать что-то вроде этого:
# semanage fcontext -a -t httpd_sys_content_t "/var/www/htdocs(/.*)?"
# restorecon -F -R -v /var/www/htdocs
Команды semanage нет в системе по-умолчанию. Чтобы узнать как установить эту утилиту, можно воспользоваться следующей командой.
# yum provides /usr/sbin/semanage
Loaded plugins: refresh-packagekit, security

policycoreutils-python-2.0.83-19.18.el6.x86_64 : SELinux policy core python
                                               : utilities
Repo        : localrepo
Matched from:
Filename    : /usr/sbin/semanage

#
Установите необходимый пакет со всеми зависимостями.
# yum install policycoreutils-python
Теперь можно пользоваться командами, описанными выше.
# semanage fcontext -a -t public_content_t "/var/ftp(/.*)?"
# restorecon -F -R -v /var/ftp

Булевые параметры SELinux (getsebool, setsebool)

Политика SELinux настраивается булевыми флагами. Просмотреть возможные параметры можно с использованием команды getsebool. В моей инсталляции команда выводит 179 различных настроек.
# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
allow_console_login --> on
...
xguest_mount_media --> on
xguest_use_bluetooth --> on
xserver_object_manager --> off
#
Простейший способ идентифицировать необходимые параметры — это их фильтрация по конкретному термину.
# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
#
Если вы знаете название флага, вы можете запросить значение настройки непосредственно.
# getsebool allow_ftpd_anon_write
allow_ftpd_anon_write --> off
#
Команда semanage также может быть использована для получения информации о настройках. Она выводит информацию о настройках, которые используются сейчас, наряду с теми, что будут использоваться после перезагрузки.
# semanage boolean -l | grep ftp
ftp_home_dir                   (off  ,  off)  Allow ftp to read and write files in the user home directories
tftp_anon_write                (off  ,  off)  Allow tftp to modify public files used for public file transfer services.
allow_ftpd_full_access         (off  ,  off)  Allow ftp servers to login to local users and read/write all files on the
                                              system, governed by DAC.
allow_ftpd_use_nfs             (off  ,  off)  Allow ftp servers to use nfs used for public file transfer services.
allow_ftpd_anon_write          (off  ,  off)  Allow ftp servers to upload files,  used for public file transfer services.
                                              Directories must be labeled public_content_rw_t.
allow_ftpd_use_cifs            (off  ,  off)  Allow ftp servers to use cifs used for public file transfer services.
ftpd_connect_db                (off  ,  off)  Allow ftp servers to use connect to mysql database
httpd_enable_ftp_server        (off  ,  off)  Allow httpd to act as a FTP server by listening on the ftp port.
#
Булевые настройки редактируются с использованием команды setsebook. Без флага «-P» текущая настройка изменится, но значение не сохранится после перезагрузки.
# setsebool allow_ftpd_anon_write on
# semanage boolean -l | grep allow_ftpd_anon_write
allow_ftpd_anon_write          (on   ,  off)  Allow ftp servers to upload files,  used for public file transfer services.
                                              Directories must be labeled public_content_rw_t.
#
Использование флага «-P» делает настройку постоянной. Изменение может занять некоторое время, не паникуйте, ничего не повисло.
# setsebool -P allow_ftpd_anon_write on
# semanage boolean -l | grep allow_ftpd_anon_write
allow_ftpd_anon_write          (on   ,   on)  Allow ftp servers to upload files,  used for public file transfer services.
                                              Directories must be labeled public_content_rw_t.
#
# setsebool -P allow_ftpd_anon_write off
# semanage boolean -l | grep allow_ftpd_anon_write
allow_ftpd_anon_write          (off  ,  off)  Allow ftp servers to upload files,  used for public file transfer services.
                                              Directories must be labeled public_content_rw_t.
#

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

Простейший способ объяснить, как выполняется диагностика нарушений политик, это создать такое нарушение и зафиксировать его, это то, что мы сделаем на примере сервиса httpd. Создадим новый виртуальный хост с альтернативным location для хранения файлов сайта. Создайте новые директории для виртуального хоста «mysite.co.uk» и разместите файл в директории документов (document root).
# mkdir -p /www/mysite.co.uk/htdocs
# mkdir -p /www/mysite.co.uk/logs
# echo "This is a test." > /www/mysite.co.uk/htdocs/test.txt
Отредактируйте файл «/etc/httpd/conf/httpd.conf», добавьте в него определение виртуального хоста. Убедитесь, что пусти соответствуют созданным выше.
<VirtualHost *:80>
    ServerAdmin webmaster@mysite.co.uk
    DocumentRoot /www/mysite.co.uk/htdocs
    ServerName mysite.co.uk
    ErrorLog /www/mysite.co.uk/logs/error_log
    CustomLog /www/mysite.co.uk/logs/access_log common
</VirtualHost>
Попытка перезапуска приведёт к тому, что сервис вылетит с ошибкой.
# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [FAILED]
#
Файл «/var/log/httpd/error_log» — файл журнала ошибок сервиса httpd по-умолчанию. В файле появилось содержание, описывающее произошедшую ошибку.
[Tue Apr 24 20:50:59 2012] [notice] caught SIGTERM, shutting down
(13)Permission denied: httpd: could not open error log file /www/mysite.co.uk/logs/error_log.
Unable to open logs
Мы знаем, что location существует, то есть, возможно, это нарушение политик SELinux. Для того чтобы убедиться в этом проверим файл «/var/log/audit/audit.log». Вместо чтения всего файла мы можем перевести его с использованием команды audit2why (или audit2allow -w), мы получим объяснения для любых нарушений политик. 
# audit2why < /var/log/audit/audit.log
type=AVC msg=audit(1335296918.002:796): avc:  denied  { write } for  pid=4531 comm="httpd" name="logs" dev=dm-0 ino=654398
scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir

 Was caused by:
  Missing type enforcement (TE) allow rule.

  You can use audit2allow to generate a loadable module to allow this access.

#
Мы видим такое нарушение. Проверив директорию, убеждаемся, что контекст файлов не был изменён для сервиса httpd.
# cd /www
# ls -alZ
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 .
dr-xr-xr-x. root root system_u:object_r:root_t:s0      ..
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 mysite.co.uk
#
Восстанавливаем дефолтный контекст для этих директорий.
# semanage fcontext -a -t httpd_sys_content_t "/www/mysite.co.uk(/.*)?"
# restorecon -F -R -v /www/mysite.co.uk

# ls -alZ
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 .
dr-xr-xr-x. root root system_u:object_r:root_t:s0      ..
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 mysite.co.uk
#
Теперь сервис стартует, как и ожидалось.
# service httpd start
Starting httpd:                                            [  OK  ]
#
Вот что там ещё предлагают почитать:

Комментарии

Популярные сообщения