Авторизация в Apache 2.4 с помощью NTLM / Active Directory Single Sign On
Примечание
- Принимаем во внимание, что ваше веб-приложение должно будет проверять переменную $_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