2016-02-18 5 views
1

Работает на EL7-системе с PHP 5.6 и openldap 2.4.40.ldap_bind() не работает с «Не удается связаться с сервером LDAP»

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

ldapsearch -H LDAPS: //ldap.example.com -D «CN = ServiceAccount, OU = Services, DC = пример , DC = ком»-x -w "sapass" -LLL -b "DC = пример, DC = ком" сп = "acoder"

Это возвращает ожидаемые данные о пользователе 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.

ответ

2

РЕШЕННЫЙ!

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

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

SELinux не позволит вашему HTTPD демон, чтобы поговорить с сервером LDAP на той же машине.

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

Вы можете проверить конфигурацию SELinux из HTTPD с помощью:

getsebool -a | grep httpd 

, которая возвращает:

[[email protected]]# 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.

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

Смежные вопросы