Назад | Перейти на главную страницу

Аутентификация Apache kerberos в Active Directory не происходит. (Связан ли KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN?)

Моя цель состоит в том, чтобы Apache аутентифицировал аутентификацию в AD без запроса имени пользователя и пароля, используя Kerberos. В настоящее время он всегда показывает «401 Unauthorized» и, похоже, не пытается использовать Kerberos. Я не могу найти никаких журналов ошибок и могу найти только один kinit команда, которая явно не работает и выдает ошибку - эта ошибка отображается в WireShark как:

Linux sends AS-REQ
Windows replies KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN

Подсказка или отвлекающий маневр?

Сведения о настройке / фоне

Windows Server 2008 R2 SP1, with Active Directory ("winserver").
CentOS 6.5 ("centos").
  1. Настройте имя хоста и DNS и добавьте записи A и PTR в DNS-сервер Windows. Разрешение имени появляется ОК.

  2. Создайте /etc/krb5.conf и /etc/samba/smb.conf с помощью authconfig-tui и настроить их.

krb5.conf

`/etc/krb5.conf`

[libdefaults]
 default_realm = SITE.EXAMPLE.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 SITE.EXAMPLE.COM = {
  kdc = winserver.site.example.com
  admin_server = winserver.site.example.com
 }

[domain_realm]
 site.example.com = SITE.EXAMPLE.COM

и самба

`/etc/samba/smb.conf` includes

workgroup = SITE
password server = winserver
realm = SITE.EXAMPLE.COM
security = ads
kerberos method = system keytab
winbind use default domain = true

Отсюда шаги по настройке Kerberos:

  1. net ads join createupn=HOST/centos.site.example.com@SITE.EXAMPLE.COM -k -U administrator спрашивает у меня пароль Windows и принимает его. Он присоединяется к домену (создает компьютерный объект в AD).

  2. net ads testjoin сообщает "присоединиться нормально".

  3. net ads keytab create -k -U administrator создает /etc/krb5.keytab и наполняет его HOST/centos.... перестановки.

  4. net ads keytab add HTTP -k -t /etc/krb5.keytab -U administrator добавляет HTTP/centos.site.example.com записи на keytab. klist -ke показывает множество комбинаций SPN, включая HTTP/centos.site.example.com@SITE.EXAMPLE.COM и, похоже, соответствует KVNO с атрибутом msDS-KeyVersionNumber Windows на объекте сервера.

На этом этапе я могу подключиться по SSH с помощью PuTTY и автоматически войти в систему с помощью SSO без запроса пароля. Я могу подключиться по SSH и принудительно запросить пароль, использовать имя пользователя и пароль Windows и войти в систему. После входа в систему с использованием учетной записи Windows я могу kinit а потом klist см. билеты Kerberos. я могу использовать wbinfo -u и wbinfo -g и net ads search для запроса AD и получения результатов.

Все выглядит хорошо. Перейдем к Apache:

  1. chgrp apache /etc/krb5.keytab

  2. chmod ugo+r /etc/krb5.keytab

  3. yum install mod_auth_kerb

  4. редактировать /etc/httpd/conf/httpd.conf и добавить:

httpd.conf

LoadModule auth_kerb_module /usr/lib64/httpd/modules/mod_auth_kerb.so

AuthName "Kerberos Authentication"
AuthType Kerberos

Krb5Keytab /etc/krb5.keytab
KrbAuthRealms SITE.EXAMPLE.COM
KrbMethodNegotiate on
KrbMethodK5Passwd off
KrbServiceName Any

В Internet Explorer "сайты местной интрасети" включают http://*.site.example.com и настроен на «автоматический вход только в зону интрасети». Автоматический вход работает для других (на основе IIS) веб-сайтов в офисе с этими настройками. В FireFox about: config имеет network.negotiate-auth.trusted-uris; .site.example.com.

В IE, FireFox или Chrome я захожу на сайт с полным доменным именем, получаю 401 Unauthorized. Похоже, что Kerberos даже не пробуют.

Я не могу найти ничего в файлах журнала Linux, / var / log / httpd / error_log или access_log / var / log / secure или /var/log/audit/audit.log, чтобы показать, что что-то идет не так.

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

