Назад | Перейти на главную страницу

Невозможно аутентифицировать пользователей MediaWiki (в LAMP / Ubuntu) с помощью AD (в Windows Server 2012 R2) через LDAP

Я работаю в домене AD с одним контроллером домена под управлением Windows Server 2012 R2. В сети домена (хотя формально не присоединен к домену) находится веб-сервер LAMP, на котором работает Ubuntu Server 14.04.3 LTS. Все машины могут связываться друг с другом как по IP-адресу, так и по записи DNS, а стек LAMP (насколько я могу судить) настроен соответствующим образом; HTTP-запросы обслуживаются должным образом.

Цель состоит в том, чтобы установить экземпляр MediaWiki на сервере LAMP. Более того, MediaWiki следует - используя отличное расширение Райана Лейна 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");

Затем я добавляю самозаверяющий сертификат CA AD DC в /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.

Эта ошибка совпадает с повторяющимися попытками аутентификации входа пользователей в MediaWiki с помощью AD через LDAP.

Я недостаточно знаю об управлении наборами шифров, чтобы подойти к решению этой проблемы. Более того, дни за днем ​​поиск в Google не приносил мне никаких продуктивных результатов. Может ли кто-нибудь указать мне правильное направление?

После взлома расширения MediaWiki LdapAuthentication (версия 2.0d) и введения собственных точек останова я смог отследить проблему. Оказывается, привязка к моему серверу AD через SSL работает только после вызова PHP ldap_connect() это похоже,

ldap_connect("myserver.com", 636);

скорее, чем,

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

на чем настаивает LdapAuthenticate.

Я также отмечаю, что LdapAuthenticate обертывает PHP ldap_connect() следующим образом,

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, но у меня «ДокуВики» делает то, что вы ищете. Я использую интеграцию 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>
    

После этого браузеры смогут входить в систему в стиле единого входа локальных пользователей (если вы соответствующим образом настроите браузеры). Если они не являются локальными пользователями, они получат базовое приглашение для входа в систему, которое принимает учетные данные AD.

Эта установка прекрасно работает для меня, используя «ДокуВики». authad плагин. Не знаю, адаптируется ли он к Media Wiki, но Apache / Kerberos Stuff действительно хорош для многих вещей. Надеюсь, поможет!