Настройка на сервере подсистемы безопасности SElinux позволяет увеличить безопасность обслуживаемой системы. Небольшой абзац по поводу "А что такое SELinux?", а так же ссылки на документацию можно найти по ссылке CentOS, KVM, SELinux. Здесь я повторяться. Практически никаких трудностей с настройкой нет, хотя если Вы не разбираетесь в вопросе, настройка может занять существенное время.
Первое на что я хотел бы обратить внимание - это на то что подсистема должна быть включена. Для этого проверьте файл /etc/selinux/config. Убедитесь, что для SELINUX установлено значение enforcing, а для SELINUXTYPE - targeted. Значение permissive вместо enforcing заставляет подситему selinux лишь слать предупреждения, но не запрещать действия (такой режим хорош для обучения и отладки).
Ниже я просто приведу схему (шаг за шагом) как я настраиваю selinux на для своих заказчиков.
Для начала нужно обратить своё внимание на значения sebooleans. Поглядеть список можно так # semanage boolean -l. Этот инструмент предоставляет простые "переключатели", с помощью которых можно включить или выключить ту или иную возможность.
Для sql-сервера и http-сервера я использую следующие значения:
или одной строкой
Чтобы разрешить ftp-серверу читать домашние каталоги пользователей (обычно это нужно если вы даёте пользователям ftp):
Для httpd который читает из домашних каталогов пользователей нужно следующее
1) (обязательно) проверьте что у /home контекст установлен в home_root_t (не следует монтировать /home с опцией context="system_u:object_r:home_root_t:s0" потому что все файлы и каталоги в смонтированной директории будут с таким контекстом, а это не то что нам нужно). Восстановить контекст по-умолчанию (который нам собственно и нужен) можно с помощью команды # restorecon -RFv /home.
2) (обязательно) либо
либо
В мане так же говорят сделать так: 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 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-контекстом guest_u:
Добавить пользователя apache в группу groupname:
Чтобы httpd мог читать контент из произвольного каталога (не нужно, если включено httpd_read_user_content и контент находится в ~/public_html):
Если включён 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:
Замечание. Почему-то иногда не срабатывает 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 и всё будет ок, а то иначе не получается", цитата
На рабочем http-сервере обычно у меня пользователь владелец файлов (пусть его имя fow) имеет основную группу с тем же именем что и имя пользователя (fow). Этот пользователь имеет selinux-контекст guest_u (самый ограниченный). Файлы для веб-сервера хранятся в каталогах ~/public_html и ~/htlib (в htlib храняться файлы, которые не должны быть доступны по веб, но веб-сервер должен иметь возможность их читать, например, файлы шаблонизатора smarty). Каталог htlib имеет тип httpd_user_content_t . Пользователь httpd добавлен в группу fow и доступные веб-серверу для записи каталоги имеют права 770, а файлы 660. Доступные веб-серверу для чтения файлы и каталоги имеют права 640 и 750 соответственно.
Для того чтобы правила применялись ко всем вложенным файлам и папкам когда делается restorecon, нужно делать так (именно это решение я использую на рабочем сервере):
Замечание. Когда добавляешь 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>>. не знаю что это значит наверняка, но судя по виду имеется ввиду что не нужно выставлять контекст для файлов в данном каталоге.
На этом у меня всё. Спасибо за внимание.
Первое на что я хотел бы обратить внимание - это на то что подсистема должна быть включена. Для этого проверьте файл /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 и ~/htlib (в htlib храняться файлы, которые не должны быть доступны по веб, но веб-сервер должен иметь возможность их читать, например, файлы шаблонизатора 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>>. не знаю что это значит наверняка, но судя по виду имеется ввиду что не нужно выставлять контекст для файлов в данном каталоге.
На этом у меня всё. Спасибо за внимание.
Подскажите, какое надо правило включить, чтобы ушла ошибка
ОтветитьУдалитьWarning: mysql_connect(): Can't connect to MySQL server on '127.0.0.1' ???
Если selinux времеено отключить, то к сайту подключяюсь нормально.