ldap_bind() завершается ошибкой с сообщением «Не удается связаться с сервером LDAP».

Работа в системе EL7 с PHP 5.6 и openldap 2.4.40.

Я могу запросить удаленный сервер ldaps с помощью ldapsearch:

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="акодер"

Это возвращает ожидаемые данные о пользовательском кодере.

Переходя на 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.


person a coder    schedule 18.02.2016    source источник


Ответы (1)


РЕШЕНО!

SELinux работает принудительно. Если я временно отключил SELinux, тестовый скрипт ldap нормально работал в браузере.

Это привело меня к этому полезному ответу и этому CentOS Wiki на SELinux. Здесь мы узнаем:

SELinux не позволяет вашему демону httpd общаться с сервером LDAP на том же компьютере.

Ах. Оказывается, SELinux имеет множество мелких переключателей, позволяющих выполнять определенные действия из разных процессов. В моем случае SELinux был настроен из коробки, чтобы запретить подключение LDAP (даже несмотря на то, что ldaps включен в firewalld).

Вы можете проверить конфигурацию 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.

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

person a coder    schedule 18.02.2016