Может ли AuthnProviderAlias ​​ldap работать с Apache2.4.x?

Это отлично работает в 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

Но это позволяет использовать аутентификацию только для одного сервера LDAP, и мне нужно пройти аутентификацию по меньшей мере из двух.
Следовательно, использование AuthnProviderAlias, которое теперь (2.4) является частью mod_authn_core модуль проверки подлинности ядра, вместо старого 2.2 Модуль аутентификации LDAP mod_authn_alias.


Я скомпилировал все версии 2.4.x(от 2.4.1 до 2.4.6 и даже текущего), APR 1.4.8 и APR- использовать 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);

И устанавливает поставщик с правильным именем 'ldap' и правым псевдонимом 'myldap'

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

НО: когда пароль нужно проверить (в authn_alias_check_password, он снова получает authcfg и выберите поставщика:

    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 (23 августа, 2013 "Is AuthnProviderAlias ​​тонко сломанный в 2.4?" ) был... без ответа.

Как вы устраните эту ошибку?

Ответ 1

Ошибка связана с тем, что поставщики и их использование находятся в разных контекстах сервера.

  • mod_authn_core предоставляет AuthType, который создает конфигурацию для каждого сервера для authn_core для VH
  • В модуле не реализована функция слияния
  • server- > module_config, который всегда будет пустым.

Обходной путь: определите свой аут вне контекста VH или попробуйте этот патч, если вы можете легко перестроить: http://people.apache.org/~covener/patches/authprovider.diff

Index: modules/aaa/mod_authn_core.c
===================================================================
--- modules/aaa/mod_authn_core.c    (revision 40703)
+++ modules/aaa/mod_authn_core.c    (working copy)
@@ -179,6 +179,12 @@
     return (void *) authcfg;
 }

+/* Only per-server directive we have is GLOBAL_ONLY */
+static void *merge_authn_alias_svr_config(apr_pool_t *p, void *basev, void *overridesv)
+{
+    return basev;
+}
+
 static const authn_provider authn_alias_provider =
 {
     &authn_alias_check_password,
@@ -373,7 +379,7 @@
     create_authn_core_dir_config,   /* dir config creater */
     merge_authn_core_dir_config,    /* dir merger --- default is to override */
     create_authn_alias_svr_config,  /* server config */
-    NULL,                           /* merge server config */
+    merge_authn_alias_svr_config,   /* merge server config */
     authn_cmds,
     register_hooks                  /* register hooks */
 };

Ответ 2

Единственным рабочим решением, которое я нашел, является исправление mod_authn_core.c, добавив 2 глобальных переменных, по одному для каждого псевдонима LDAP, с которым я хочу работать.

Это кажется уродливым: два псевдонима LDAP жестко закодированы в коде.

См. commit 2f691a6

provider_alias_rec *prvdraliasrec_myldap;
provider_alias_rec *prvdraliasrec_companyldap;

Таким образом, merge_authn_core_dir_config() ищет эти два псевдонима специально для их регистрации.

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;
}

Это работает, но это, безусловно, не "правильное" решение.