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