Настройка AD-аутентификации в Apache под Linux и FreeBSD


Работу можно разбить на два этапа — установка и настройка Kerberos (низкоуровневая работа с ключами и авторизация в домене) и настройка модуля веб-сервера.

Настройка Kerberos

Для аутентификации в доменах AD под ОС Linux и FreeBSD используется MIT Kerberos V. Нам понадобятся только клиентские библиотеки и утлиты, серверная часть MIT Kerberos не нужна, т. к. в качестве сервера выступает контроллер домена AD под Windows. Нужно установить соответствующиt пакет, в зависимости от дистрибутива:

Debian, Ubuntu

apt-get install krb5-user

RHEL, Fedora

yum install krb5-client-apps

SLES, OpenSUSE

zypper install krb5-client

После установки пакета, необходимо настроить его для домена. Параметры конфигурации Kerberos находятся в файле /etc/krb5.conf:

[libdefaults]
default_realm = IPI.LOCAL

[realms]
IPI.LOCAL = {
    kdc = w2003.ipi.local
}

[domain_realm]
.ipi.local = IPI.LOCAL
ipi.local = IPI.LOCAL

В данном примере:

w2003.ipi.local

fqdn адрес KDC (AD) сервера.

IPI.LOCAL

домен

секция domain_realm

используется для управления привязками url <=> domain. Т.е. если адрес у вебсервера будет abc.xyz.ru, но домен — IPI.LOCAL, то необходимо прописать привязку abc.xyz.ru = IPI.LOCAL или .xyz.ru = IPI.LOCAL. Если этого не сделать, то по умолчанию для адреса abc.xyz.ru доменом будет XYZ.RU.

Файл /etc/krb5.conf должен быть доступен для чтения всем пользователям системы (рекомендуемые права доступа — 644):

$ ls -l /etc/krb5.conf
-rw-r--r-- 1 root root 152 2011-09-23 14:48 /etc/krb5.conf

Далее нужно проверить, может ли эта конфигурация дать нам возможность работы в домене (если доступа с линукса до AD сервера прямого нет (например сервер находится в интернете, а контроллер AD — в офисной сети), то этот шаг можно пропустить, но без него ловить ошибки намного сложнее):

$ kinit Administrator
Password for Administrator@IPI.LOCAL:
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: Administrator@IPI.LOCAL

Valid starting     Expires            Service principal
09/23/11 14:50:50  09/24/11 00:50:51  krbtgt/IPI.LOCAL@IPI.LOCAL
        renew until 09/24/11 14:50:50

$ kdestroy

kinit запрашивает у контроллера домена ключ авторизации для указанного пользователя — так называемый ticket-granting ticket. При этом запрашивается пароль (нужно ввести пароль соответствующего пользователя AD). Комманда klist показывает текущие действующие ключи авторизации. А kdestroy это некий logout: эта команда удаляет все полученные ключи, если таковые имеются.

Если авторизация проходит нормально, и AD выдаёт нам ключ, можно приступать к следующему шагу.

 

Создание ключа Kerberos для UNIX-машины

Для начала нужно создать в AD учётную запись для сервиса Apache на UNIX-машине. Открываем Administrative Tools -> Active Directory Users and Computers -> Computers -> клик правой кнопкой -> New -> Computer. Вводим имя учётной записи — в нашем примере это будет linuxbox. Жмём Next, Next, Finish. В списке компьютеров должна появиться учётная запись linuxbox.

Теперь нам нужно создать ключ, который Apache на UNIX-машине будет использовать для аутентификации доменных пользователей. Ключ создаётся на Windows-машине с помощью утилиты ktpass.exe. В Windows Server 2003 её нужно установить из пакета Microsoft Server SupportTools, имеющегося на диске с Windows Server. В Windows Server 2008 она уже установлена. Открываем окно командной строки (cmd.exe) и набираем:

Для Windows Server 2003:

ktpass -princ HTTP/linuxbox.ipi.local@IPI.LOCAL -mapuser linuxbox$@IPI.LOCAL -crypto RC4-HMAC-NT -ptype KRB5_NT_SRV_HST +rndpass -out c:\keytab

Для Windows Server 2008:

ktpass -princ HTTP/linuxbox.ipi.local@IPI.LOCAL -mapuser linuxbox$@IPI.LOCAL -crypto ALL -ptype KRB5_NT_SRV_HST +rndpass -out c:\keytab

Здесь HTTP/linuxbox.ipi.local@IPI.LOCAL — имя принципала Kerberos для нашего HTTP-сервера на UNIX-машине. Вместоlinuxbox.ipi.local нужно подставить правильное DNS-имя вашей UNIX-машины, на которой будет запущен IPI.Manager, а вместо IPI.LOCAL — ваш домен. linuxbox$@IPI.LOCAL — имя учётной записи, которую мы только что создали, вместе с именем домена. Обратите внимание, после имени здесь добавляется знак $, чтобы команда ktpass.exe догадалась, что это учётная запись компьютера, а не человека.

На вопрос «Reset LINUXBOX$’s password [y/n]?» нужно ответить y.

Результат выполнения команды должен быть примерно таким:

Targeting domain controller: win2003-virtual.ipi.local
Using legacy password setting method
Successfully mapped HTTP/linuxbox.ipi.local to LINUXBOX$.
WARNING: Account LINUXBOX$ is not a user account (uacflags=0x1021).
WARNING: Resetting LINUXBOX$'s password may cause authentication problems if LINUXBOX$ is being used as a server.

