Моя цель состоит в том, чтобы 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").
Настройте имя хоста и DNS и добавьте записи A и PTR в DNS-сервер Windows. Разрешение имени появляется ОК.
Создайте /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:
net ads join createupn=HOST/centos.site.example.com@SITE.EXAMPLE.COM -k -U administrator
спрашивает у меня пароль Windows и принимает его. Он присоединяется к домену (создает компьютерный объект в AD).
net ads testjoin
сообщает "присоединиться нормально".
net ads keytab create -k -U administrator
создает /etc/krb5.keytab
и наполняет его HOST/centos....
перестановки.
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:
chgrp apache /etc/krb5.keytab
chmod ugo+r /etc/krb5.keytab
yum install mod_auth_kerb
редактировать /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, вы должны увидеть файлы, в противном случае вам будет отказано в доступе.