воскресенье, 20 мая 2012 г.

CentOS 6.2, SElinux, httpd, mysql. Настройка

Настройка на сервере подсистемы безопасности SElinux позволяет увеличить безопасность обслуживаемой системы. Небольшой абзац по поводу "А что такое SELinux?", а так же ссылки на документацию можно найти по ссылке CentOS, KVM, SELinux. Здесь я повторяться. Практически никаких трудностей с настройкой нет, хотя если Вы не разбираетесь в вопросе, настройка может занять существенное время.

Первое на что я хотел бы обратить внимание - это на то что подсистема должна быть включена. Для этого проверьте файл /etc/selinux/config. Убедитесь, что для SELINUX установлено значение enforcing, а для SELINUXTYPE - targeted. Значение permissive вместо enforcing заставляет подситему selinux лишь слать предупреждения, но не запрещать действия (такой режим хорош для обучения и отладки).

Ниже я просто приведу схему (шаг за шагом) как я настраиваю selinux на для своих заказчиков.


Для начала нужно обратить своё внимание на значения sebooleans. Поглядеть список можно так # semanage boolean -l. Этот инструмент предоставляет простые "переключатели", с помощью которых можно включить или выключить ту или иную возможность.

Для sql-сервера и http-сервера я использую следующие значения:

setsebool -P secure_mode on
setsebool -P allow_execmem off
setsebool -P allow_execmod off (?)
setsebool -P allow_user_exec_content off (?)

или одной строкой

setsebool -P secure_mode=on allow_execmem=off allow_execmod=off allow_user_exec_content=off


Чтобы разрешить ftp-серверу читать домашние каталоги пользователей (обычно это нужно если вы даёте пользователям ftp):

setsebool -P ftp_home_dir on

Для httpd который читает из домашних каталогов пользователей нужно следующее

1) (обязательно) проверьте что у /home контекст установлен в home_root_t (не следует монтировать /home с опцией context="system_u:object_r:home_root_t:s0" потому что все файлы и каталоги в смонтированной директории будут с таким контекстом, а это не то что нам нужно). Восстановить контекст по-умолчанию (который нам собственно и нужен) можно с помощью команды # restorecon -RFv /home.

2) (обязательно) либо

setsebool -P httpd_read_user_content on

либо

setsebool -P httpd_enable_homedirs on

В мане так же говорят сделать так: chcon -R -t httpd_sys_content_t ~/public_html, но у меня и без этого всё работает. Надо думать дело тут в том что нужный контекст для каталога ~/public_html уже определён (его нужно лишь восстановить с помощью restorecon сразу после создания каталога public_html). Так что если Вы каталог назовёте по-другому, вам вероятно всё-таки придётся определить контекст для него. Я из двух альтернатив предпочёл httpd_read_user_content on.

В чём разница между решениями? Нашёл лишь на форуме федоры что httpd_enable_homedirs относиться к mod_userdir (что вполне соотвествует названию), поэтому, скорее всего видимо надо использовать httpd_read_user_content для моего случая (я не использую mod_userdir).
 
3) (по необходимости)

setsebool -P httpd_tty_comm off
setsebool -P httpd_enable_cgi off
setsebool -P httpd_can_sendmail on


setsebool -P httpd_can_network_connect_db on

Или одной строкой -

setsebool -P httpd_tty_comm=off httpd_enable_cgi=off httpd_can_sendmail=on httpd_can_network_connect=on

так же есть опция httpd_can_network_connect - она более общая нежели http_can_network_connect_db. Что нужно использовать зависит от вашей ситуации. Если нужно посылать куда-то данные из php (например, вордпресс использует ftp для обновления), то нужно не забыть включить httpd_can_network_connect.


4) Пользователи/группы для httpd. Возможность записи в каталог.

Поглядеть доступные роли можно так: semanage login -l.

Добавить существующему пользователю контекст selinux user_u: 
 
semanage login -a -s user_u newuser

