Ubuntu

無法通過 LDAP 使用 AD(在 Windows Server 2012 R2 上)對 MediaWiki(在 LAMP/Ubuntu 上)使用者進行身份驗證

  • November 19, 2015

我在 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-getphp5-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" => "USER-NAME@local.domain.com");

$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...),並且我之前設置為/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 堅持這一點。

我還注意到 LdapAuthenticateldap_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>
  • 修改Directoryapache.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 憑據的基本登錄提示。

使用 DokuWikiauthad外掛時,此設置非常適合我。我不知道它是否適應 Media Wiki,但 Apache / Kerberos Stuff 對很多事情都非常好。希望能幫助到你!

引用自:https://serverfault.com/questions/736086