Примечание

  • Принимаем во внимание, что ваше веб-приложение должно будет проверять переменную $_SERVER['REMOTE_USER'] и идентифицировать пользователя на основании данных из этой переменной.
  • В тексте использовано фиктивное имя домена MYDOMAIN.TLD и его сокращение MYDOMAIN - эти значения необходимо изменить на свои.
  • При использовании в домене браузера Mozilla Firefox поищите в интернете информацию про переменную network.automatic-ntlm-auth.trusted-uris.

Устанавливаем недостающие пакеты

apt-get install libapache2-mod-auth-ntlm-winbind krb5-user samba-common-bin

Редактируем smb.conf

Редактируем файл /etc/samba/smb.conf где в переменной workgroup указываем наш домен в кратком представлении, а в переменной realm указываем FQDN нашего Windows-домена

workgroup = MYDOMAIN
realm = MYDOMAIN.TLD
null passwords = yes
password server = *
security = ads
encrypt passwords = yes
winbind separator = \\
client use spnego = yes
client ntlmv2 auth = yes
winbind refresh tickets = yes

После изменения конфигурационного файла необходимо перезапустить winbind - service winbind restart

Проверяем Kerberos

Получаем билет от домена

kinit Administrator

где Administrator - имя доменного пользователя. Вывода после команды (кроме запроса пароля) не последует.
Затем проверяем полученный билет

klist

Вывод будет что-то вроде

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrator@MYDOMAIN.TLD

Valid starting     Expires            Service principal
11/14/15 16:48:43  11/15/15 02:48:43  krbtgt/MYDOMAIN.TLD@MYDOMAIN.TLD
        renew until 11/15/15 16:48:38

Подключение к домену

Подключаем наш сервер к домену

net ads join -U Administrator

где Administrator - имя доменного пользователя, который имеет право вводить новые машины в домен.
Нормальным завершением этой команды - пустой вывод. Но я иногда получал в ответ ошибку со следующим текстом:

Failed to join domain: failed to set machine kerberos encryption types: Insufficient access

Не смотря на это(!) сервер оказывается в домене, что можно проверить следующей командой:

/usr/bin/ntlm_auth --username Administrator --domain=mydomain.tld

И при правильно введенном пароле будет получен ответ

NT_STATUS_OK: Success (0x0)

Что означает успешную авторизацию в домене.

Настраиваем Apache

Включаем модуль winbind

a2enmod auth_ntlm_winbind

Добавляем пользователя Apache в группу Winbind и «устраняем» баг несоответствия путей (Bug 1304953)

usermod -a -G winbindd_priv www-data
chgrp winbindd_priv /var/lib/samba/winbindd_privileged
ln -s /var/lib/samba/winbindd_privileged/pipe /var/run/samba/winbindd_privileged/pipe

Затем редактируем файл хоста (в данном примере приведет целый VirtualHost, авторизация применяется ко всему каталогу, который обрабатывает Apache)

<VirtualHost *:80>
        <Directory />
                AllowOverride All
                Options -Indexes
        </Directory>
        <Directory /var/www/ntlm-dir>
                Options -Indexes
                AllowOverride All
                Require all granted
        </Directory>
 
        <Location />
                <IfModule mod_auth_ntlm_winbind.c>
                        AuthName "NTLM Authentication"
                        NTLMAuth on
                        NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp"
                        NTLMBasicAuthoritative on
                        AuthType NTLM
                        require valid-user
                </IfModule>
        </Location>
 
        ServerAdmin admin@mydomain.tld
        ServerName ntlm-dir.domain.ltd
        DocumentRoot /var/www/ntlm-dir
 
        ErrorLog ${APACHE_LOG_DIR}/ntlm-dir-error.log
        CustomLog ${APACHE_LOG_DIR}/ntlm-dir-access.log combined
 
</VirtualHost>
  • Если вы создавали новый файл виртуального хоста, не забудьте включить его с помощью a2ensite

После внесенных изменений проверяем валидность всех конфигурационных файлов

~# apache2ctl configtest
Syntax OK

и перезапускаем web-сервер

service apache2 restart