Я установил 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 'MACHINENAME$@DOM.AIN'
Password for MACHINENAME$@DOM.AIN
$ kvno HTTP/sso.example.com
HTTP/sso.example.com@DOM.AIN: kvno = 12
$ klist -k krb5-keytab
Keytab name: FILE:krb5-keytab
KVNO Principal
---- ---------------------------------------------
11 HTTP/sso.example.com@DOM.AIN
KVNO, о котором сообщает AD, каким-то образом был увеличен и на один больше, чем тот, который указан в ключевой вкладке, которую использует Apache, что приводит к сбою единого входа Kerberos.
Если мы заново создадим keytab, примерно так:
$ kinit 'MACHINENAME$@DOM.AIN'
Password for MACHINENAME$@DOM.AIN
$ KEYTAB=krb5-keytab
$ SN="HTTP/sso.example.com@DOM.AIN"
$ KVNO=`kvno $SN | awk -F'kvno = ' '{print $2}'`
$ echo "KVNO for $SN is $KVNO"
KVNO for HTTP/sso.example.com@DOM.AIN is 12
$ rm $KEYTAB
$ ktutil
addent -password -p HTTP/sso.example.com@DOM.AIN -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 недели, что нарушает все возможности наших пользователей для доступа к сайту ?
Active Directory увеличивает KVNO в соответствии с RFC 4120. Корпорация Майкрософт задокументировала его реализацию в разделе 3.1.5.8 документа MS-KILE.
Active Directory по сути игнорирует КВНО. (За исключением контроллеров домена только для чтения - если контроллер домена только для чтения скомпрометирован, ключи, которые он хранит, не могут быть повторно использованы для другого контроллера домена.) Я хочу сказать, что 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 .
Вы, вероятно, столкнулись с этой ошибкой https://bugzilla.samba.org/show_bug.cgi?id=6750
Есть несколько изменений в конфигурации самбы, которые решат эту проблему. Я установил
kerberos method = secrets and keytab