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 ] #
Вот что там ещё предлагают почитать:
Комментарии
Отправить комментарий