Работа в системе EL7 с PHP 5.6 и openldap 2.4.40.
Я могу запросить удаленный сервер ldaps с помощью ldapsearch:
ldapsearch -H ldaps: //ldap.example.com -D
«CN = serviceaccount, OU = Services, DC = пример, DC = com» -x -w «sapass» -LLL
-b «DC = пример, 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 работал нормально в браузере.
Это привело меня к этому полезный ответ и это CentOS Wiki на SELinux. Здесь мы учимся:
SELinux не позволяет вашему демону httpd общаться с LDAP
сервер на той же машине.
Ах. Оказывается, в SELinux имеется множество мелкозернистых переключателей, позволяющих выполнять определенные действия из разных процессов. В моем случае SELinux был настроен из коробки для запрета подключения LDAP (даже если в firewalld включен ldaps).
Вы можете проверить конфигурацию SELinux httpd, используя:
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
Чтобы включить сетевое подключение SELinux через httpd:
setsebool -P httpd_can_network_connect on
Нет необходимости перезагружать Apache. С этого момента мой скрипт ldap работал нормально.
Как указано выше, обязательно удалите TLS_REQCERT never
от твоего /etc/openldap/ldap.conf
и, конечно, установите SELinux обратно в Enforcing
с setenforce 1
,
Надеюсь, что это полезно для других.
Других решений пока нет …