Вопрос или проблема
Я хочу использовать 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.
Понимание проблемы
-
Механизмы аутентификации: Apache использует механизмы GSSAPI (Generic Security Services Application Program Interface) для аутентификации. Ошибка указывает на то, что клиент (часто Windows) пытается использовать механизм, который не поддерживается на сервере. В данном случае это может быть вызвано попыткой использования NTLM, когда Kerberos является желаемым механизмом.
-
Расположение сервера и клиента: Если сервер и клиент находятся в разных Kerberos-реалах, это может стать источником проблемы. Например, если домен клиента
ad.domain.com
, а сам сервер расположен вsomething.domain.com
, Kerberos может не сработать должным образом. Это может быть исправлено изменением конфигурации DNS или сменой имени хоста сервера. -
Проблемы с принципалами: Часто причиной ошибки является неправильная настройка принципала в Kerberos. Принципал для Apache (
HTTP/hostname.domain.com
) должен быть правильно зарегистрирован в Kerberos, и для этого нужно создать новый ключевой файл (keytab
), который содержит соответствующий принципал.
Решение проблемы
Вот шаги, которые могут помочь в исправлении ошибки:
-
Проверьте конфигурацию Apache: Убедитесь, что файл конфигурации Apache правильно настроен. Ваш пример с
.htaccess
выглядит корректным, но убедитесь, что другие элементы конфигурации Apache также поддерживают использование Kerberos. -
Используйте
BrowserMatch
: Добавьте следующую строку в вашу конфигурацию, чтобы предотвратить использование NTLM на Windows клиентах:BrowserMatch Windows gssapi-no-negotiate
-
Проверьте настройки GSSAPI: Убедитесь, что вы указали разрешенные механизмы аутентификации:
GssapiAllowedMech krb5 GssapiBasicAuthMech krb5
-
Создайте и настройте
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"
Убедитесь, что вы используете правильный хост, который соответствует имени хоста вашего сервера.
-
Проверьте DNS: Убедитесь, что DNS настроен правильно, и имя вашего сервера разрешается в IP-адрес, который используется при аутентификации Kerberos.
-
Логи: Используйте логи Apache и Kerberos, чтобы диагностировать ошибки и проверить, происходит ли успешное получение билетов от KDC.
Заключение
Решение проблемы с gss_accept_sec_context()
требует детального понимания механизма Kerberos и правильной настройки серверной среды и клиентов. Исправление конфигурации и проверка всех связанных компонентов, таких как DNS и принципы, поможет устранить ошибки аутентификации и обеспечить успешную работу вашей системы одноразовой аутентификации. Если проблема сохраняется, стоит рассмотреть возможность обращения к сообществу или специалистам по вашей конкретной среде.