我正在尝试在运行 Apache 2.2.15 和 Perl 5.10.1 并连接到远程 Oracle 数据库的 Red Hat Enterprise Linux 6.2 Web 服务器上配置 SELinux。Oracle 11.2g 客户端已安装。访问 Oracle 的 PHP 脚本正在运行,但 Perl 脚本却无法运行。当 SELinux 强制执行并且我尝试通过 Web 浏览器访问 Perl 脚本时,Apache 的错误日志显示以下消息:
Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.
奇怪的是,审计日志没有记录任何相应的消息。但是,当我运行将 SELinux 设置为宽容模式时,Perl 脚本运行正常。
这是 libclntsh.so.11.1 上的 ls -lZ 的输出:
-rwxr-xr-x. oracle oracle system_u:object_r:textrel_shlib_t:s0 /path/to/oracle/product/11.2.0/client/lib/libclntsh.so.11.1
有人有什么建议可以解决这个问题吗?我希望能够使用 SELinux 运行 Web 服务器。
更新:将 selinux 设置为 dontaudit 后,我在 audit.log 中得到了更多输出。但是,我使用 audit2allow 创建的模块未安装。输出为semodule -i
: semodule: Failed on cgi_oracle!
cgi_oracle.te
包含:
module cgi_oracle 1.0;
require {
type httpd_log_t;
type httpd_t;
type httpd_sys_script_t;
class process { siginh noatsecure rlimitinh };
class file { read write };
}
#============= httpd_sys_script_t ==============
allow httpd_sys_script_t httpd_log_t:file { read write };
#============= httpd_t ==============
allow httpd_t httpd_sys_script_t:process { siginh rlimitinh noatsecure };
答案1
许多 SELinux 政策被标记dontaudit
,以便它们不要在审计日志中留下消息。这通常是因为它们是只会向日志中发送无用条目的策略,但有时开发人员dontaudit
会拒绝而不是修复潜在问题。您遇到的策略几乎肯定是其中之一,因为您没有看到任何正在记录的消息audit.log
。
您可以dontaudit
通过运行以下命令暂时禁用:
semodule -DB
发现问题原因后,请dontaudit
使用以下命令重新启用:
semodule -B
要在生成策略后构建策略,请运行:
make -f /usr/share/selinux/devel/Makefile
答案2
您也可以尝试 setroubleshoot。它还会为您提供有关受限制内容的线索以及解决问题的命令。大多数情况下,您所要做的就是准确复制和粘贴给出的内容。
yum install -y setroubleshoot
然后
grep setrouble /var/log/messages
例如:
Aug 6 12:36:11 cnt3 setroubleshoot: [avc.ERROR] Plugin Exception catchall_boolean #012Traceback (most recent call last):#012 File "/usr/lib/python2.6/site-packages/setroubleshoot/analyze.py", line 191, in analyze_avc#012 report = plugin.analyze(avc)#012 File "/usr/share/setroubleshoot/plugins/catchall_boolean.py", line 90, in analyze#012 man_page = self.check_for_man(b)#012 File "/usr/share/setroubleshoot/plugins/catchall_boolean.py", line 76, in check_for_man#012 man_page = name.split("_")[0] + "_selinux"#012AttributeError: 'tuple' object has no attribute 'split'
Aug 6 12:36:11 cnt3 setroubleshoot: SELinux is preventing /usr/libexec/gdm-session-worker from read access on the directory /root. For complete SELinux messages. run sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01
sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01
sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01
SELinux is preventing /usr/libexec/gdm-session-worker from read access on the directory /root.
***** Plugin catchall (100. confidence) suggests ***************************
如果您认为默认情况下应允许 gdm-session-worker 对根目录进行读取访问。那么您应该将此报告为错误。您可以生成本地策略模块以允许此访问。现在通过执行以下命令允许此访问:
grep gdm-session-wor /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp
按照 sealert -l 的提示操作,我认为你的问题应该可以解决。希望对你有帮助。
答案3
为了正确识别问题 - 您必须以 SELinux 宽容模式运行测试,否则您将需要逐个运行测试,并且可能需要一些时间。
之后,停止 Web 服务,确保您的审计日志为空或已轮换,运行 Web 服务,运行脚本/测试,检查审计日志并编写新策略。
据我了解,您的脚本想要访问 Oracle 库进行读取,因此您需要system_u:object_r:textrel_shlib_t:s0
在应用程序上添加读取权限。
我不知道 Oracle 的标签结构是什么,但我相信你能找到答案。请查看audit2allow
。