我有一个php脚本,它在RHEL5安装的apache服务器中运行。这个脚本在"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并侥幸逃脱?
我确实找到了解决它的方法。也许不是最好的方法,但有点麻烦。
我的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规则不是我主要关心的问题,但它是次要的。
如果有人有更好的建议,也许有更具体的规则,请随时分享!