Не удается получить билет службы 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.