$ kinit -k -t /etc/krb5.keytab HTTP/centos.site.example.com
kinit: Client not found in Kerberos database while getting initial credentials

Я точно не знаю, что он делает, но если я использую WireShark:

Linux sends AS-REQ to Windows with content
    cname name-string 2 items
    KerberosString: HTTP
    KerberosString: centosserver.site.example.com
    realm: SITE.EXAMPLE.COM
Windows replies KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN 
    error-code eRR-C-PRINCIPAL-UNKNOWN (6)

В Windows, если я использую setspn -L centos он показывает, что зарегистрированные основные имена включают HTTP / centos.site.example.com.

На моем настольном клиенте Windows, если я klist get HTTP/centos.site.example.com тогда я получаю билет, отображаемый как Client: myusername@SITE.EXAMPLE.COM, Server: HTTP / centos.site.example.com.

Это немного похоже на http://support.microsoft.com/kb/951191 - но это применимо только к оригинальной Windows Server 2008, до пакета обновления 2. Это Windows Server 2008 R2 с пакетом обновления 1. Я пытался указать его на другой контроллер домена, но он также работает с той же версией Windows Server и отвечает так же путь.

Со стороны Linux: я работал с CentOS 6.5 (Samba 3.x, Kerberos 5.0), но я также недавно установил CentOS 7 (Samba 4.x и Kerberos 5.1), попробовал ту же настройку и получил то же самое. результаты от kinit. Я не пробовал Apache на CentOS 7.

Безпарольный вход для SSH работает. Авторизация входа в AD работает с kinit. Аутентификация Kerberos не работает в Apache, кажется, она даже не пытается в Apache и не регистрирует никаких ошибок. Что мне не хватает, почему он не пытается проверить подлинность Kerberos? Что я могу протестировать или сделать, чтобы он регистрировался больше?

И единственное, что я могу явно сделать неудачным, - это та команда ^ которую я нашел в Интернете, но я не знаю, что именно она тестирует. Что он делает и почему не работает, когда очевидно, что мой рабочий стол может запрашивать в AD тот же субъект-службу и получать ответ?

[Изменить обновление]

Я последовал ответу natxo asenjo «сделай это по-другому», и теперь у меня есть работающая настройка. Я также согласен с тем, что наличие разных имен пользователей в AD для каждой службы, а затем создание отдельных вкладок ключей является разумным (например, если Apache скомпрометирован и HTTP / keytab, который он может читать, скомпрометирован, HOST / keytab все еще безопасен на некоторое время).

Однако у меня нет ответа на вопрос, почему основной поиск Kerberos в окнах терпел неудачу при моем первоначальном подходе. Что расстраивает, учитывая, что такие руководства, как http://requesttracker.wikia.com/wiki/Kerberos_SSO_with_Active_Directory_Integration и http://wiki.gentoo.org/wiki/Kerberos_Windows_Interoperability поместите несколько участников в одну ключевую вкладку, привязанную к учетной записи компьютера, с помощью команд Samba net ads и (предположительно) получите из нее рабочую настройку.

Я использовал инструкции по http://www.grolmsnet.de/kerbtut/ много раз, потому что они работают. Для записи, вам не нужно присоединять хост linux к домену AD, это нормально, но не обязательно.

Прежде всего, убедитесь, что вы можете выполнить kinit с хоста centos в свою область AD. Вы можете использовать свои обычные учетные данные следующим образом:

$ kinit yourusername@ADREALM.TLD

(кстати, kinit является частью пакета krb5-workstation в centos)

Введите свой пароль, и отсутствие новостей - это хорошие новости. Запустите klist, и вы увидите там билет Kerberos в качестве имени пользователя AD. Если этот шаг не увенчался успехом, вернитесь и исправьте свой krb5.conf, пока он не станет успешным.

Избавьтесь от этого билета с помощью kdestroy.

Как только это сработает, вы можете создать учетную запись пользователя в AD. Убедитесь, что ему не нужно менять свой пароль и что срок действия пароля не истекает.

Затем мы привязываем имя участника службы (spn) HTTP / host.adrealm.tld к этому аккаунту пользователя, используя setspn.exe на хостах Windows с инструментами управления или в контроллере домена в качестве администратора или учетной записи с достаточными привилегиями:

