Сбой ldap_bind () с & quot; Невозможно связаться с сервером LDAP & quot;

Работа в системе 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.

1

Решение

РЕШИТЬ!

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,

Надеюсь, что это полезно для других.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]