这是因为 httpd_sys_script_t 没有读取/写入 pty 的 selinux 权限,但以下 selinux 策略将允许它:
policy_module(httpd_pty,1.0)
require {
type httpd_sys_cript_t;
type ptmx_t;
class chr_file { read write };
}
allow httpd_sys_script_t ptmx_t:chr_file { read write };
您也许可以更改为class chr_file rw_chr_file_perms;
, and allow httpd_sys_script_t ptmx_t:chr_file rw_chr_file_perms;
,具体取决于您的 selinux 策略的最新版本。上面的宏适用于 rhel5,这一行的宏适用于 rhel6。
或者,来自 #selinux on freenode 的建议:
mkdir ~/myhttpd
cd ~/myhttpd
echo "policy_module(myhttpd,1.0.0) optional_policy(\` apache_content_template(myscript)')" > myhttpd.te
echo "/home/httpd/foo/cgi-bin/test.pl -- gen_context(system_u:object_r:httpd_myscript_script_exec_t,s0)" > myhttpd.fc
make -f /usr/share/selinux/devel/Makefile myhttpd.pp
sudo semodule -i myhttpd.pp
基本上,apache 策略有一种方法来创建您自己的内容类型。在上面的代码片段中为您的脚本创建内容类型。然后使用新的 avc 拒绝并添加到上面的策略文件 myhttpd.te 中。这将阻止您允许所有 httpd 进程访问 pty,仅访问您指定的进程。之后您可能会执行以下操作:
allow httpd_myscript_script_t ptmx_t:chr_file rw_chr_file_perms;
添加到 myhttpd.te (或任何您想要调用的模块)的末尾,然后重新编译和加载(上面的 make 和 semodule )。