使用PHP 5.6和openldap 2.4.40处理EL7系统。
我可以使用ldapsearch查询远程ldaps服务器:
ldapsearch -H ldaps://ldap.example.com -D “CN = serviceaccount,OU = Services,DC = example,DC = com”-x -w“sapass”-LLL -b“DC = example,DC = com”cn =“acoder”
这将返回用户acoder上的预期数据。
转移到PHP,我尝试使用相同的凭据绑定到同一服务器并传递(sapass)。
// server settings
$srvc_id = 'serviceaccount';
$srvc_pass = "somepass";
$ldap_host = "ldaps://ldap.example.com";
$srvc_dn = "CN=$srvc_id,OU=Services,DC=example,DC=com";
$user_filter = "(uid=$form_user)";
$ldap_conn = ldap_connect($ldap_host);
if ($ldap_conn)
{
echo "<p>Connected to \$ldap_host $ldap_host at line ";
$r = ldap_bind($ldap_conn, $srvc_dn, $srvc_pass);
if (!$r)
{
echo "<p>failed to bind with service account credentials.";
} else {
echo "<p>binded OK.";
}
}
如果我暂时将其添加到/etc/openldap/ldap.conf
,则脚本可以正常运行:
TLS_REQCERT never
一旦我发表评论,该脚本将失败并显示“无法联系LDAP服务器”。
如果我将TLS_CACERTDIR /etc/openldap/certs
添加到ldap.conf
,则从命令行调用时脚本可以正常工作。
TLS_CACERTDIR /etc/openldap/certs
# TLS_REQCERT never ### only use for testing ###
似乎httpd没有读取必要的证书,因此无法与远程LDAP服务器通信。
PHP / LDAP设置教程我看过EL6的工作,我正在运行EL7。
答案 0 :(得分:2)
解决!
SELinux正在运行Enforced。如果我暂时禁用了SELinux,那么ldap测试脚本在浏览器中运行良好。
这让我想到了这个helpful answer和CentOS Wiki on SELinux。在这里我们学习:
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脚本运行良好。
如上所述,请务必从TLS_REQCERT never
中移除/etc/openldap/ldap.conf
,当然请将SELinux设置回Enforcing
setenforce 1
。
希望这对其他人有帮助。