Назад | Перейти на главную страницу

Redhat Apache fast-cgi разрешения selinux

Моя установка apache запускает php как fastcgi, а виртуальный
хосты указывают на / home // public_html.
и fastcgi дома /
/cgi-bin/php.fcgi

настройка public_html с selinux была:

/usr/sbin/setsebool -P httpd_enable_homedirs 1  
chcon -R -t httpd_sys_content_t /home/someuser/public_html

Владелец и группа - это пользователь, например пользователь someuser:

ls -all /home/someuser/cgi-bin/

drwxr-xr-x 2 someuser someuser 4096 Sep  7 13:14 .  
drwx--x--x 6 someuser someuser 4096 Sep  6 18:17 ..  
-rwxr-xr-x 1 someuser someuser  308 Sep  7 13:14 php.fcgi  

ls -all /home/someuser/public_html/ | greep info.php  
-rw-r--r--  1 someuser someuser     24 Sep  3 16:24 info.php

Когда он посещает сайт, я получаю сообщение «Запрещено ...», а в журнале написано:

[Пт, 7 сентября, 12:02:51 2012] [ошибка] [клиент x.x.x.x] (13) В доступе отказано: доступ к /cgi-bin/php.fcgi/info.php запрещен

Мой selinux conf:

SELINUX=enforcing  
SELINUXTYPE=targeted  
SETLOCALDEFS=0

Итак, я убиваю Selinux (SELINUX = disabled), перезагружаю систему и все работает !!!!!

Проблема в Selinux, я не хочу отключать Selinux. Я безуспешно пробовал:

setsebool -P httpd_enable_cgi 1  
chcon -t httpd_sys_script_exec_t /home/someuser/cgi-bin/php.fcgi  
chcon -R -t httpd_sys_content_t /home/someuser/cgi-bin

А может лучше поменять Селинукс
SELINUX = принудительное использование SELINUX = разрешающее

И отключить selinux для httpd?
(Думаю, лучше найду правильную конфигурацию)

Спасибо за любое предложение по этому поводу


Моя среда:

Red Hat Enterprise Linux Server версии 5.8 (Tikanga)

Версия сервера: Apache / 2.2.3

PHP 5.1.6 (cli) (построено: 22 июня 2012 06:20:25) Авторские права (c) 1997-2006 PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

Некоторые журналы:

ps -ZC httpd

LABEL                             PID TTY          TIME CMD 
system_u:system_r:httpd_t        2822 ?        00:00:00 httpd 
system_u:system_r:httpd_t        2823 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2824 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2825 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2826 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2836 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2837 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2838 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2839 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2840 ?        00:00:00 httpd

 getsebool -a | grep httpd  

allow_httpd_anon_write --> off  
allow_httpd_bugzilla_script_anon_write --> off  
allow_httpd_cvs_script_anon_write --> off  
allow_httpd_mod_auth_pam --> off  
allow_httpd_nagios_script_anon_write --> off  
allow_httpd_prewikka_script_anon_write --> off  
allow_httpd_squid_script_anon_write --> off  
allow_httpd_sys_script_anon_write --> off  
httpd_builtin_scripting --> on  
httpd_can_network_connect --> off  
httpd_can_network_connect_db --> off  
httpd_can_network_relay --> off  
httpd_can_sendmail --> on  
httpd_disable_trans --> off  
httpd_enable_cgi --> on  
httpd_enable_ftp_server --> off  
httpd_enable_homedirs --> on  
httpd_execmem --> off  
httpd_read_user_content --> off  
httpd_rotatelogs_disable_trans --> off  
httpd_setrlimit --> off  
httpd_ssi_exec --> off  
httpd_suexec_disable_trans --> off  
httpd_tty_comm --> on  
httpd_unified --> on  
httpd_use_cifs --> off  
httpd_use_nfs --> off

Есть журнал аудита

/var/log/audit/audit.log

type = SYSCALL msg = audit (1345834208.027: 963): arch = c000003e syscall = 4 success = no exit = -13 a0 = 2aaf1543e390 a1 = 7fff393c9510 a2 = 7fff393c9510 a3 = 2aaf1543bd58 items = 0 ppid = 27519 pid = 27519 pid = 27519 pid = 27519 pid = 27519 pid = 48 gid = 48 euid = 48 suid = 48 fsuid = 48 egid = 48 sgid = 48 fsgid = 48 tty = (none) ses = 4 comm = "httpd" exe = "/ usr / sbin / httpd" subj = user_u: system_r: httpd_t: s0 key = (ноль)
type = AVC msg = audit (1345834208.027: 964): avc: denied {getattr} for pid = 27523 comm = "httpd" path = "/ home / loemsera / public_html / index.php" dev = sda2 ino = 4593912 scontext = user_u : system_r: httpd_t: s0 tcontext = user_u: object_r: user_home_t: s0 tclass = file
type = SYSCALL msg = audit (1345834208.027: 964): arch = c000003e syscall = 6 success = no exit = -13 a0 = 2aaf1543e470 a1 = 7fff393c9510 a2 = 7fff393c9510 a3 = 0 items = 0 ppid = 27519 pid = 27523 uid = 48 gid = 48 euid = 48 suid = 48 fsuid = 48 egid = 48 sgid = 48 fsgid = 48 tty = (none) ses = 4 comm = "httpd" exe = "/ usr / sbin / httpd" subj = user_u: system_r: httpd_t: s0 key = (ноль)
type = AVC msg = audit (1345834208.028: 965): avc: denied {getattr} for pid = 27523 comm = "httpd" path = "/ home / loemsera / public_html / index.php" dev = sda2 ino = 4593912 scontext = user_u : system_r: httpd_t: s0 tcontext = user_u: object_r: user_home_t: s0 tclass = file

Запуск FastCGI по-своему оставляет большую дыру в безопасности: интерпретатор PHP запускается от имени пользователя «httpd» (по крайней мере, я ничего не вижу здесь о suexec).

У нас есть рабочая настройка с SELinux и PHP как FastCGI здесь, в CentOS 6, но это было действительно сложно заставить все работать.

Несколько советов для начала:

  • вам не нужно перезагружаться, чтобы отключить / включить selinux - просто используйте команду "setenforce 0" или "setenforce 1" :)
  • всегда старайтесь, чтобы все работало с SELinux отключен, затем включите его и посмотрите audit.log

Вот так:

  • включить suexec
  • измените тип SELinux для php.fcgi на httpd_fastcgi_script_exec_t
  • ваш стартер FastCGI (php.fcgi) не должен быть доступен для записи пользователю, владеющему им (в противном случае он может настроить многие параметры и ограничения). Присвойте ему флаг «неизменяемость»: chattr +i php.fcgi
  • suexec имеет некоторые проблемы с FastCGI, поэтому мы должны сделать его разрешающим:

    yum install policycoreutils-python
    semanage permissive -a httpd_suexec_t
    

Удачи!