Reset LINUXBOX$'s password [y/n]? y
Key created.
Output keytab to c:\keytab:
Keytab version: 0x502
keysize 67 HTTP/linuxbox.ipi.local@IPI.LOCAL ptype 3 (KRB5_NT_SRV_HST) vno 7 etype 0x17 (RC4-HMAC) keylength 16 (0x3c6a3271e382f041dcf2c82b7f413383)

Полученный ключ надо скопировать на UNIX-машину и поместить, например, например, в /etc/krb5/ipi.keytab. После чего проверить его работоспособоность: без рабочего ключа работать ничего не будет!

$ klist -ket /etc/krb5/ipi.keytab
Keytab name: WRFILE:/etc/krb5/ipi.keytab
KVNO Timestamp         Principal
---- ----------------- --------------------------------------------------------
  3 01/01/70 03:00:00 HTTP/linuxbox.ipi.local@IPI.LOCAL (arcfour-hmac)
$ kinit -kt /etc/krb5/ipi.keytab HTTP/linuxbox.ipi.local@IPI.LOCAL
$ kvno HTTP/linuxbox.ipi.local@IPI.LOCAL
HTTP/linuxbox.ipi.local@IPI.LOCAL: kvno = 3
$ klist -e
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: HTTP/linuxbox.ipi.local@IPI.LOCAL

Valid starting     Expires            Service principal
09/23/11 16:59:35  09/24/11 02:59:33  krbtgt/IPI.LOCAL@IPI.LOCAL
        renew until 09/24/11 16:59:35, Etype (skey, tkt): arcfour-hmac, arcfour-hmac
09/23/11 17:03:44  09/24/11 02:59:33  HTTP/densetsu.ipi.local@IPI.LOCAL
        renew until 09/24/11 16:59:35, Etype (skey, tkt): arcfour-hmac, arcfour-hmac
$ kdestroy

На что обратить внимание: KVNO обязан совпадать с тем, который Windows показывала при создании ключа. Шифрование тоже должно совпадать. Команда kinit не должна выдавать никаких ошибок. Если всё ОК, то можно вздохнуть с облегчением: с 70% вероятностью всё сделано правильно и дополнительных издевательств не потребует.

Установка модуля веб-сервера Apache

Для Kerberos-аутентификации используется используется модуль Apache mod_auth_kerb. В Debian и Ubuntu нужно установить пакет libapache2-mod-auth-kerb, в RHEL/Fedora и большинстве других дистрибуивах — просто mod_auth_kerb.

Устанавливаем правильные права на наш keytab:

chown www-data /etc/krb5/ipi.keytab
chmod 400 /etc/krb5/ipi.keytab

Вместо www-data нужно подставить пользователя, из-под которого запускается Apache, чтобы mod_auth_kerb имел доступ к этому файлу на чтение. От всех остальных пользователей этот файл должен быть закрыт.

Добавляем в конфигурацию Apache:

<Location />
    AuthType Kerberos
    Krb5Keytab /etc/krb5/ipi.keytab
    KrbServiceName HTTP/linuxbox.ipi.local@IPI.LOCAL
    Require valid-user
</Location>

Здесь:

Krb5Keytab

путь к ключу, созданному выше.

KrbAuthRealms

список доменов (большими буквами, через пробел) для которых необходимо пробовать авторизацию.

KrbServiceName

имя принципала Kerberos, которое вы укзаали при создании ключа с помощью ktpass.exe.

Остальные параметры конфигурации mod_auth_kerb описаны тут: http://modauthkerb.sourceforge.net/configure.html

При использовании опции MARK_TASKS_AS_READ_BY_MAGIC_IMAGE нужно также разрешить доступ к «магическому» изображению без пароля:

<Location /tasks/mark_as_read/logo.jpg>
    Satisfy any
</Location>

Если добавить сайт в настройках IE в зону «intranet» и у зоны проставить «Automatic logon in Intranet Zone» или добавить в зону «trusted sites» и у зоны проставить «Automatic logon with current username and password», то при заходе на сайт авторизация должна проходить автоматически, т. е. без ввода имени пользователя и пароля. Если по каким-либо причинам этого не происходит, то необходимо у Apache включить уровень лога на уровень Debug и изучать error_log. Основными причинами могут быть (начиная с самых частых):

  • Несоответствие адреса HTTP-сервера и имени принципала Kerberos. То есть, если при создании ключа вы указалиHTTP/linuxbox.ipi.local@IPI.LOCAL, то для того, чтобы браузер задействовал прозрачную аутентификацию, нужно заходить именно на URLhttp://linuxbox.ipi.local/.

  • Использование IP-адреса сервера вместо DNS-имени. По сути, проблема та же, что и в предыдущем пункте.

  • Рассинхронизация даты и времени у серверов Linux и Windows. Системное время должно быть синхронизировано! Авторизация становится невозможной уже при рассинхронизации в 5 минут.

    Невозможность Apache получить доступ к keytab файлу или файлу /etc/krb.conf.

    Старая версия Kerberos. Автоматическая авторизация работает ТОЛЬКО на версиях 1.5 и выше. Посмотреть версию можно коммандойkrb5-config --version.

  • Неправильный keytab. Если вы в точности повторили все шаги указанные выше в руководстве создания keytab — то этой проблемы не должно быть.

  • Отключенный механизм авторизации Negotiate у Internet Explorer. В таком случае в логе при уровне debug должно появляться сообщение о том что «нашли заголовки NTLM, но kerberos не поддерживает NTLM! Возможно у Internet Explorer отключен Negotiate». Галочка находится в настройках Internet Explorer, в Advanced, секция Security, параметр “Enable Integrated Windows Authentication (Requires Restart)”.