CentOS 6:PHP 无法加载我编译的 gdchart.so 和 oci8.so

CentOS 6:PHP 无法加载我编译的 gdchart.so 和 oci8.so

我一直尝试向新安装的 CentOS 6.0 Linux 服务器添加 2 个 PHP 扩展,但是在 /var/log/httpd/error_log 中收到错误消息:

[notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/gdchart.so' - /usr/lib64/php/modules/gdchart.so: undefined symbol: php_gd_gdFontMediumBold in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/oci8.so' - libnnz11.so: cannot enable executable stack as shared object requires: Permission denied in Unknown on line 0
[notice] Apache/2.2.15 (Unix) DAV/2 PHP/5.3.2 mod_ssl/2.2.15 OpenSSL/1.0.0-fips mod_wsgi/3.2 Python/2.6.5 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations

我确实跑了

# chcon system_u:object_r:lib_t:s0 /usr/lib64/php/modules/oci8.so
# chcon system_u:object_r:lib_t:s0 /usr/lib64/php/modules/gdchart.so
# ls -alZ /usr/lib64/php/modules/

-rwxr-xr-x. root root system_u:object_r:lib_t:s0       curl.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       dom.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       fileinfo.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       gdchart.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       gd.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       json.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       oci8.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       pdo_pgsql.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       pdo.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       pdo_sqlite.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       pgsql.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       phar.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       sqlite3.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       wddx.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       xmlreader.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       xmlwriter.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       xsl.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       zip.so

以下是我编译这两个模块的方法:

1) 对于 oci8.so - 设置 /etc/tnsnames.ora 然后:

# rpm -Uvh oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
# rpm -Uvh oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm
# pecl install oci8 (entered: instantclient,/usr/lib/oracle/11.2/client64/lib there)

2)对于gdchart.so:

# yum install gd-devel php-devel gcc
# wget http://pecl.php.net/get/gdchart-0.2.0.tgz
# tar xvfz $!
# cd $!
# ./phpize
# ./configure
# make && make install

有人知道我遗漏了什么吗?

从命令行使用这两个库(Oracle 即时客户端和 GDChart)可以正常工作。

更新:

当我通过以下方式关闭 SELinux 时SELINUX=允许进入 /etc/selinux/config 并重新启动,oci8.so 加载,但 gdchart.so 仍然有一个错误

所以我想我的问题是:如何重新启用 SELinux 并仍然能够使用 oci8.so?请在这里分享您的经验 - 如果您已经在使用 Oracle + PHP + CentOS/RHEL 6 时遇到困难。

更新2:

启动 Apache 时,我在 /var/log/audit/audit.log 中看到:

type=AVC msg=audit(1316698464.300:51213): avc:  denied  { execstack } for  pid=2833 comm="httpd" scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:system_r:httpd_t:s0 tclass=process
type=SYSCALL msg=audit(1316698464.300:51213): arch=c000003e syscall=10 success=yes exit=0 a0=7fff95f4b000 a1=1000 a2=1000007 a3=7f5e22611000 items=0 ppid=1 pid=2833 auid=10116 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=34 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

答案1

以 root 身份运行以下命令并重试:

# setsebool -P allow_execstack 1

您还可以仅oci8.so通过以下方式启用可执行堆栈:

# execstack -c /usr/lib64/php/modules/oci8.so

答案2

这也许已经是旧闻了,但我通过以下步骤使 PHP/5.3.3 和 OCI8(Oracle 即时客户端 10.2.0.5)在启用 SELinux 的 RHEL6.3 上运行:

chcon system_u:object_r:lib_t:s0 /usr/lib64/php/modules/oci8.so
execstack -c /usr/lib/oracle/<VERSION>/client64/lib/*.so
chcon -t texrel_shlib_t /usr/lib/oracle/<VERSION>/client64/lib/*.so
setsebool -P httpd_can_network_connect_db 1

我使用了audit2allow -w -a以下提示的组合本文从而达到这个成功的结论。

答案3

在 CentosOS 版本 6.4 (最终版) 上,也存在类似的问题。我们的解决方案似乎是布尔值‘httpd_execmem’

在应用了所有有用的建议却没有成功之后,Apache 上的 oci8 加载仍然失败。因此,我们不得不使用“audit2allow”来解决问题!

$> echo "type=AVC msg=audit(1384944299.002:75458): avc: 拒绝 pid=6356 的 { execstack } comm="httpd" scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:system_r:httpd_t:s0 tclass=process" | audit2allow

获取输出:"This avc can be allowed using the boolean 'httpd_execmem'"

最后得到迄今为止的解决方案:$> setsebool httpd_execmem 1

相关内容