Интеграция аутентификации 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
Понравилась или оказалась полезной статья, поблагодари автора
Добрый день,
наткнулись на проблему уже на этапе апдейта, при инициализации 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.
Или укажите свою почту для связи.
Добрый, некоторое время назад отказались от данной платформы, поэтому выкладывать для вас нечего..
а какую платформу стали использовать?
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 ?
Добрый!
Без понятия, не тестировал на других версиях.
Здравствуйте. Подскажите пожалуйста. Сделал вроде всё по аналогии, но не получается. В логах появляется такое
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. В моём случае это решило проблему.
Аналогичная проблема
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 подкорректируй, они вообще не от этого скрипта щас, домен другой.
Спасибо ! Рад что статья смогла вам помочь !
Поправил в скрипте 🙂
Здравствуйте! Подскажите, пожалуйста, сделал как у Вас в статье, а при вводе логина/пароля пишет что не верный логин или пароль. А при входе под учетной записью такой же как и локальная пускает
Добрый ! Только что проверил, указанный в статье конфиги верные, у меня все по ним работает. Даже не знаю что и сказать почему не работает, смотрите логи