1

PHP 5.6 と openldap 2.4.40 を使用して EL7 システムで作業しています。

ldapsearch を使用してリモート ldaps サーバーにクエリを実行できます。

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="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 を実行しています。

4

1 に答える 1

2

解決しました!

SELinux が強制的に実行されています。SELinux を一時的に無効にすると、ldap テスト スクリプトはブラウザで正常に動作しました。

これにより、この役立つ回答とこのCentOS Wiki on SELinux にたどり着きました。ここで、次のことを学びます。

SELinux は、httpd デーモンが同じマシン上の LDAP サーバーと通信することを許可しません。

ああ。SELinuxには、さまざまなプロセスからの特定のアクティビティを許可するための多数のきめ細かいスイッチがあることがわかりました。私の場合、SELinux はデフォルトで LDAP 接続を許可しないように設定されていました (firewalld で LDAP が有効になっている場合でも)。

以下を使用して、httpd の SELinux 構成を確認できます。

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

httpd を介して SELinux ネットワーク接続を有効にするには:

setsebool -P httpd_can_network_connect on

Apache を再起動する必要はありません。その瞬間から、私の LDAP スクリプトは正常に機能しました。

上記のように、必ず から削除TLS_REQCERT never/etc/openldap/ldap.conf、もちろん SELinux をEnforcingwith に戻してくださいsetenforce 1

これが他の人に役立つことを願っています。

于 2016-02-18T20:02:01.217 に答える