無法通過 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 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" => "USER-NAME@local.domain.com"); $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...
),並且我之前設置為/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搜尋並沒有給我帶來任何有效的結果。有人能指出我正確的方向嗎?
在破解 LdapAuthentication(2.0d 版)MediaWiki 擴展並引入我自己的斷點之後,我能夠找到問題所在。事實證明,通過 SSL 綁定到我的 AD 伺服器僅在呼叫 PHP 之後才有效
ldap_connect()
,如下所示,ldap_connect("myserver.com", 636);
而不是,
ldap_connect("ldaps://myserver.com:636");
LdapAuthenticate 堅持這一點。
我還注意到 LdapAuthenticate
ldap_connect()
以以下方式包裝 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
?(我已經確認這是ldp.exe
在 Windows 上使用的情況)。我懷疑這是一個 DNS 問題,因為myserver.com
實際上是根據我本地 DNS 伺服器上的記錄處理的(我可能確實錯過了一個技巧!)我會在別處問另一個問題!
我不知道 MediaWiki - 但我有 DokuWiki 做你正在尋找的東西。我使用 Apache / Kerberos 集成來讓事情順利進行——也許你也可以這樣做。要開始,您需要:
- 生成 Kerberos 密鑰表文件。這是 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
apache.conf 中適用於 Media Wiki 設置的部分。像這樣添加 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 憑據的基本登錄提示。
使用 DokuWiki
authad
外掛時,此設置非常適合我。我不知道它是否適應 Media Wiki,但 Apache / Kerberos Stuff 對很多事情都非常好。希望能幫助到你!