1

使用 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 的预期数据。

转向 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/certsldap.conf,则从命令行调用脚本时可以正常工作。

TLS_CACERTDIR   /etc/openldap/certs
# TLS_REQCERT never  ### only use for testing ###

似乎 httpd 没有读取必要的证书,因此无法与远程 LDAP 服务器通信。

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

4

1 回答 1

2

解决了!

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

这让我得到了这个有用的答案和这个关于 SELinux 的 CentOS Wiki。我们在这里学习:

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 中删除,当然也将 SELinux 设置回Enforcingwith setenforce 1

希望这对其他人有帮助。

于 2016-02-18T20:02:01.217 回答