我正在一个 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 mediawiki
和php5enmod 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/certs
LAMP 服务器上,运行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 服务器上的记录处理的(我可能确实错过了一个技巧!)我会在其他地方问另一个问题!