ldap_bind () falla con “No se puede contactar servidor LDAP”

Trabajando en un sistema EL7 con PHP 5.6 y openldap 2.4.40.

Puedo consultar el servidor ldaps remoto usando ldapsearch:

ldapsearch -H ldaps: //ldap.example.com -D “CN = serviceaccount, OU = Servicios, DC = ejemplo, DC = com” -x -w “sapass” -LLL -b “DC = ejemplo, DC = com “cn =” acoder ”

Esto devuelve los datos esperados en el progtwig de usuario.

Moviéndome a PHP, estoy intentando enlazar al mismo servidor usando las mismas credenciales y pase (sapass) arriba.

// 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 "

Connected to \$ldap_host $ldap_host at line "; $r = ldap_bind($ldap_conn, $srvc_dn, $srvc_pass); if (!$r) { echo "

failed to bind with service account credentials."; } else { echo "

binded OK."; } }

Si agrego esto temporalmente a /etc/openldap/ldap.conf , el script funciona:

 TLS_REQCERT never 

Una vez que comento eso, la secuencia de comandos falla con “No se puede contactar con el servidor LDAP”.

Si agrego TLS_CACERTDIR /etc/openldap/certs ldap.conf a ldap.conf , la secuencia de comandos funciona bien cuando se llama desde la línea de comandos.

 TLS_CACERTDIR /etc/openldap/certs # TLS_REQCERT never ### only use for testing ### 

Parece que httpd no está leyendo un certificado necesario y, por lo tanto, no puede comunicarse con el servidor LDAP remoto.

Los tutoriales de configuración de PHP / LDAP que he visto funcionan con EL6, y estoy ejecutando EL7.

SOLUCIONADO

SELinux está ejecutando Enforced. Si deshabilité temporalmente SELinux, el script de prueba ldap funcionó bien en un navegador.

Eso me llevó a esta útil respuesta y este CentOS Wiki en SELinux . Aquí aprendemos:

SELinux no permite que su daemon httpd hable con el servidor LDAP en la misma máquina.

Ah. Resulta que SELinux tiene una multitud de interruptores finos para permitir la actividad específica de diferentes procesos. En mi caso, SELinux fue configurado de fábrica para no permitir la conectividad LDAP (a pesar de que ldaps está habilitado en firewalld).

Puede verificar la configuración de httpd de SELinux usando:

 getsebool -a | grep httpd 

que devuelve:

 [[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 

Para habilitar la conectividad de red SELinux a través de httpd:

 setsebool -P httpd_can_network_connect on 

No es necesario reiniciar Apache. Mi script ldap funcionó bien desde ese momento.

Como se TLS_REQCERT never anteriormente, asegúrese de eliminar TLS_REQCERT never de su /etc/openldap/ldap.conf y, por supuesto, vuelva a establecer SELinux en Enforcing with setenforce 1 .

Espero que esto sea útil para otros.