Php ldap_bind()失败,为;Can';t联系LDAP服务器“;

Php ldap_bind()失败,为;Can';t联系LDAP服务器“;,php,apache,centos7,rhel7,Php,Apache,Centos7,Rhel7,使用PHP5.6和openldap 2.4.40在EL7系统上工作 我可以使用ldapsearch查询远程ldaps服务器: ldapsearch-Hldaps://ldap.example.com -D “CN=serviceaccount,OU=Services,DC=example,DC=com”-x-w“sapass”-LLL -b“DC=example,DC=com”cn=“acoder” 这将返回用户acorder上的预期数据 转到PHP,我试图使用上面相同的凭证和密码(sapass

使用PHP5.6和openldap 2.4.40在EL7系统上工作

我可以使用ldapsearch查询远程ldaps服务器:

ldapsearch-Hldaps://ldap.example.com -D “CN=serviceaccount,OU=Services,DC=example,DC=com”-x-w“sapass”-LLL -b“DC=example,DC=com”cn=“acoder”

这将返回用户acorder上的预期数据

转到PHP,我试图使用上面相同的凭证和密码(sapass)绑定到同一台服务器

一旦我将其注释掉,脚本就会以“无法联系LDAP服务器”的形式失败

如果我将
TLS\u CACERTDIR/etc/openldap/certs
添加到
ldap.conf
,那么从命令行调用脚本时,脚本工作正常

TLS_CACERTDIR   /etc/openldap/certs
# TLS_REQCERT never  ### only use for testing ###
httpd似乎没有读取必要的证书,因此无法与远程LDAP服务器通信

我看过的关于使用EL6的PHP/LDAP设置教程,我正在运行EL7。

解决了

SELinux正在运行。如果我暂时禁用了SELinux,ldap测试脚本在浏览器中运行良好

这让我想到了这个和这个。在这里,我们了解到:

SELinux不允许httpd守护进程与LDAP对话 同一台计算机上的服务器

啊。事实证明,SELinux有许多细粒度的开关,允许来自不同进程的特定活动。在我的例子中,SELinux被配置为开箱即用,不允许LDAP连接(即使在firewalld中启用了ldaps)

您可以使用以下方法检查httpd的SELinux配置:

getsebool -a | grep httpd
返回:

[acoder@myboxen]# getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
要通过httpd启用SELinux网络连接,请执行以下操作:

setsebool -P httpd_can_network_connect on
无需重新启动Apache。从那一刻起,我的ldap脚本工作得很好

如上所述,请确保从
/etc/openldap/ldap.conf
中删除
TLS_REQCERT never
,当然,使用
setEnforce1
将SELinux设置回
强制执行

希望这对其他人有帮助

[acoder@myboxen]# getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
setsebool -P httpd_can_network_connect on