Как избежать частых повышений KVNO при использовании Apache HTTPD с mod_auth_kerb для взаимодействия с AD?

Как избежать частых повышений KVNO при использовании Apache HTTPD с mod_auth_kerb для взаимодействия с AD?

Я настроил Apache HTTPD 2.4 с mod_auth_kerb, создал учетную запись службы в Active Directory, добавил SPN для моего имени хоста http, создал файл keytab на машине Linux и заставил SSO работать нормально для пользователей, вошедших в домен AD из IE. Все было хорошо!

Однако, примерно каждую неделю пользователи вместо входа на сайт получают запрос на базовую авторизацию http, которая не принимает их учетные данные. Просматривая журналы сервера httpd, мы видим записи вроде:

[auth_kerb:error] [pid 8040] [client 192.168.100.100:54460] gss_accept_sec_context() failed: Unspecified GSS failure.  Minor code may provide more information (, Key version number for principal in key table is incorrect)

Похоже, что произошло то, что KVNO (номер версии ключа Kerberos) в AD увеличился, поэтому keytab недействителен. Мы можем увидеть это, сделав что-то вроде:

$ kinit '[email protected]'
Password for [email protected]

$ kvno HTTP/sso.example.com
HTTP/[email protected]: kvno = 12

$ klist -k krb5-keytab 
Keytab name: FILE:krb5-keytab
KVNO Principal
---- ---------------------------------------------
11   HTTP/[email protected]

KVNO, о котором сообщает AD, каким-то образом был увеличен и стал на единицу больше, чем в keytab, который использует Apache, что приводит к сбою единого входа Kerberos.

Если мы заново создадим keytab, например так:

$ kinit '[email protected]'
Password for [email protected]

$ KEYTAB=krb5-keytab
$ SN="HTTP/[email protected]"
$ KVNO=`kvno $SN | awk -F'kvno = ' '{print $2}'`
$ echo "KVNO for $SN is $KVNO"
KVNO for HTTP/[email protected] is 12

$ rm $KEYTAB
$ ktutil
addent -password -p HTTP/[email protected] -k 12 -e arcfour-hmac
wkt krb5-keytab
$ chown apache.apache $KEYTAB
$ chmod 440 $KEYTAB
$ chcon -u system_u -t httpd_config_t $KEYTAB
$ service httpd restart

Затем Kerberos SSO снова заработает, и все будет хорошо! Примерно неделю, а потом вдруг снова даст сбой, так как KVNO молча и таинственно поднял себя на одно значение выше в AD...

Итак, что мне нужно сделать в AD или при создании файла keytab Kerberos в Linux, чтобы KVNO не увеличивался случайным образом каждые 1-2 недели, тем самым лишая всех наших пользователей возможности доступа к сайту?

решение1

Active Directory увеличивает KVNO в соответствии с RFC 4120. Microsoft задокументировала свою реализацию в документе MS-KILE, раздел 3.1.5.8.

Active Directory по сути игнорирует KVNO. (За исключением контроллеров домена только для чтения — если RODC скомпрометирован, хранящиеся в нем ключи не могут быть повторно использованы против другого контроллера домена.) Поэтому я хочу сказать, что AD, как правило, не волнует, какой у вас KVNO, — хотя он все еще поддерживает KVNO — его волнует только то, действителен ли ваш билет и не истек ли его срок действия. (Хотя я не знаю, выполняет ли ваш клиент Linux строгую проверку KVNO. По-видимому, он это делает.)

Active Directory попытается расшифровать/проверить с помощью самого последнего ключа, который у него есть для этого принципала, и если это не сработает, он попытается с помощью предыдущего (пока предыдущий ключ еще в пределах своего срока действия), и если это не сработает, запрос будет отклонен. Независимо от того, какой KVNO отправляет клиент. Но помните, что не все контроллеры домена будут иметь ваш KVNO-1 (то есть предыдущий KVNO), только контроллер домена, который последним выдал ваш билет.

KVNO увеличивается, когда клиентский компьютер меняет свой пароль или обновляет свой билет или его билет истекает. По умолчанию Active Directory использует 7 дней в качестве максимального времени, в течение которого билет может быть обновлен, что соответствует вашему описанию«работает около недели».

Не существует механизма, который бы остановил Active Directory от увеличения KVNO при получении действительного изменения пароля или ротации тикетов от компьютера-члена домена. Поэтому я хочу сказать, что Active Directory не обновляет KVNO «таинственным» образом — она делает это по определенным причинам.

Мне кажется, что ваша машина Linux все еще пытается использовать свой (уже просроченный) билет после его максимального срока действия в 7 дней. (Или Active Directory настроен на что-то более короткое.)

Проверьте свой билет /etc/krb5.confи убедитесь, что максимальный срок действия билета находится в пределах максимального срока действия билета, указанного в Active Directory (политика Kerberos в групповой политике домена по умолчанию). Вам необходимо продлить свой билет (и ваш KVNO должен увеличиться) в течение этого интервала, указанного в AD.

решение2

Вероятно, вы столкнулись с этой ошибкой https://bugzilla.samba.org/show_bug.cgi?id=6750

Есть пара изменений в конфигурации Samba, которые решат эту проблему. Я установил

kerberos method = secrets and keytab

Связанный контент