SELinux 阻止 Perl CGI 脚本访问 Oracle 库

SELinux 阻止 Perl CGI 脚本访问 Oracle 库

我正在尝试在运行 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 -isemodule: 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

相关内容