Apache2, Kerberos: gss_accept_sec_context() не удалась: запросился неподдерживаемый механизм

Вопрос или проблема

Я хочу использовать Kerberos и Apache 2 на Linux с mod_auth_kerb.

Я добавил .htaccess в свой проект со следующим содержимым:

#SSLRequireSSL
AuthType Kerberos
AuthName "Вход с Kerberos"
KrbMethodNegotiate On
KrbMethodK5Passwd Off
KrbAuthRealms DOMAIN.COM
Krb5KeyTab /etc/httpd/httpd.keytab
KrbLocalUserMapping On
require valid-user

Когда я попытался протестировать единую авторизацию в IE или Firefox, я получил следующую ошибку в журнале Apache:

[Чт Янв 19 21:03:27 2012] [ошибка] [клиент 10.65.0.1] gss_accept_sec_context() не удалась: Запрошен неподдерживаемый механизм (, Неизвестная ошибка)

Я не знаю, что это и что мне сделать, чтобы это работало.

Моя цель – заполнить REMOTE_USER именем пользователя AD. Но сейчас я ничего не могу сделать из-за этой ошибки…

В простой конфигурации, используя mod_auth_gssapi и FreeIPA в качестве сервера krb5 для генерации ключевых таблиц, я выяснил, что добавление следующего рядом с командой AuthType решило проблему.

BrowserMatch Windows gssapi-no-negotiate

Судя по ответу от andsens, это действительно происходит на Windows-клиентах, которые пытаются использовать NTLM. GssapiAllowedMech krb5 и GssapiBasicAuthMech krb5 не дают успешного результата переговоров, поэтому единственным решением, похоже, является отключение переговоров. Я не могу гарантировать, что это точно, но это сработало для меня.

Соответствующая документация находится здесь

Я обнаружил еще одну причину этой ошибки:
Windows пытается аутентифицироваться с помощью NTLM. На самом деле, это корень проблемы.

Я не понимаю, как повторное создание ключевой таблицы помогло, ошибка в таком случае была бы что-то вроде “Запись в ключевой таблице не найдена”.
Windows пытается аутентифицироваться через NTLM, когда не может получить билет от KDC.
Для меня причиной этого было то, что мой сервер не находился в той же сфере.
Домен был ad.domain.com, но мой сервер находился по адресу something.domain.com.
Я уверен, что вы можете это как-то разрешить, но простое решение – просто изменить имя хоста, указывающее на сервер (а затем создать новую ключевую таблицу для этого домена).

Существовала проблема с принципалами. Я повторно создал /etc/httpd/httpd.keytab и правильно добавил HTTP-принципал, и все работает отлично!

Ответ или решение

Ошибка gss_accept_sec_context() в Apache2 при использовании Kerberos

При настройке Apache2 для аутентификации с использованием Kerberos и модуля mod_auth_kerb, пользователи могут столкнуться с ошибкой gss_accept_sec_context() failed: An unsupported mechanism was requested. Эта ошибка часто возникает в результате неправильной конфигурации среды аутентификации, особенно в сочетании с Windows-клиентами, которые пытаются использовать механизм NTLM вместо Kerberos.

Понимание проблемы

  1. Механизмы аутентификации: Apache использует механизмы GSSAPI (Generic Security Services Application Program Interface) для аутентификации. Ошибка указывает на то, что клиент (часто Windows) пытается использовать механизм, который не поддерживается на сервере. В данном случае это может быть вызвано попыткой использования NTLM, когда Kerberos является желаемым механизмом.

  2. Расположение сервера и клиента: Если сервер и клиент находятся в разных Kerberos-реалах, это может стать источником проблемы. Например, если домен клиента ad.domain.com, а сам сервер расположен в something.domain.com, Kerberos может не сработать должным образом. Это может быть исправлено изменением конфигурации DNS или сменой имени хоста сервера.

  3. Проблемы с принципалами: Часто причиной ошибки является неправильная настройка принципала в Kerberos. Принципал для Apache (HTTP/hostname.domain.com) должен быть правильно зарегистрирован в Kerberos, и для этого нужно создать новый ключевой файл (keytab), который содержит соответствующий принципал.

Решение проблемы

Вот шаги, которые могут помочь в исправлении ошибки:

  1. Проверьте конфигурацию Apache: Убедитесь, что файл конфигурации Apache правильно настроен. Ваш пример с .htaccess выглядит корректным, но убедитесь, что другие элементы конфигурации Apache также поддерживают использование Kerberos.

  2. Используйте BrowserMatch: Добавьте следующую строку в вашу конфигурацию, чтобы предотвратить использование NTLM на Windows клиентах:

    BrowserMatch Windows gssapi-no-negotiate
  3. Проверьте настройки GSSAPI: Убедитесь, что вы указали разрешенные механизмы аутентификации:

    GssapiAllowedMech krb5
    GssapiBasicAuthMech krb5
  4. Создайте и настройте keytab файл: Пересоздайте файл ключей (httpd.keytab), добавив в него корректный принципал для Apache:

    kadmin.local -q "addprinc -randkey HTTP/hostname.domain.com"
    kadmin.local -q "ktadd -k /etc/httpd/httpd.keytab HTTP/hostname.domain.com"

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

  5. Проверьте DNS: Убедитесь, что DNS настроен правильно, и имя вашего сервера разрешается в IP-адрес, который используется при аутентификации Kerberos.

  6. Логи: Используйте логи Apache и Kerberos, чтобы диагностировать ошибки и проверить, происходит ли успешное получение билетов от KDC.

Заключение

Решение проблемы с gss_accept_sec_context() требует детального понимания механизма Kerberos и правильной настройки серверной среды и клиентов. Исправление конфигурации и проверка всех связанных компонентов, таких как DNS и принципы, поможет устранить ошибки аутентификации и обеспечить успешную работу вашей системы одноразовой аутентификации. Если проблема сохраняется, стоит рассмотреть возможность обращения к сообществу или специалистам по вашей конкретной среде.

Оцените материал
Добавить комментарий

Капча загружается...