Я пытаюсь заставить Apache на Ubuntu 12.04 аутентифицировать пользователей через Kerberos SSO на сервере Windows 2008 Active Directory. Вот несколько вещей, которые меняют мою ситуацию:
У меня нет административного доступа к Windows Server (да и никогда не будет). Я также не могу вносить какие-либо изменения на сервере от моего имени.
Я присоединил сервер Ubuntu к Active Directory, используя открытый PBIS.
Пользователи могут войти на сервер Ubuntu, используя свои учетные данные AD. kinit также отлично работает для каждого пользователя.
Поскольку я не могу изменять AD (кроме добавления новых машин и SPN), я не могу добавить учетную запись службы для Apache в Ubuntu.
Поскольку я не могу добавить учетную запись службы I, мне нужно использовать машинный keytab (/etc/krb5.keytab) или, по крайней мере, использовать машинный пароль в другом keytab. Прямо сейчас я использую машинный keytab и даю Apache доступ только для чтения (я знаю, плохая идея).
Я уже добавил SPN с помощью ключа net ads keytab add HTTP -U
Поскольку я использую Ubuntu 12.04, единственные типы кодировки, которые добавляются во время «добавления ключа net ads», - это arcfour-hmac, des-cbc-crc и des-cbc-md5. PBIS добавляет типы кодировки AES к участникам хоста и cifs, когда он присоединяется к домену, но я еще не получил "net ads keytab add" для этого.
ktpass и setspn исключены из-за пункта 1 выше.
Я настроил (для Kerberos SSO) и протестировал оба IE 8 Firefox.
Я использую следующую конфигурацию в конфигурации моего сайта Apache:
<Location /secured>
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd On
KrbAuthRealms DOMAIN.COM
Krb5KeyTab /etc/krb5.keytab
KrbLocalUserMapping On
require valid-user
</Location>
Когда Firefox пытается подключиться, получите следующее в Apache error.log (отладка LogLevel):
[Wed Oct 23 13:48:31 2013] [debug] src/mod_auth_kerb.c(1628): [client 192.168.0.2] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Oct 23 13:48:31 2013] [debug] mod_deflate.c(615): [client 192.168.0.2] Zlib: Compressed 477 to 322 : URL /secured
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(1628): [client 192.168.0.2] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(994): [client 192.168.0.2] Using HTTP/apache_server.DOMAIN.com@DOMAIN.COM as server principal for password verification
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(698): [client 192.168.0.2] Trying to get TGT for user username@DOMAIN.COM
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(609): [client 192.168.0.2] Trying to verify authenticity of KDC using principal HTTP/apache_server.DOMAIN.com@DOMAIN.COM
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(652): [client 192.168.0.2] krb5_rd_req() failed when verifying KDC
[Wed Oct 23 13:48:37 2013] [error] [client 192.168.0.2] failed to verify krb5 credentials: Decrypt integrity check failed
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(1073): [client 192.168.0.2] kerb_authenticate_user_krb5pwd ret=401 user=(NULL) authtype=(NULL)
[Wed Oct 23 13:48:37 2013] [debug] mod_deflate.c(615): [client 192.168.0.2] Zlib: Compressed 477 to 322 : URL /secured
Когда IE 8 пытается подключиться, я получаю:
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1628): [client 192.168.0.2] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Oct 23 14:03:30 2013] [debug] mod_deflate.c(615): [client 192.168.0.2] Zlib: Compressed 477 to 322 : URL /secured
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1628): [client 192.168.0.2] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1240): [client 192.168.0.2] Acquiring creds for HTTP@apache_server
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1385): [client 192.168.0.2] Verifying client data using KRB5 GSS-API
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1401): [client 192.168.0.2] Client didn't delegate us their credential
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1420): [client 192.168.0.2] GSS-API token of length 9 bytes will be sent back
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1101): [client 192.168.0.2] GSS-API major_status:000d0000, minor_status:000186a5
[Wed Oct 23 14:03:30 2013] [error] [client 192.168.0.2] gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information (, )
[Wed Oct 23 14:03:30 2013] [debug] mod_deflate.c(615): [client 192.168.0.2] Zlib: Compressed 477 to 322 : URL /secured
Дайте мне знать, если вам нужны дополнительные файлы журнала и конфигурации - первоначальный вопрос становится достаточно длинным.
Ответ, приведенный выше, верен, но, к сожалению, вы должны использовать имя службы, указанное на вкладке
sudo ktutil list
SPN AD, насколько я понимаю, являются такими псевдонимами, что когда клиент запрашивает HTTP / apache_server.com, он фактически получает билет службы Kerberos для host / apache_server.com.
Kerberos на стороне unix ничего не знает об этих псевдонимах, поэтому вы должны явно указать, что находится в keytab.
Одна вещь, которая может помочь, - это получить последнюю версию mod_auth_kerb, которая поддерживает использование ключевого слова Any
KrbServiceName Any
Это означает, что модуль будет искать на вкладке keytab и использовать все найденные ключи, пока один из них не сработает.
У меня нет обширного опыта настройки делегирования Kerberos в Apache, но я уверен, что имя службы, определенное в apache, должно совпадать с именем службы в файле keytab.
Задайте имя службы явно следующим образом:
<Location /secured>
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd On
KrbAuthRealms DOMAIN.COM
Krb5KeyTab /etc/krb5.keytab
KrbLocalUserMapping On
KrbServiceName HTTP/apache_server.DOMAIN.com
require valid-user
</Location>
Учетная запись машин в AD должна иметь HTTP/apache_server.DOMAIN.com
SPN установлен, но похоже, что у вас это уже есть