setspn -A HTTP/host.adrealm.tld username [enter]
Registering ServicePrincipalNames for CN=username,OU=service_accounts,dc=adrealm,DC=tld
        HTTP/host.adrealm.tld
Updated object

Теперь мы можем сгенерировать keytab для этого объекта с помощью ktpass.exe (все еще на хосте управления Windows или контроллере домена):

ktpass -princ HTTP/host.adrealm.tld@ADREALM.TLD -pass xxxxx -mapuser username -Ptype KRB5_NT_PRINCIPAL -out host_adrealm_tld.keytab [enter]
Targeting domain controller: DCname.Adrealm.tld
Successfully mapped HTTP/host.adrealm.tld to username.
Password succesfully set!
Key created.
Output keytab to host_adrealm_tld.keytab:
Keytab version: 0x502
keysize 75 HTTP/host.adrealm.tldl@ADREALM.TLD ptype 1 (KRB5_NT_PRINCIPAL)
vno 3 etype 0x17 (RC4-HMAC) keylength 16 (0x037da0f7493b97966e4a19636304064d)

Перенесите этот файл на хост centos и поместите его с разрешениями 640 (root: apache) в /etc/httpd/conf.d/. Если selinux включен, запустите restorecon -rv / etc, чтобы в конечном итоге исправить там контексты selinux.

Вы можете проверить файл keytab с помощью:

$ klist -k -t host_adrealm_tld.keytab 
Keytab name: FILE:host_adrealm_tld.keytab
KVNO Timestamp         Principal
---- ----------------- --------------------------------------------------------
   3 01/01/70 01:00:00 HTTP/host.adrealm.tld@ADREALM.TLD

И вы даже можете сделать еще один шаг, используя его для входа в систему:

# kinit -k -t host_adrealm_tld.keytab -p HTTP/host.adrealm.tld@ADREALM.TLD
# klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: HTTP/host.adrealm.tld@ADREALM.TLD

Valid starting     Expires            Service principal
11/04/14 21:45:41  11/05/14 07:45:41  krbtgt/ADREALM.TLD@ADREALM.TLD
    renew until 11/05/14 21:45:41

В вашей DNS-инфраструктуре (возможно, также и в AD dns) создайте A host.realm.tld, указывающий на хост centos (если вы используете samba для присоединения к хосту, он должен был создать его для вас, убедитесь, что это правильно).

Убедитесь, что на ваших хостах centos установлен mod_auth_kerb.

В этом случае вы редактируете один из файлов конфигурации apache своих (виртуальных) хостов для apache.

В этом случае давайте защитим папку http: //host.adrealm.tld/topsecret:

Alias /topsecret/ "/path/to/topsecret/"

<Directory "/path/to/topsecret/">

    AuthType  Kerberos
    KrbAuthRealms YOURAD.TLD
    KrbServiceName HTTP
    Krb5Keytab /etc/httpd/conf.d/host_adrealm_tld.keytab
    KrbMethodNegotiate on
    KrbMethodK5Passwd off
    require valid-user

</Directory>

Создайте папку topsecret в файловой системе хоста centos. Установите туда пару фиктивных файлов. Если вы запускаете с помощью selinux enable, убедитесь, что папка имеет правильный контекст безопасности для apache (если папка находится в / var / www / html, она должна быть правильной, запуск restorecon -rv / var / www / html в конечном итоге устранит любые проблемы с selinux ).

Убедитесь, что синтаксис apache2 проходит:

apachectl -t

Если вы получили сообщение «Синтаксис ОК» с предупреждениями о невозможности надежного определения хоста fqdn, то все в порядке (вы можете исправить это позже, если хотите, это не критично). Перезагрузите apache:

apachectl graceful 

Убедитесь, что ваш локальный брандмауэр разрешает соединения httpd.

Это должно быть так. Теперь вам нужно настроить клиентов. Если у вас уже есть веб-серверы с «Аутентификацией Windows» в вашей сети, тогда вы настроены, перейдите по URL-адресу topsecret, и если у вас есть действующий билет Kerberos, вы должны увидеть файлы, в противном случае вам будет отказано в доступе.