簡體   English   中英

ldap_bind()失敗,並顯示“無法聯系LDAP服務器”

[英]ldap_bind() fails with “Can't contact LDAP server”

在具有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。

解決了!

SELinux正在運行Enforced。 如果我暫時禁用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刪除TLS_REQCERT never ,當然還要將SELinux設置回setenforce 1 Enforcing

希望這對其他人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM