[英]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/certs
到ldap.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.