запросить rpm из apache+php с помощью selinux

У меня есть php-скрипт, который работает на сервере apache при установке RHEL5. Этот скрипт запускает exec для "rpm -q --info packagename".

Дело в том, что он корректно работает с selinux в разрешительном режиме, а не в полностью включенном. Поэтому я предполагаю, что это проблема selinux.

Я начал с audit2allow для создания правил на основе найденных отклоненных записей, но теперь в журналах аудита больше нет отклонений, но он по-прежнему не работает с включенным selinux.

В моем мире кажется, что он запрашивает систему, разрешено ли ей работать, и когда selinux говорит: «Если вы попробуете это, я вас остановлю». Таким образом, система не запускает exec. Если бы это было так, я предполагаю, что получил бы «отказ», на основе которого я мог бы создать новое правило selinux. С selinux в разрешении мне тоже не отказывают, но это работает.

Так что, похоже, мне придется столкнуться с этим трудным путем и создать собственное правило для selinux. Сказано и сделано, я сделал один:

module php_rpm 1.0;

require {
    type httpd_t;
    type bin_t;
    type rpm_exec_t;
    type rpm_var_lib_t;
    class file { execute execute_no_trans getattr read execmod };
    class dir { getattr search };
}

#============= httpd_t ==============
allow httpd_t rpm_exec_t:file { execute execute_no_trans getattr read execmod };
allow httpd_t rpm_var_lib_t:dir { getattr search };

К сожалению, это никак не повлияло на мою проблему, но, предположительно, немного испортило мои правила selinux: P

Кто-нибудь пытался запустить rpm из php с включенным selinux и вышел сухим из воды?


person S the Novice    schedule 12.09.2012    source источник


Ответы (1)


Я нашел способ ее решить. Возможно, не лучший способ, но он немного в пути.

Причина, по которой мой audit2allow не работал, заключалась в том, что не все сообщения отображались в журнале аудита. Я активировал его, чтобы показать все журналы, как только прочитал это: http://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3028826

Как только я получил больше сообщений об отказе в журналах, я смог выяснить, что нужно сделать, чтобы заставить его работать.

Окончательный te-файл выглядит так:

module php_rpm 1.0;

require {
    type selinux_config_t;
    type httpd_script_exec_t;
    type security_t;
    type httpd_t;
    type rpm_exec_t;
    type rpm_var_lib_t;
    class dir { search getattr };
    class file { getattr read execute_no_trans execute lock };
}

#============= httpd_t ==============
allow httpd_t httpd_script_exec_t:file { read getattr execute_no_trans };
allow httpd_t rpm_exec_t:file { read getattr execute_no_trans execute };
allow httpd_t rpm_var_lib_t:dir { getattr search };
allow httpd_t rpm_var_lib_t:file { read getattr lock };
allow httpd_t security_t:dir search;
allow httpd_t security_t:file read;
allow httpd_t selinux_config_t:dir search;
allow httpd_t selinux_config_t:file { read getattr };

У меня такое чувство, что здесь немного открыта дверь, так что я все же попытаюсь как-то затянуть это. Но правила SELINUX не были здесь моей главной заботой, они второстепенны.

Если у кого-то есть лучшее предложение, может быть, более конкретное правило для этого, пожалуйста, поделитесь им!

person S the Novice    schedule 13.09.2012