SCROLL
Среднее время на прочтение: 3 мин.

Интеграция аутентификации MediaWiki 1.30.0 с Active Directory

Разберем как интегрировать MediaWiki с Active Directory.

 

Исходные данные:

  • Развернутая система MediaWiki 1.30.0 (по этой статье) (mediawiki) на Debian 8 Jessie
  • Домен контроллер Windows Server 2012 R2 (JAKONDA.LOCAL)

 

Для интеграции MediaWiki с Active Directory, необходимо создать пользователя с помощью которого будет осуществляться чтение LDAP, для авторизации всех остальных пользователей системы MediaWiki.

 

Создание пользователя в Active Directory

Создаем служебного пользователя (прим. admin.mediawiki), снимаем галочку «Требовать смены пароля при следующем входе в систему», выставляем галочки «Запретить смену пароля пользователем», «Срок действия пароля не ограничен».

 

Интеграция MediaWiki с Active Directory

LdapAuthentication. Переходим по ссылке, выбираем версию MediaWiki, для которой нам необходимо расширение (1.30.0).

https://www.mediawiki.org/wiki/Special:ExtensionDistributor/LdapAuthentication

Распаковываем скачанный архив в папку расположения MediaWiki (прим. /var/www/mediawiki/extensions):

tar -xzf LdapAuthentication-REL1_30-907953e.tar.gz -C /var/www/mediawiki/extensions

 

