ldap_bind () échoue avec “Impossible de contacter le serveur LDAP”

Travailler sur un système EL7 avec PHP 5.6 et openldap 2.4.40.

Je peux interroger le serveur ldaps distant en utilisant ldapsearch:

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

Cela renvoie les données attendues sur l’utilisateur du codeur.

En passant à PHP, je tente de me connecter au même serveur en utilisant les mêmes références et passer (sapass) ci-dessus.

// 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 je l’ajoute temporairement à /etc/openldap/ldap.conf , le script fonctionne:

 TLS_REQCERT never 

Une fois que je commente cela, le script échoue avec “Impossible de contacter le serveur LDAP”.

Si j’ajoute TLS_CACERTDIR /etc/openldap/certs à ldap.conf , le script fonctionne ldap.conf lorsqu’il est appelé depuis la ligne de commande.

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

Il semble que httpd ne lit pas un certificate nécessaire et ne peut donc pas communiquer avec le serveur LDAP distant.

Les tutoriels de configuration de PHP / LDAP Je me suis penché sur le travail avec EL6 et j’utilise EL7.

RESOLU!

SELinux est en cours d’exécution. Si je désactivais temporairement SELinux, le script de test LDAP fonctionnait correctement dans un navigateur.

Cela m’a conduit à cette réponse utile et à ce Wiki CentOS sur SELinux . Ici on apprend:

SELinux ne permet pas à votre démon httpd de communiquer avec le serveur LDAP sur le même ordinateur.

Ah! Il s’avère que SELinux possède une multitude de commutateurs fins pour permettre une activité spécifique à partir de différents processus. Dans mon cas, SELinux a été configuré pour interdire la connectivité LDAP (même si ldaps est activé dans firewalld).

Vous pouvez vérifier la configuration SELinux de httpd en utilisant:

 getsebool -a | grep httpd 

qui renvoie:

 [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 

Pour activer la connectivité réseau SELinux via httpd:

 setsebool -P httpd_can_network_connect on 

Pas besoin de redémarrer Apache. Mon script LDAP a bien fonctionné à partir de ce moment.

Comme ci-dessus, veillez à TLS_REQCERT never supprimer TLS_REQCERT never de votre /etc/openldap/ldap.conf et, bien sûr, à remettre SELinux en Enforcing avec setenforce 1 .

J’espère que cela aidera les autres.