Apache-2.2

SELinux 阻止 Perl CGI 腳本訪問 Oracle 庫

  • August 31, 2012

我正在嘗試在執行 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 腳本執行良好。

這是 ls -lZ 在 libclntsh.so.11.1 上的輸出:

-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 };

許多 SELinux 策略被標記dontaudit,因此它們不會在審計日誌中留下消息。這通常是因為它們的策略只會用無用的條目向日誌發送垃圾郵件,但有時開發人員會dontaudit拒絕而不是解決根本問題。您要執行的策略幾乎肯定在其中,因為您沒有看到任何正在登錄的消息audit.log

dontaudit您可以通過執行暫時禁用:

semodule -DB

找到問題的原因後,重新啟用dontaudit

semodule -B

要在生成策略後建構策略,請執行:

make -f /usr/share/selinux/devel/Makefile

引用自:https://serverfault.com/questions/414586