Вносим исправления в параметры доступа в файле конфигурации (/var/www/mediawiki//LocalSettings.php):

$wgGroupPermissions['*']['autocreateaccount'] = true;
$wgGroupPermissions['*']['createaccount'] = false;
if ( !isset( $_SERVER['REMOTE_ADDR'] ) OR $_SERVER['REMOTE_ADDR'] == '192.168.7.30') {
 $wgGroupPermissions['*']['read'] = true;
 $wgGroupPermissions['*']['edit'] = true;
}

 

Дописываем в конец файла конфигурации (/var/www/mediawiki//LocalSettings.php):

# LDAP ---------------------------------------------------------------------------------------
require_once('extensions/LdapAuthentication/LdapAuthentication.php');
require_once ('includes/AuthPlugin.php');
$wgAuth = new LdapAuthenticationPlugin();

$wgLDAPDomainNames = array('JAKONDA.LOCAL');
$wgLDAPServerNames = array('JAKONDA.LOCAL' => 'dc1.jakonda.local');
$wgLDAPPort = array('JAKONDA.LOCAL' => 389);
$wgLDAPEncryptionType = array('JAKONDA.LOCAL' => 'false');

$wgLDAPUseLocal = true;

$wgLDAPSearchStrings = array('JAKONDA.LOCAL' => 'USER-NAME@JAKONDA.LOCAL',);
$wgLDAPProxyAgent = array('JAKONDA.LOCAL' => 'admin.mediawiki');
$wgLDAPProxyAgentPassword = array('JAKONDA.LOCAL' => 'Aa1234567');
$wgLDAPSearchAttributes = array('JAKONDA.LOCAL' => 'sAMAccountName');
$wgLDAPBaseDNs = array('JAKONDA.LOCAL' => 'dc=jakonda,dc=local');
$wgLDAPGroupBaseDNs = array('JAKONDA.LOCAL' => 'dc=jakonda,dc=local');
$wgLDAPUserBaseDNs = array('JAKONDA.LOCAL' => 'dc=jakonda,dc=local');

$wgLDAPRetrievePrefs = array('JAKONDA.LOCAL' => 'true');
$wgLDAPPreferences = array('JAKONDA.LOCAL' => array('email' => 'mail','realname' => 'displayname'));

$wgLDAPDisableAutoCreate = array('JAKONDA.LOCAL' => true);

$wgLDAPGroupUseFullDN = array('JAKONDA.LOCAL' => true);
$wgLDAPLowerCaseUsername = array('JAKONDA.LOCAL' => true);
$wgLDAPGroupObjectclass = array('JAKONDA.LOCAL' => 'group');
$wgLDAPGroupAttribute = array('JAKONDA.LOCAL' => 'member');
$wgLDAPGroupNameAttribute = array('JAKONDA.LOCAL' => 'cn');
$wgLDAPGroupsUseMemberOf = array('JAKONDA.LOCAL' => true);

# Можно задать члены групп AD, каким разрешать доступ к MediaWiki 
$wgLDAPRequiredGroups = array('JAKONDA.LOCAL' => array('cn=evilgroup,ou=groups,dc=AD,dc=jakonda,dc=local'));

# Можно задать члены групп AD, каким запрещать доступ к MediaWiki 
#$wgLDAPExcludedGroups = array('JAKONDA.LOCAL' => array('cn=evilgroup,ou=groups,dc=AD,dc=jakonda,dc=local'));
$wgLDAPGroupSearchNestedGroups = array('JAKONDA.LOCAL' => true);
$wgLDAPActiveDirectory = array('JAKONDA.LOCAL' => true);

$wgLDAPDebug = 99;
$wgDebugLogGroups["ldap"] = "/tmp/ldap.log";
#-----------------------------------------------------------------------------------------------------

[stextbox id=’warning’]Соответственно не забываем изменить название домена, служебного пользователя под себя. Так же более подробно по LDAP авторизации можно почитать на оф. сайте[/stextbox]

 

Запускаем скрипт обновления данных в MediaWiki (после подключения любых расширений в MediaWiki, необходимо выполнять данное действие, иначе подключенные расширения в LocalSettings.php будут проигнорированы). Так же перезапускаем службу apache:

php /var/www/mediawiki/maintenance/update.php
service apache2 restart

 

Теперь на форме авторизации MediaWiki, будет возможность авторизации как в Active Directory, так и с помощью локальной базы пользователей MediaWiki

 

 

Понравилась или оказалась полезной статья, поблагодари автора

 

Обсуждение

29 комментариев
  • Добрый день,
    наткнулись на проблему уже на этапе апдейта, при инициализации update.php ругается на строку 822 в maintenance.php ($this->setParam( $options, $bits[0], $bits[1] ?? 1);). Говорит, что символ ? для интерпретатора неожиданный.
    С чем может быть связана такая проблема?

  • Доброго времени суток. У вас в конце указано: Теперь на форме авторизации MediaWiki, будет возможность авторизации как в Active Directory, так и с помощью локальной базы пользователей MediaWiki

    А известны ли какие-нибудь пути, что бы сделать аутентификацию ТОЛЬКО по ldap?

    • Это ответ на комментарий Денис

      Не выполняйте интеграцию с AD и будет только локальная база авторизации

  • Всем привет, у меня получилось настроить на версии 1.34.1. Все работает.
    Потратил достаточно много времени , что бы немного начать понимать как и что работает. Опыт который имел на момент приступания к установки, настройки и интеграции с Active Directory, средний опыт администрирования Windows серверов. Совершил очень глупую ошибку с тем , что указал IP совершенно другого DC в CentOS, на которой и стоит MediaWiki.

    Сам процес интеграции очень легкий если понять для чего что используется.
    Вот статья , по которой я все настраивал: https://www.mediawiki.org/wiki/Manual:Active_Directory_Integration

    Все расширения (extension) следует ставить версии 1.31 так как они советуют. Так же обратие внимание на то что нужно савить в правильной очередности.
    Сначала ставим:
    LDAPProvider (после него нужно сделать php /var/www/html/mediawiki/maintenance/update.php)
    LDAPAuthentication2
    PluggableAuth
    LDAPAuthorization

    Есть расширения которые устанавливать но нужно прописовать в ldap.json или localsettings.php.
    Extension:LDAPUserInfo
    Extension:LDAPGroups

    Прочитайте про каждый из них что и для чего.

    Не забываем о dnf install php-ldap.

    Если кому то понадобится, я могу выложить свои localsetting.php и ldap.json и обьяснить как нужно настраивать.Так же прошу заметить что я на всякий случай выключал firewall на linux и на windows , на всякий случай.

    Следуйте статье выше , все получится.
    Важное замечание, для того что бы Localsettings.php использовал ldap.json в котором прописан конфиг подключения к DC нужно указать в Localsetting.php одну строчку :
    $LDAPProviderDomainConfigs = «/путь/к файлу/ldap.json»;

    Так же будет полезным указать еще одну строчку. Она показывает более обширные данные об ошибке:
    $wgShowExceptionDetails = true;

    Если возникнут какие то вопросы , пишите. Постараюсь помочь чем смогу

    • Это ответ на комментарий Михаил

      Михаил добрый день. Можете пожалуйста выложить свои файлы localsetting.php и ldap.json.
      Или укажите свою почту для связи.

      • Это ответ на комментарий Дмитрий

        Добрый, некоторое время назад отказались от данной платформы, поэтому выкладывать для вас нечего..

        • Это ответ на комментарий Жаконда

          а какую платформу стали использовать?

        • Это ответ на комментарий Nik

          docuwiki

      • Это ответ на комментарий Дмитрий

        Дмитрий, к сожалению виртуалка на которой стояла MediaWiki крашнулась и все файлы были потеряны. К сожалению никак не могу помочь.

      • Это ответ на комментарий Дмитрий

        Привет Дмитрий,
        у меня получилось восстановить мои файлы.

        ldap.json:
        {
        «acme.com»: {
        «connection»: {
        «server»: «ldap.acme.com»,
        «port»: «389»,
        «user»: «CN=mikhail,CN=Users,DC=acme,DC=com»,
        «pass»: «P@ssw0rd»,
        «enctype»: «clear»,
        «options»: {
        «LDAP_OPT_DEREF»: 1
        },
        «basedn»: «dc=acme,dc=com»,
        «userbasedn»: «dc=acme,dc=com»,
        «groupbasedn»: «dc=acme,dc=com»,
        «searchattribute»: «samaccountname»,
        «usernameattribute»: «samaccountname»,
        «realnameattribute»: «cn»,
        «emailattribute»: «mail»,
        «grouprequest»: «MediaWiki\\Extension\\LDAPProvider\\UserGroupsRequest\\UserMemberOf::factory»,
        «presearchusernamemodifiers»: [ «spacestounderscores», «lowercase» ]
        },
        «userinfo»: [],
        «authorization»: [],
        «groupsync»: {
        «mapping»: {
        «engineering»: «CN=EngineeringCoreTeam,OU=Groups,DC=acme,DC=com»,
        «bureaucrat»: «CN=Mediawiki Admins,OU=Groups,DC=acme,DC=com»,
        «interface-admin»: «CN=Mediawiki Admins,OU=Groups,DC=acme,DC=com»,
        «sysop»: «CN=Mediawiki Admins,OU=Groups,DC=acme,DC=com»
        }
        }
        }
        }

        LocalSettings.php:

        3 ) { $wikiRequestIP = $_SERVER[$ipsVar]; break; }
        }
        $wikiRequestSafe = (isset($wikiRequestIP) && ( in_array($wikiRequestIP,$safeIPs) ));

        // Create Wiki-Group ‘engineering’ from default user group
        $wgGroupPermissions[‘engineering’] = $wgGroupPermissions[‘user’];

        // Private Wiki. External LDAP login. Default NS requires login.

        // Load LDAP Config from JSON
        $ldapJsonFile = «$IP/ldap.json»;
        $ldapConfig = false;
        if (is_file($ldapJsonFile) && is_dir(«$IP/extensions/LDAPProvider»)) {
        $testJson = @json_decode(file_get_contents($ldapJsonFile),true);
        if (is_array($testJson)) {
        $ldapConfig = true;
        } else {
        error_log(«Found invalid JSON in file: $IP/ldap.json»);
        }
        }

        // Activate Extension
        if ( $ldapConfig ) {

        wfLoadExtension( ‘PluggableAuth’ );
        wfLoadExtension( ‘LDAPProvider’ );
        wfLoadExtension( ‘LDAPAuthentication2’ );
        wfLoadExtension( ‘LDAPAuthorization’ );
        wfLoadExtension( ‘LDAPUserInfo’ );
        wfLoadExtension( ‘LDAPGroups’ );

        $LDAPProviderDomainConfigs = $ldapJsonFile;
        $wgPluggableAuth_ButtonLabel = «Log In»;

        if ($wikiRequestSafe) { $LDAPAuthentication2AllowLocalLogin = true; }
        }

  • Всем привет. Следую по мануалу , делал на убунте, все работает.
    Для тех кто делает на версии выше, нужно делать совершенно по другому. Дело в том что расширение LdapAuthentication было обновленно, и стало LdapAuthentication, тем самым изменив настройку интеграции AD с MediaWiki.
    Учтите что LdapAuthentication, работал до версии 1.27. Смотрите оригинальный сайт MediaWiki , смотрите различные расширения которые есть для интеграции с AD. Сам еще не сделал но думаю что близок, если сделаю, выложу сюда.

    • Это ответ на комментарий Михаил

      Выкладывайте, разместим, наверняка ваша наработка пригодится другим!

    • Это ответ на комментарий Михаил

      Здравствуйте. Получилось ли у Вас разобраться с проблемой авторизацией? Я Использую Mediawiki 1.34 на Дебиан 10.
      Плагин скачал для версии 1.34. Настроил по мануалу. Но при попытке авторизации каждый раз пишет, что пароль не верный.
      И лог не пишет, что странно, ни в tmp ни в /var/lib/mediawiki

      (Да путь к папке у меня такой /var/lib/mediawiki).

      Вроде никаких брнадмауэров нету….

  • Ребята, впервые поднял mediawiki 1.31 на ОС TurnKey/Debian и теперь задача стоит привязать к AD. Попалась ваша статья. Ожидал легкой настройки, но уже бьюсь несколько недель. Результат один и тот же: Введены неверные имя участника или пароль. Попробуйте ещё раз.
    Предварительно установлен пакет php-ldap и включен модуль apache2. Информация в phpinfo.php говорит о активном модуле. Так же установил утилиту ldapsearch для тестирования доступности сервера ldap. Ответы от сервера ldap по пользователям прилетают в консоле linux.
    Wiki же ни в какую не хочет логиниться. Толковых выводов информации в лог найти не смог. не очень информативный вид.
    Даже эта настройка не очень:
    error_reporting( -1 );
    ini_set( ‘display_errors’, 1 );
    #$wgShowSQLErrors = true;
    #$wgDebugDumpSql = true;
    $wgShowDBErrorBacktrace = true;
    $wgShowExceptionDetails = true;
    $wgDebugLogFile = «/var/log/mediawiki/debug.log»;

    Проясните одно. Я как новый пользователь в Wiki должен предварительно создать учетку? или из AD подтянется при проверке и автоматически создает?

  • Добрый день!
    Пробовал установить по аналогии на версию 1.33 не сработало.
    Подскажите, актуальна ли информация под версию 1.33 ?

    • Это ответ на комментарий Greg

      Добрый!

      Без понятия, не тестировал на других версиях.

  • Здравствуйте. Подскажите пожалуйста. Сделал вроде всё по аналогии, но не получается. В логах появляется такое
    2019-02-06 13:55:36 wiki mediawiki: 2.1.0 Allowing the local domain, adding it to the list.
    2019-02-06 13:55:36 wiki mediawiki: 2.1.0 Entering strict.
    2019-02-06 13:55:36 wiki mediawiki: 2.1.0 Returning false in strict().
    а на странице входа:
    Предоставленные учётные данные не могут быть проверены на подлинность.

    • Это ответ на комментарий Александр

      Попробуй отключить selinux. В моём случае это решило проблему.

  • Привет! Хорошая статья, спасибо! Есть пара вопросов
    1 .$wgLDAPServerNames = array(‘JAKONDA.LOCAL’ => ‘dc1.jakonda.local’);
    2. $wgLDAPPort = array(‘JAKONDA.LOCAL’ => 389);
    3. Firewall-cmd
    4. С включенным SELinux проверяли работу, много нужно дописывать?

    1. Могу дописать второй сервер АД через запятую и если да, то пользователи балансятся между серваками или стучатся в первый по списку?
    2. для 636 порта, нужно ещё где-то дописывать, что шифрование.
    3. надо же писать правила для файрволла, чтобы работать с ldap?
    sudo firewall-cmd —zone=public —add-port=389/tcp —permanent
    sudo firewall-cmd —reload

  • Долго не мог понять почему в логах не выполняется поиск по ldap пользователей и почему ничего не работает. Открыл PowerShell написал пару запросов (вывел группы, вывел пользователей), посмотрел структуры групп через ldap в моей организации и внес необходимые правки. Вроде все, но ничего не работало. В логах вываливалась ошибка, что само расширение ldap wiki отваливается и чисто случайно наткнулся на американском форуме на крошечную фразу ‘ldap не работает самостоятельно с php никаким образом, нужно включить библиотеку’, я зацепился за эту фразу и просто написал php ldap и о чудо я даже имея опыт в php — реально не знал. что для обработки запросов ему нужно обязательно подрубить php_ldap.dll со стороны самого php. Век живи, век учись, 8 часов интима не прошли даром)))).

    • Это ответ на комментарий Сергей

      Все как всегда, проблема на видном месте и какой то мелочи ! Рад что все у вас таки получилось )

  • php-ldap установлен?

  • Чувак, спасибо, первый нормальный скрипт, всё понятно, что и зачем, всё работает…

    Почему-то все остальные не содержат, например, строки
    require_once (‘includes/AuthPlugin.php’);
    А она, похоже, важная, т.к. без неё нихера не работает.

    Держи на пиво, или на что ты там собираешь )))

    P.S. Ещё вот эти wgLDAPRequiredGroups и wgLDAPExcludedGroups подкорректируй, они вообще не от этого скрипта щас, домен другой.

    • Это ответ на комментарий Павел

      Спасибо ! Рад что статья смогла вам помочь !

      Поправил в скрипте 🙂

  • Здравствуйте! Подскажите, пожалуйста, сделал как у Вас в статье, а при вводе логина/пароля пишет что не верный логин или пароль. А при входе под учетной записью такой же как и локальная пускает

    • Это ответ на комментарий developman27

      Добрый ! Только что проверил, указанный в статье конфиги верные, у меня все по ним работает. Даже не знаю что и сказать почему не работает, смотрите логи