Содержание

Аутентификация через Active Directory

Это серверное расширение (backend) позволяет проводить аутентификацию пользователей с помощью Active Directory.

Аутентификация Active Directory может быть настроена через аутентификацию ​auth:​LDAP,​ однако это сделать гораздо проще с помощью специально созданного расширения DokuWIki. Для взаимодействия с AD в DokuWiki используется отличная библиотека adLDAP, которая основана на работе 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.

Возможно потребуется установить как минимум следующие опции:

 <?php
  // общие настройки DokuWiki
  $conf['useacl']         = 1;
  $conf['disableactions'] = 'register';
  $conf['authtype']       = 'ad';
 
  // настройки Active Directory
  $conf['auth']['ad']['account_suffix']     = '@my.domain.org';
  $conf['auth']['ad']['base_dn']            = 'DC=my,DC=domain,DC=org';
  $conf['auth']['ad']['domain_controllers'] = 'srv1.domain.org, srv2.domain.org'; //через запятую можно перечислить 
                                                                                  //несколько контроллеров домена

Можно указать дополнительные параметры:

  $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. Детальное описание этих настроек можно получить в документации по 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

Изменение профиля пользователя и пароля

devel:develonly

Пользователи могут изменить их настройки (имя, почтовый адрес и пароль) используя кнопку «Профиль». Это может потребовать выделения соответствующих привилегий для пользователя, от имени которого DokuWiki работает с AD (этот пользователь указан в настройках ad_username и ad_password). При этом изменение пароля доступно только через SSL или TLS соединение. См. раздел LDAP over SSL в документации на библиотеку adLDAP.

Также необходимо помнить, что автоматически создаваемые DokuWiki пароли не удовлетворяют политикам безопасности, использованным по умолчанию в Active Directory. В таком случае либо исправьте соответствующие политики AD, либо выключите функцию «Напомнить пароль» в DokuWiki в настройках 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):

  1. Open the IIS configuration console using «Start» → «Run» → inetmgr
  2. Right click on the «Default Web Site» entry and choose «Properties»
  3. Switch to the «Directory Security» tab
  4. Click the «Edit» button on «Anonymous access and authentication control».
  5. Disable «Anonymous access»
  6. Enable «Integrated Windows Authentication»

step1.jpg step2.jpg step3.jpg

Then make sure NTLM is used as authentication protocol. This has to be done on the commandline:

  1. Open a command line: «Start» → «Run» → cmd
  2. Change to the admin script directory: cd \Inetpub\Adminscripts
  3. Check the current protocol: cscript adsutil.vbs get w3svc/NTAuthenticationProviders
  4. 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 

<Directory "c:/wamp/www/">
    AuthName "My Intranet"
    AuthType SSPI
    SSPIAuth On
    SSPIAuthoritative On

    require valid-user

</Directory>

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 добавляем:

 <Location />
      AuthType NTLM
      NTLMAuth On
      NTLMAuthoritative OFF
      NTLMDomain domain.ru
      NTLMServer name-server.domain.ru
      NTLMBackup name-server.domain.ru
      require valid-user
  </Location>

Конфигурируем 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

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!

  1. Install Kerberos client1)
  2. Install mod_auth_kerb2)
  3. 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
     }
  4. Verify that the time on the DokuWiki server is within 5 minutes of the Active Directory server. Otherwise Kerberos will not authenticate.
  5. 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.
  6. 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 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.

  7. If no errors occurred, copy the keytab file to /etc/httpd/conf/.
  8. Create /etc/httpd/conf.d/dokuwiki.conf:
    <Directory "/var/www/html/dokuwiki">
            # Kerberos Auth
            AuthType Kerberos
            KrbAuthRealms YOURDOMAIN.COM
            KrbServiceName HTTP
            Krb5Keytab /etc/httpd/conf/dokuwiki.HTTP.keytab
            KrbMethodNegotiate on
            KrbMethodK5Passwd on
            require valid-user
    </Directory>
  9. (Re)start Apache: service httpd restart.
Troubleshooting

Browser

Your browser needs to be setup to forward authentication info to the Webserver.

Setup MS Internet Explorer

FIXME add detailed description

  1. add dokuwiki server to trusted zone
  2. Enable authentication forwarding (Windows Integrated Authentication). Restart your browser to complete the change. IE 8 shown here:

Setup Firefox

  1. Open Firefox and type about:config in the address bar.
  2. 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
  3. Double click the name of the preference that we just searched for
  4. 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.

1)
Redhat: yum install krb5-workstation, Debian: krb5-user
2)
Redhat: yum install mod_auth_kerb, Debian: libapache2-mod-auth-kerb