====== Аутентификация через Active Directory ====== Это [[doku>auth| серверное расширение (backend)]] позволяет проводить аутентификацию пользователей с помощью Active Directory. Аутентификация Active Directory может быть настроена через аутентификацию [[doku>​auth:​LDAP]],​ однако это сделать гораздо проще с помощью специально созданного расширения DokuWIki. Для взаимодействия с AD в DokuWiki используется отличная [[http://​adldap.sourceforge.net/​|библиотека adLDAP]], которая основана на работе [[http://​www.nosq.com/​blog/​2005/​08/​ldap-activedirectory-and-dokuwiki/​|James Van Lommel]]. Эта библиотека включена в установку DokuWiki, так что нет необходимости её отдельно загружать и устанавливать. И ко всему прочему эта библиотека позволяет использовать простую (Single-Sign-On) авторизацию NTLM и Kerberos. Для начала настройки необходимо включить предустановленный плагин. Серверное расширение включено в дистрибутив DokuWiki начиная с версии rc2009-12-02 "Mulled Wine". Также будет необходимо включить поддержку LDAP на PHP сервере. По умолчанию PHP не поддерживает LDAP. В большинстве случаев нужно просто отредактировать php.ini чтобы включить поддержку LDAP, однако надо проверить установку PHP, если на вашем сервере установлена нестандартная сборка PHP. ===== Настройка ===== Во избежании потери данных при перезаписи их менеджером настройки рекомендуется все настройки производить в файле ''conf/local.protected.php''. Возможно потребуется установить как минимум следующие опции: Можно указать дополнительные параметры: $conf['auth']['ad']['ad_username'] = 'root'; $conf['auth']['ad']['ad_password'] = 'pass'; $conf['auth']['ad']['sso'] = 1; $conf['auth']['ad']['real_primarygroup'] = 1; $conf['auth']['ad']['use_ssl'] = 1; $conf['auth']['ad']['use_tls'] = 1; $conf['auth']['ad']['debug'] = 1; $conf['auth']['ad']['recursive_groups'] = 1; // Если в AD содержится много групп, переключение этого параметра // в 0 улучшит скорость работы, но неявное членство в группах перестанет работать ''ad_username'' и ''ad_password'' необходимы для реализации подписки на изменения. Этот аккаунт используется для запроса информации о пользователе из AD. Для установки прав суперпользователя можно использовать следующую конструкцию: $conf['manager'] = '@LDAPGROUPNAME'; $conf['superuser'] = '@LDAPGROUPNAME'; Любые другие настройки, указанные в $conf['auth']['ad'], напрямую передаются в библиотеку adldap. Детальное описание этих настроек можно получить в [[http://adldap.sourceforge.net/wiki/doku.php?id=api|документации по adLDAP]]. В комбинации с аутентификацией Single-Sign-On также можно добавить настройки домена Windows. То есть проводить аутентификацию на разных AD в зависимости от домена NTLM или Kerberos конкретного пользователя. Для этого надо использовать название домена (в нижнем регистре) как подключ в ''$conf['auth']['ad']''. Т.е. для того, чтобы идентифицировать всех пользователей, пришедших из домена Windows ''Foobar'' через сервер AD, отличный от сервера по умолчанию, нужно добавить следующие строчки в конфигурационный файл: $conf['auth']['ad']['foobar']['account_suffix'] = '@foobar.domain.org'; $conf['auth']['ad']['foobar']['base_dn'] = 'DC=foobar,DC=domain,DC=org'; $conf['auth']['ad']['foobar']['domain_controllers'] = 'otherad.domain.org'; $conf['auth']['ad']['foobar']['ad_username'] = 'otherroot'; $conf['auth']['ad']['foobar']['ad_password'] = 'otherpass'; Если в организации используется система из нескольких контроллеров домена с единым родительским контроллером, может потребоваться указать порт 3268, вместо порта по умолчанию 389. В противном случае DokuWiki может не получить информации о группах пользователей дочернего домена. Самый простой способ сделать это - исправить исходники adLDAP.php, так как все вызовы к ldap_connect содержат порт в качестве отдельного аргумента функции. 5 ===== Изменение профиля пользователя и пароля ===== [[doku>devel:develonly]] Пользователи могут изменить их настройки (имя, почтовый адрес и пароль) используя кнопку "Профиль". Это может потребовать выделения соответствующих привилегий для пользователя, от имени которого DokuWiki работает с AD (этот пользователь указан в настройках ''ad_username'' и ''ad_password''). При этом изменение пароля доступно только через SSL или TLS соединение. См. раздел [[http://adldap.sourceforge.net/wiki/doku.php?id=ldap_over_ssl|LDAP over SSL]] в документации на библиотеку adLDAP. Также необходимо помнить, что автоматически создаваемые DokuWiki пароли не удовлетворяют политикам безопасности, использованным по умолчанию в Active Directory. В таком случае либо исправьте соответствующие политики AD, либо выключите функцию "Напомнить пароль" в DokuWiki в настройках [[doku>config:disableactions]]. ===== Имена пользователей и групп ===== Имена пользователей и групп при экспорте автоматически преобразуются в формат DokuWiki и могут отличаться от указанных на сервере Active Directory. Пробелы заменяются символом подчёркивания, а символы %%\%% и %%#%% удаляются. Пример: ''Domain Users'' станет ''Domain_Users'' в DokuWiki. Если необходимо отредактировать файл с ACL вручную, нужно помнить, что правильная форма: ''Domain%5fUsers''. Где "%5f" символ подчёркивания. Об этом необходимо помнить, указывая имена пользователей и групп при настройке прав доступа в DokuWiki. ===== Включение Single Sign On ===== Single Sign On (SSO) обозначает, что DokuWiki будет использовать логин пользователя, под которым работает пользователь Windows без необходимости введения логина и пароля на сайте. Эта функция использует настройки сервера и читает значение из переменной окружения ''REMOTE_USER''. При этом подсистема аутентификации через AD в DokuWiki будет использовать это имя для получения дополнительной информации, например информации о том, к каким группа пользователей относится имя. Для того, чтобы эта функция заработала, необходимо включить настройку ''sso'' в ''local.protected.php'' и скорее всего настроить служебный аккаунт, добавив ему возможность получать информацию о пользователях AD: $conf['auth']['ad']['sso'] = 1; $conf['auth']['ad']['ad_username'] = 'MyManager'; $conf['auth']['ad']['ad_password'] = 'ManagerPass'; Также необходимо дополнительно установить дополнительные настройки на сервере и в браузере. ==== Web Server ==== === NTLM on IIS === First configure IIS to use the Windows Logon for authentication (see screenshots): - Open the IIS configuration console using "Start" -> "Run" -> ''inetmgr'' - Right click on the "Default Web Site" entry and choose "Properties" - Switch to the "Directory Security" tab - Click the "Edit" button on "Anonymous access and authentication control". - Disable "Anonymous access" - Enable "Integrated Windows Authentication" {{http://www.dokuwiki.org/_media/auth:step1.jpg?330}} {{http://www.dokuwiki.org/_media/auth:step2.jpg?230}} {{http://www.dokuwiki.org/_media/auth:step3.jpg?170}} Then make sure NTLM is used as authentication protocol. This has to be done on the commandline: - Open a command line: "Start" -> "Run" -> ''cmd'' - Change to the admin script directory: ''cd \Inetpub\Adminscripts'' - Check the current protocol: ''cscript adsutil.vbs get w3svc/NTAuthenticationProviders'' - if it doesn't say NTLM, set it: ''cscript adsutil.vbs set w3svc/NTAuthenticationProviders "NTLM"'' Now restart IIS. === NTLM on Apache (Windows) === Download [[http://sourceforge.net/projects/mod-auth-sspi/]] Copy the mod_auth_sspi.so file into your apache modules directory. Add into httpd.conf: LoadModule sspi_auth_module modules/mod_auth_sspi.so AuthName "My Intranet" AuthType SSPI SSPIAuth On SSPIAuthoritative On require valid-user Now restart Apache === NTLM on Apache (Linux) === == Ubuntu Server 11.04== **Скачиваем модуль mod_ntlm для Apache.** $ sudo wget http://modntlm.sourceforge.net/mod_ntlm2.tar.gz **Распаковываем архив:** $ tar -zxvf mod_ntlm2.tar.gz **Необходимо обновить систему:** $ sudo apt-get update **Устанавливаем gcc:** $ sudo apt-get install gcc **Устанавливаем Apache prefork и gcc 3.4:** $ sudo apt-get install apache2-prefork-dev gcc-3.4 **Линкуем компилятор gcc версии 3.4 с установленным в системе:** $ ln -fs /usr/bin/gcc-3.4 /usr/bin/gcc **Далее компилируем mod_ntlm.c** $ sudo apxs2 -i -a -c mod_ntlm2/mod_ntlm.c **Далее, в /etc/apache2/mods-available создать файл ntlm.load и добавить в него строку с загрузкой модуля:** LoadModule ntlm_module /usr/lib/apache2/modules/mod_ntlm.so **Запустить модуль** $ sudo a2enmod ntlm **В файле /etc/apache2/httpd.conf добавляем:** AuthType NTLM NTLMAuth On NTLMAuthoritative OFF NTLMDomain domain.ru NTLMServer name-server.domain.ru NTLMBackup name-server.domain.ru require valid-user ** Конфигурируем Apache2 /etc/apache2/apache2.conf** KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 **Перезапускаем Apache:** $ sudo service apache2 restart == Примеры == http://twiki.org/cgi-bin/view/Codev/TWikiOnUbuntuWindowsAuthentication http://dimka.yz74.ru/2009/09/23/ubuntu-ntlm-apache/ === Kerberos on Apache (Linux) === This setup enables an Apache Server on Linux to verify Kerberos Tickets against an Active Directory server. Good references for Apache/Kerberos can be found at * http://www.grolmsnet.de/kerbtut/ * http://www.itefix.no/i2/node/11683 The following examples assume your wiki to be running on ''dokuwiki.yourdomain.com'', with your Active Directory server running at ''dc1.yourdomain.com''; **Note: Kerberos is case sensitive, if it is all caps - it should be!** - Install Kerberos client((Redhat: yum install krb5-workstation, Debian: krb5-user)) - Install mod_auth_kerb((Redhat: yum install mod_auth_kerb, Debian: libapache2-mod-auth-kerb)) - Configure Kerberos if necessary, sample ''/etc/krb5.conf'': [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = YOURDOMAIN.COM ticket_lifetime = 24h forwardable = yes [realms] YOURDOMAIN.COM = { kdc = dc1.yourdomain.com admin_server = dc1.yourdomain.com default_domain = yourdomain.com } [domain_realm] dokuwiki.yourdomain.com = YOURDOMAIN.COM .yourdomain.com = YOURDOMAIN.COM yourdomain.com = YOURDOMAIN.COM [appdefaults] pam = { debug = false ticket_lifetime = 36000 renew_lifetime = 36000 forwardable = true krb4_convert = false } - Verify that the time on the DokuWiki server is within 5 minutes of the Active Directory server. Otherwise Kerberos will not authenticate. - Verify that the Kerberos environment is working by running: kinit username@YOURDOMAIN.COM klist kdestroy (If you get any errors here, make sure your DNS setup is working and you wrote all marked as "YOURDOMAIN.COM" hosts in uppercase in your krb5.conf. Try resolve every hostname manually. - Create a keytab file for your DokuWiki server. Make sure you have created a non-admin user in Active Directory with no password expiration. Run this as a Domain Admin on a Windows server with Support Tools installed:ktpass -princ HTTP/dokuwiki.yourdomain.com@YOURDOMAIN.COM -mapuser name_of_ad_user_you_have_created -crypto DES-CBC-MD5 -ptype KRB5_NT_PRINCIPAL -mapop set +desonly -pass the_ad_users_password -out dokuwiki.HTTP.keytab Use the following if you're running Windows 7/Server 2008 R2 clients because [[http://technet.microsoft.com/en-us/library/dd560670(WS.10).aspx|des is disabled by default]] on these operating systems: ktpass -princ HTTP/dokuwiki.yourdomain.com@YOURDOMAIN.COM -mapuser name_of_ad_user_you_have_created@yourdomain.com -crypto DES-CBC-MD5 -ptype KRB5_NT_PRINCIPAL -pass the_ad_users_password -out dokuwiki.HTTP.keytab RC4-HMAC is supported on Windows 2000 and higher. - If no errors occurred, copy the keytab file to /etc/httpd/conf/. - Create /etc/httpd/conf.d/dokuwiki.conf: # Kerberos Auth AuthType Kerberos KrbAuthRealms YOURDOMAIN.COM KrbServiceName HTTP Krb5Keytab /etc/httpd/conf/dokuwiki.HTTP.keytab KrbMethodNegotiate on KrbMethodK5Passwd on require valid-user - (Re)start Apache: service httpd restart. == Troubleshooting == * Restart Apache. Web server config changes won't apply until restarted. * Try using the FQDN of the DokuWiki server, i.e. http://dokuwiki.yourdomain.com/dokuwiki. * If you are presented with a login window, do not enter domain/realm info, just user name and password. * Verify that the time on the DokuWiki server is within 5 minutes of the Active Directory server. Otherwise Kerberos will not authenticate. * Check all Kerberos files for case inconsistencies. * Review this instruction from start to end. See reference links where possible. ==== Browser ==== Your browser needs to be setup to forward authentication info to the Webserver. === Setup MS Internet Explorer === FIXME add detailed description - add dokuwiki server to trusted zone - Enable authentication forwarding (Windows Integrated Authentication). Restart your browser to complete the change. IE 8 shown here: {{http://img97.imageshack.us/img97/9099/ieenableintegratedwindo.jpg|}} === Setup Firefox === - Open Firefox and type //about:config// in the address bar. - In the ‘Filter’ field type one of the following (depending if you're using NTLM or Kerberos) //network.automatic-ntlm-auth.trusted-uris// or //network.negotiate-auth.trusted-uris// - Double click the name of the preference that we just searched for - Enter the URLs of the sites you wish to pass NTLM auth info to in the form of: http://intranet.company.com,http://email.company.lan Notice that you can use a comma separated list in this field. ~~DISCUSSION:off~~