Apache SSO через Kerberos с использованием учетной записи компьютера

Я пытаюсь заставить Apache на Ubuntu 12.04 аутентифицировать пользователей через единый вход Kerberos на сервере Windows 2008 Active Directory. Вот несколько вещей, которые отличают мою ситуацию:

  1. У меня нет административного доступа к Windows Server (и при этом у меня никогда не будет доступа). Я также не могу вносить изменения в сервер, сделанные от моего имени.

  2. Я подключил сервер Ubuntu к Active Directory с помощью PBIS open.

  3. Пользователи могут войти на сервер Ubuntu, используя свои учетные данные AD. Kinit также отлично работает для каждого пользователя.

  4. Поскольку я не могу изменить AD (за исключением добавления новых машин и имен SPN), я не могу добавить служебную учетную запись для Apache в Ubuntu.

  5. Поскольку я не могу добавить свою служебную учетную запись, я должен использовать таблицу ключей компьютера (/etc/krb5.keytab) или, по крайней мере, использовать пароль компьютера в другой таблице ключей. Сейчас я использую таблицу ключей компьютера и предоставляю Apache доступ только для чтения (я знаю, это плохая идея).

  6. Я уже добавил SPN, используя net ads keytab add HTTP -U

  7. Поскольку я использую Ubuntu 12.04, единственными типами кодирования, которые добавляются во время "добавления net ads keytab", являются arcfour-hmac, des-cbc-crc и des-cbc-md5. PBIS добавляет типы кодирования AES к принципалам host и cifs при присоединении к домену, но мне еще предстоит получить "net ads keytab add" для этого.

  8. о ktpass и setspn не может быть и речи из-за #1 выше.

  9. Я настроил (для Kerberos SSO) и протестировал оба IE 8 Firefox.

  10. Я использую следующую конфигурацию в моей конфигурации сайта 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 debug):

[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

Дайте мне знать, если вам нужны дополнительные файлы журнала и конфигурации - первоначальный вопрос становится достаточно длинным.

2 ответа

У меня нет большого опыта настройки делегирования 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 установлен, но, похоже, у вас это уже есть

Ответ выше верен, но, к сожалению, вы должны использовать имя службы, которое находится в keytab

    sudo ktutil list 

Насколько я понимаю, AD SPN представляют собой псевдонимы, так что когда клиент запрашивает HTTP/apache_server.com, он фактически получает билет службы Kerberos для хоста / apache_server.com.

Kerberos на стороне Unix ничего не знает об этих псевдонимах, поэтому вы должны четко сказать, что находится в keytab.

Одна вещь, которая может помочь, - это получить последнюю версию mod_auth_kerb, которая поддерживает использование ключевого слова Any

KrbServiceName Any

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

Другие вопросы по тегам