2

我有一个在 RHEL5 安装上的 apache 服务器中运行的 php 脚本。此脚本在“rpm -q --info packagename”上运行 exec。

问题是它在许可模式下与 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

有没有人尝试在启用 selinux 的情况下从 php 执行 rpm 并侥幸逃脱?

4

1 回答 1

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 规则并不是我主要关心的问题,而是次要的。

如果有人有更好的建议,也许是更具体的规则,请随时分享!

于 2012-09-13T07:51:50.087 回答