无法通过 LDAP 使用 AD(在 Windows Server 2012 R2 上)对 MediaWiki(在 LAMP/Ubuntu 上)用户进行身份验证

无法通过 LDAP 使用 AD(在 Windows Server 2012 R2 上)对 MediaWiki(在 LAMP/Ubuntu 上)用户进行身份验证

我正在一个 AD 域中工作,其中有一个运行 Windows Server 2012 R2 的 DC。域网络上(虽然未正式加入域)有一个运行 Ubuntu Server 14.04.3 LTS 的 LAMP Web 服务器。所有计算机都可以通过 IP 地址和 DNS 记录相互访问,并且 LAMP 堆栈(据我所知)已正确配置;HTTP 请求按预期提供。

目的是在 LAMP 服务器上设置 MediaWiki 实例。此外,MediaWiki 应该使用 Ryan Lane 的出色扩展验证LdapAuthenticate- 联系 AD DC 来验证用户登录。

我已尝试尽可能严格按照书中的安装说明进行操作。LAMP 安装主要由 Ubuntu Server 安装程序负责,此外我还通过apt-get软件包php5-intl php5-gd texlive php5-xcache imagemagick mediawiki mediawiki-math及其依赖项进行安装。

接下来,我取消#Alias...注释中的行/etc/mediawiki/apache.conf,运行命令a2enconf mediawikiphp5enmod mycrypt,最后根据教程安装 LdapAuthenticate MediaWiki 扩展作者网站

附加到我的/etc/mediawiki/LocalSettings.php是:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

require_once("$IP/extensions/LdapAuthentication/LdapAuthentication.php");

$wgLDAPDebug = 3;
$wgDebugLogGroups["ldap"] = "/tmp/debug.log";

$wgAuth = new LdapAuthenticationsPlugin();

$wgLDAPDomainNames = array("MYDOMAIN");
$wgLDAPServerNames = array("MYDOMAIN" => "addc.local.domain.com");
$wgLDAPSearchStrings = array("MYDOMAIN" => "[email protected]");

$wgLDAPEncryptionType = array("MYDOMAIN" => "tls");

接下来,我将 AD DC 的自签名 CA 证书添加到/etc/ssl/certsLAMP 服务器上,运行c_rehash,然后重新启动一切。

此时,我可以进入 MediaWiki 并顺利导航到登录表单。登录表单显示MYDOMAIN,并且 PHP 未报告任何错误 - LdapAuthentication 插件看起来一切正常。

然而,当我尝试使用 AD 凭据集登录时,MediaWiki 报告密码错误。网页上的 PHP 错误报告 PHP 无法启动 TLS(Warning: ldap_start_tls(): Unable to start TLS: Connect error in...),而我之前设置为 的 LdapAuthentication 插件的调试日志再次确认了此消息/tmp/debug.log

现在查看 AD DC,我注意到系统日志中的以下事件:

Error from Schannel, Event ID 36874
An TLS 1.2 connection request was received from a remote client application, but none of the cipher suites supported by the client application are supported by the server. The SSL connection request has failed.

此错误与通过 LDAP 使用 AD 在 MediaWiki 上验证用户登录的多次尝试同时发生。

我对管理密码套件了解不够,无法解决这个问题。此外,我连续几天在 Google 上搜索都没有找到任何有用的结果。有人能给我指点一下吗?

答案1

我不知道 MediaWiki 的情况 - 但我有 DokuWiki 可以做你正在寻找的事情。我使用 Apache / Kerberos 集成来启动它 - 也许你也可以这样做。要开始,你需要:

  • 生成 Kerberos keytab 文件。这有点像 Kerberos 信任所需的预共享凭据集。执行此操作时,请发出

    ktpass -princ HTTP/<service host name>@<DOMAIN NAME> -mapuser <security principal> -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass <password> -out <filename>.keytab
    

    在您的 AD 服务器上。

  • 如果您的 Apache 位于 Linux 机器上(我的是),请安装该libpam-krb5包(或您系统上的等效包)。然后,编辑您的/etc/krb5.conf

     [libdefaults]
     default_realm = <YOUR DOMAIN>
    
  • 修改Directory适用于 Media Wiki 设置的 apache.conf 部分。添加 Kerberos 集成,如下所示:

    # Kerberos Auth
    <Directory>
        .... # Your Media Wiki stuff here
        AuthType Kerberos
        KrbAuthRealms <YOUR DOMAIN>
        KrbServiceName HTTP/<service hos name>
        Krb5Keytab /etc/apache2/<filename>.keytab
        KrbMethodNegotiate on
        KrbMethodK5Passwd on
        require valid-user
    </Directory>
    

一旦你有了这个,浏览器将能够以本地用户 SSO 方式登录(如果你相应地配置了浏览器)。如果他们不是本地用户,他们将获得接受 AD 凭据的基本登录提示。

对于我来说,使用 DokuWikiauthad插件,这个设置运行得很好。我不知道它是否适用于 Media Wiki,但 Apache / Kerberos Stuff 对很多事情来说确实很好。希望它能有所帮助!

答案2

在破解了 LdapAuthentication(2.0d 版)MediaWiki 扩展并引入了自己的断点后,我找到了问题所在。事实证明,只有在调用ldap_connect()类似这样的 PHP 后,才能通过 SSL 绑定到我的 AD 服务器,

ldap_connect("myserver.com", 636);

而不是,

ldap_connect("ldaps://myserver.com:636");

LdapAuthenticate 坚持这一点。

ldap_connect()我还注意到 LdapAuthenticate通过以下方式包装 PHP ,

public static function ldap_connect( $hostname=null, $port=389 ) {
    wfSuppressWarnings();
    $ret = ldap_connect( $hostname, $port );
    wfRestoreWarnings();
    return $ret;
}

但随后只会$hostname以 URI 格式传入,格式如下:

ldapi://myserver.com:port
ldap://myserver.com:port
ldaps://myserver.com:port

保留$port其默认值389。这意味着,假设您尝试通过 SSL 进行绑定,对 PHP 的实际调用ldap_connect()如下所示,

ldap_connect("ldaps://myserver.com:636", 389);

这肯定会引起一些问题!

我认为这可能是 LdapAuthenticate 中的一个错误,但也可能只是我完全误解了 PHP(已经有一段时间了)。无论如何,我设法通过破解 LdapAuthenticate 来强制调用,从而使身份验证正常工作,

ldap_connect("myserver.com", 636);

然而,这确实留下了一个未解答的问题。为什么我的 AD 服务器很乐意接受绑定到myserver.com,但不能绑定到ldaps://myserver.com?(我已经确认在 Windows 上使用 就是这种情况ldp.exe)。我怀疑这是一个 DNS 问题,因为myserver.com实际上是根据我本地 DNS 服务器上的记录处理的(我可能确实错过了一个技巧!)我会在其他地方问另一个问题!

相关内容