Не удается получить билет службы Kerberos: KrbException: сервер не найден в базе данных Kerberos (7)
Я разрабатываю с помощью GSSAPI, и у меня есть код, который работает с сервером MIT Kerberos 5 с ванилью для работы с клиентом и сервером. Теперь я проверяю его функциональность против Active Directory, и я попал в проблему.
У меня есть аутентификация и прослушивание моего сервера. Я могу заставить клиента войти в систему. Для записи это код основан на http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html. Однако я не могу заставить клиента вернуть билет из AD, чтобы получить сеанс между ним и сервером. Я получаю KrbException: сервер не найден в базе данных Kerberos (7), и я не могу понять, где его следует добавить. Я попытался поместить имя сервера с ip в файл hosts, обновить dns, поместить в записи сервера и т.д., Не повезло.
Если кто-нибудь знает, где именно место для обновления AD для установки сервера в базе данных Kerberos, это будет здорово!
Ответы
Ответ 1
Это исключение исходит от клиента, правильно?
Пожалуйста, выполните прямой и обратный DNS-поиск имени хоста сервера. На вашем сервере неверные записи DNS. Они абсолютно необходимы для Kerberos. Правильное место - ваш DNS-сервер, в вашем случае: контроллер домена. Выясните IP-адрес своего DNS-сервера и обратитесь к своему администратору. Другой вариант - отсутствие SPN, пожалуйста, проверьте это тоже.
Ответ 2
Надеюсь, это поможет. Я получил это же сообщение об ошибке (сервер не найден в базе данных Kerberos (7)), но это происходит после успешного использования keytab для входа.
Сообщение об ошибке возникает, когда мы пытаемся использовать учетные данные для выполнения LDAP-запросов против AD.
Это только начиналось с java 1.6.0_34 - оно работало с 1.6.0_31, который, как мне кажется, был предыдущим выпуском.
Ошибка возникает из-за того, что java не доверяет тому, что KDC, с которым он связывается для LDAP, фактически является частью области Kerberos.
В нашем случае, я думаю, это связано с тем, что соединение LDAP выполняется с именем сервера, найденным с помощью разрешенного запроса round-robin'd.
То есть, java разрешает realm.example.com, но получает любой из kdc1.example.com или kdc2.example.com..etc). Они, должно быть, ужесточили проверку между этими выпусками.
В нашем случае проблема была решена, установив имя сервера ldap напрямую, а не полагаясь на DNS.
Но исследования продолжаются.
Ответ 3
В моем случае это вызвано неправильной настройкой запрошенного адреса сервера.
Адрес сервера должен содержать полное доменное имя (полное доменное имя).
Полное доменное имя всегда требуется Kerberos.
Ответ 4
Это похоже на отсутствующую проблему SPN. Веб-сайт, на который вы указали, имеет
principal="webserver/[email protected]"
Это основной, на который будет получен билет. Вы изменили это значение относительно вашего домена AD?
Вы можете использовать инструменты Kerberos командной строки, чтобы проверить, определен ли SPN:
[[email protected] bin]# kinit Administrator
[email protected] Password:
[[email protected] bin]# kgetcred host/[email protected]
[[email protected] bin]# klist
Credentials cache: FILE:/tmp/krb5cc_0
Principal: [email protected]
Issued Expires Principal <br>
Dec 15 11:42:34 2012 Dec 15 21:42:34 2012 krbtgt/[email protected]
Dec 15 11:42:48 2012 Dec 15 21:42:34 2012 host/[email protected]
SPN на основе имени хоста предварительно определены. Если вы хотите использовать предварительно определенное имя участника-службы, вам придется явно определить его в AD с помощью инструмента setspn.exe и связать его с учетной записью компьютера или пользователя, например:
c:\> setspn.exe -A "webserver/[email protected]" myuser
Вы можете проверить, с какой учетной записью связан SPN, используя приведенную ниже команду. Это не будет отображать предварительно определенные имена участников-служб.
c:\> setspn.exe -L "webserver/[email protected]"
Ответ 5
Ошибка "Сервер не найден в базе данных Kerberos" может возникнуть, если вы зарегистрировали имя участника-службы для нескольких пользователей/компьютеров.
Вы можете проверить это с помощью:
$ SetSPN -Q ServicePrincipalName
( SetSPN -Q HTTP/[email protected] )
Ответ 6
sqlcmd работает, System.Data.SqlClient не работает - сервер не найден в базе данных Kerberos. Вы должны добавить RestrictedKrbHost SPN
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/445e4499-7e49-4f2a-8d82-aaf2d1ee3c47
5.1.2 SPN с Serviceclass, равным "RestrictedKrbHost"
Поддержка класса обслуживания "RestrictedKrbHost" позволяет клиентским приложениям использовать проверку подлинности Kerberos, когда они не имеют удостоверения службы, но имеют имя сервера. Это не обеспечивает взаимную аутентификацию клиента к услуге, а скорее аутентификацию компьютера клиент-сервер. Службы разных уровней привилегий имеют один и тот же сеансовый ключ и могут расшифровывать данные друг друга, если базовая служба не гарантирует, что данные не будут доступны для вышестоящих служб.
Ответ 7
Рассмотрим добавление
[appdefaults]
validate=false
на ваш /etc/krb 5.conf. Это может привести к несоответствию DNS.