Несколько аутентифицированных веб-серверов SPNEGO на одном имени хоста
Я пытался настроить службу Java, используя фильтр сервлета SPNEGO и порт прослушивания 8080 для аутентификации на хосте, на котором также выполняются веб-приложения, размещенные в IIS7.
Я следовал инструкциям по установке SPNEGO и создал SPN для HTTP/canonical.host.name
, привязанный к пользователю, выполняющему аутентификацию для службы Java.
После этого изменения Java-сервис может аутентифицировать клиентов через SPNEGO, но пулы приложений IIS7, работающие с пользовательскими идентификаторами (т. Е. Имена пользователей вместо ApplicationPoolIdentity), неожиданно не могут аутентифицироваться.
Что я не понимаю здесь:
- Как проверка подлинности Kerberos работает для IIS, когда нет имени участника-службы для
HTTP/canonical.host.name
определяется с помощью (как проверено с помощьюsetspn -Q
)? Клиенты по-прежнему запрашивают и получают билеты именно на это имя участника-службы. - Из интереса мы попытались запустить пулы приложений с идентификатором службы Java, которая успешно проходит аутентификацию. Это все еще не работало, пока SPN был определен - попытки аутентификации с билетом Kerberos потерпели неудачу с
KRB_AP_ERR_MODIFIED
вернулся. Запуск пула приложений от имени пользователя, для которого зарегистрирован SPN, не изменил этого поведения. - Microsoft указывает имена участников-служб для включения номера порта, но IE не соответствует этому и никогда не отправляет номер порта в имени участника-службы (в этом случае следуют Firefox и Chrome).
Итак, есть ли способ иметь несколько независимых сервисов с аутентификацией SPNEGO на одном хосте?
2 ответа
Последнее сначала: для нескольких сервисов с аутентификацией SPNEGO на одном и том же хосте без использования ключей реестра IE используйте разные имена.
• Как работает аутентификация Kerberos для IIS, если для HTTP/canonical.host.name не определено имя участника-службы (определено с помощью setspn -Q)? Клиенты по-прежнему запрашивают и получают билеты именно на это имя участника-службы.
Это автоматический резерв на основе HOST\boxname
SPN, который создается для всех компьютеров во время присоединения к домену - если контроллер домена не находит соответствия для SPECIFICSERVICE\boxname в соответствии с запросом клиентского приложения, он предоставит билет на основе HOST\boxname.
использование SETSPN -L boxname
перечислить имена участников-служб, связанные с субъектом безопасности (учетная запись пользователя или компьютера).
• Из интереса мы попытались запустить пулы приложений с идентификатором службы Java, которая успешно аутентифицируется. Это все еще не работало, пока SPN был определен - попытки аутентификации с билетом Kerberos потерпели неудачу с возвращенным KRB_AP_ERR_MODIFIED. Запуск пула приложений от имени пользователя, для которого зарегистрирован SPN, не изменил этого поведения.
По умолчанию для IIS 7 используется useAppPoolCredentials=false и useKernelMode=true; один или оба из них должны быть переключены, чтобы идентификация пула приложений использовалась для декодирования билетов Kerberos.
• Microsoft указывает имена участников-служб для включения номера порта, но IE не соответствует этому и никогда не отправляет номер порта в имени участника-службы (в этом случае следуют Firefox и Chrome).
И вернемся к реальной сути вопроса: когда все остальное исправлено, IE и другие по-прежнему не будут включать номера портов по умолчанию, поэтому решение с наименьшей модификацией состоит в том, чтобы просто запускать разные заголовки хоста на одном и том же блоке.
Также обратите внимание, что из-за другого поведения IE (с тем же аргументом против изменения настроек реестра всех ваших клиентов) CNAME не являются хорошим выбором, вместо этого используйте записи A.
Получили ли вы ключи reg из этой КБ http://support.microsoft.com/default.aspx?scid=kb;EN-US;908209 настроенные на клиенте? Иначе IE не будет запрашивать правильный билет. Просто для ясности, ключи reg поставляются с исправлением IE6+, но с тех пор применяются ко всем версиям IE.
Я не уверен, что понимаю вашу конфигурацию. Настроен ли SPN HTTP / canonical.host.name для учетной записи службы, используемой для "службы Java"?
Вы можете иметь несколько служб, работающих на коробке, используя разные идентификаторы. Таким образом, вы можете иметь службу HTTP/host1.host.name и HTTP/host2.host.name на одном хосте. Вы можете зарегистрировать имена участников-служб, участвующие в одной учетной записи службы или в других учетных записях службы, если вы того пожелаете.
Запросы для имени участника-службы HTTP сопоставляются объектам с именем участника-службы на основе HOST, если имя участника-службы HTTP нигде явно не задано. Это сопоставление происходит с помощью атрибута SPNMappings для объекта, который выглядит как CN= Служба каталогов,CN=Windows NT,CN= Службы, CN= Конфигурация,DC=forest1,DC=local (forest1.local здесь - имя леса) согласно http://msdn.microsoft.com/en-us/library/cc220898(v=PROT.13).aspx.
Блоги Тристана великолепны. Вы также можете найти блоги по устранению неполадок и другие блоги, связанные с Kerberos, по адресу http://blogs.technet.com/b/askds/archive/tags/kerberos/ полезными.