13

これは Apache2.2 では完全に機能しますが、2.4 では機能しません (今は 2.4 を使用する必要があります)。

<AuthnProviderAlias ldap myldap>
  AuthLDAPBindDN cn=Manager,dc=example,dc=com
  AuthLDAPBindPassword xxxx
  AuthLDAPURL ldap://localhost:9011/dc=example,dc=com?uid?sub?(objectClass=*)
</AuthnProviderAlias>

Listen 48443
<VirtualHost myserver:48443>
 <Directory /path/to/a/folder>
        Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
        AllowOverride All
        order allow,deny
        Allow from all

        AuthBasicProvider myldap mySecondLdap myThirdLdap ...

        AuthType Basic
        AuthName "LDAP authentication for folder"
        Require valid-user
        ...
  </Directory>
</VirtualHost>

Apache 2.4 mod_authnz_ldapのディレクティブを直接使用すると、次の<Directory >セクションで機能します。

AuthLDAPBindDN cn=Manager,dc=example,dc=com
AuthLDAPBindPassword xxx
AuthLDAPURL ldap://localhost:9011/dc=example,dc=com?uid?sub?(objectClass=*)
AuthBasicProvider ldap

しかし、それでは1 つのLDAP サーバーに対してしか認証できず、少なくとも 2 つのサーバーに対して認証する必要があります。
したがって、古い2.2 LDAP 認証モジュールの代わりに、AuthnProviderAlias現在 (2.4)mod_authn_coreコア認証モジュールの一部である を使用します。mod_authn_alias


2.4.x のすべてのバージョン (2.4.1 から 2.4.6 まで、さらには現在のものまで) をAPR 1.4.8 と APR-util 1.5.2でデバッグ モード ( -g -O0)でコンパイルしました。

私が試したのはデバッグセッションです(gdb --command=debug、「debug」は次のようなgdbパラメーターファイルです):

file /home/vonc/usr/local/apps/apache/bin/httpd
set logging file /home/vonc/gdb.txt
set logging on
set args -X
show args
set breakpoint pending on

# authn_alias_check_password
b mod_authn_core.c:115
# authaliassection
b mod_authn_core.c:203
b mod_authn_core.c:255

run
wh
fs next
where

私が見るものは次のとおりです。

その関数authcfg

authn_alias_srv_conf *authcfg =
    (authn_alias_srv_conf *)ap_get_module_config(r->server->module_config,
                                                 &authn_core_module);

そして、正しい名前 ' ' と正しいエイリアス ' 'でプロバイダーを設定しますldapmyldap

apr_hash_set(authcfg->alias_rec, provider_alias, APR_HASH_KEY_STRING, prvdraliasrec);

BUT:パスワードをチェックする必要がある場合(でauthn_alias_check_passwordauthcfg再び取得し、プロバイダーを取得します:

    provider_alias_rec *prvdraliasrec = apr_hash_get(authcfg->alias_rec,
                                                     provider_name, APR_HASH_KEY_STRING);

それは右provider_nameの ' myldap' を使用します...そしてそれは常に を返しますnull
つまりprvdraliasrec->provider->check_password、呼び出されることはありません。

http-dev メーリング リスト( 2013 年 8 月 23 日「Is AuthnProviderAlias は 2.4 で微妙に壊れていますか?」 )での同様の質問は...未回答でした。

このバグをどのようにトラブルシューティングしますか?

4

2 に答える 2

0

mod_authn_core.c私が見つけた唯一の有効な解決策は、作業したい LDAP エイリアスごとに 1 つずつ、2 つのグローバル変数を追加して、パッチを適用することです。

醜いように思えます: 2 つの LDAP エイリアス名がコードにハードコーディングされています。

コミット 2f691a6を参照してください

provider_alias_rec *prvdraliasrec_myldap;
provider_alias_rec *prvdraliasrec_companyldap;

このようにmerge_authn_core_dir_config()して、これら 2 つのエイリアス名を探して登録します。

if (!prvdraliasrec && strcmp(provider_name,"myldap")==0) {
  prvdraliasrec=prvdraliasrec_myldap; 
}
if (!prvdraliasrec && strcmp(provider_name,"companyldap")==0) {
  prvdraliasrec=prvdraliasrec_companyldap;
}

そしてauthaliassection()、それらのエイリアス定義を元に戻します

if ( strcmp(provider_alias,"myldap") == 0 ) { 
  prvdraliasrec_myldap = prvdraliasrec;
}
if ( strcmp(provider_alias,"companyldap") == 0 ) {
  prvdraliasrec_companyldap = prvdraliasrec;
}

それは機能しますが、確かに「正しい」ソリューションではありません。

于 2013-11-29T18:59:25.543 に答える