Добавить нового пользователя с selinux-контекстом guest_u:

useradd -Z guest_u -U -m uname

Добавить пользователя apache в группу groupname:


usermod -aG groupname apache

Чтобы httpd мог читать контент из произвольного каталога (не нужно, если включено httpd_read_user_content и контент находится в ~/public_html):

semanage fcontext -a -t httpd_sys_content_t /www

Если включён httpd_read_user_content, то /home/*/public_html/ имеет тип httpd_user_content_t (только не забудьте restorecon), поэтому apache может читать файлы в ~/public_html без дополнительных разрешений (не забудьте убедиться что apache имеет доступ к ~/public_html на уровне DAC - т.е. что с обычными правами всё в порядке).


5) Чтобы httpd имел право записи в произвольный каталог (н-р, /home/uname/public_html/rw), рассматриваемый каталог должен иметь тип httpd_sys_rw_content_t:

semanage fcontext -a -t httpd_sys_rw_content_t /home/uname/public_html/rw

Замечание. Почему-то иногда не срабатывает restorecon -Rv /home/uname/public_html/ , а срабатывает restorecon -FRv /home/uname/public_html/ (добавлена опция F). Объяснения этому факту я не нашёл (ман читал), а нашёл только вот это: http://www.redhat.com/archives/fedora-selinux-list/2009-February/msg00124.html - там по ссылке говориться вроде "ну иногда надо делать -F и всё будет ок, а то иначе не получается", цитата

> > I'd do a "restorecon -RF /home" to fix that, then put back the
> > contexts on your share areas as you wanted them (e.g. samba_share_t
> > or public_content_rw_t etc.).
> 
> When should restorecon -F be used? I read the man page but can't
> figure out how it is different to just running restorecon without -F.

Using -F also fixes up the user part of the context and restores the
contexts of files that have been changed to customizable types e.g.
some of the httpd_* types, so it's sometimes necessary to use -F to fix
those.

На рабочем http-сервере обычно у меня пользователь владелец файлов (пусть его имя fow) имеет основную группу с тем же именем что и имя пользователя (fow). Этот пользователь имеет selinux-контекст guest_u (самый ограниченный). Файлы для веб-сервера хранятся в каталогах ~/public_html и ~/htlibhtlib храняться файлы, которые не должны быть доступны по веб, но веб-сервер должен иметь возможность их читать, например, файлы шаблонизатора smarty). Каталог htlib имеет тип httpd_user_content_t . Пользователь httpd добавлен в группу fow и доступные веб-серверу для записи каталоги имеют права 770, а файлы 660. Доступные веб-серверу для чтения файлы и каталоги имеют права 640 и 750 соответственно.

Для того чтобы правила применялись ко всем вложенным файлам и папкам когда делается restorecon, нужно делать так (именно это решение я использую на рабочем сервере):

semanage fcontext -a -t httpd_sys_rw_content_t "/home/uname/public_html/rw(/.*)?"
restorecon -FRv  /home/uname/public_html/rw

Замечание. Когда добавляешь semanage fcontext -a -t lost_found_t "/var/lib/php/session/lost\+found" , надо писать именно так (слеш перед знаком плюс и кавычки) иначе данное правило не работает (как я понимаю система рассматривает правило как регулярное выражение). Ещё замечание по lost+found: не нужно делать "/var/lib/php/session/lost+found(/.*)?" . По крайней мере в редхэтовских файлах конфигурации (/etc/selinux...) для файлов в директории lost+found стоит тип <<none>>. не знаю что это значит наверняка, но судя по виду имеется ввиду что не нужно выставлять контекст для файлов в данном каталоге.

На этом у меня всё. Спасибо за внимание.

1 комментарий:

  1. Подскажите, какое надо правило включить, чтобы ушла ошибка
    Warning: mysql_connect(): Can't connect to MySQL server on '127.0.0.1' ???
    Если selinux времеено отключить, то к сайту подключяюсь нормально.

    ОтветитьУдалить