ldap_bind()失败并显示“无法联系LDAP服务器”

时间:2016-02-18 19:31:32

标签: php apache centos7 rhel7

使用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。

1 个答案:

答案 0 :(得分:2)

解决!

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

这让我想到了这个helpful answerCentOS 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

希望这对其他人有帮助。