Устранение сбоев Kerberos в Internet Explorer

Эта статья помогает изолировать и устранить причины различных ошибок при доступе к веб-сайтам, настроенным для использования проверки подлинности Kerberos в Internet Explorer. Количество потенциальных проблем почти такое же большое, как и количество доступных средств для их решения.

Распространенный симптом при сбое Kerberos

Вы пытаетесь получить доступ к веб-сайту, на котором Windows была настроена интегрированная проверка подлинности, и вы ожидаете использовать протокол проверки подлинности Kerberos. В этой ситуации браузер немедленно запросит учетные данные:

Снимок экрана подсказки для учетных данных.

Хотя вы вводите допустимые имя пользователя и пароль, вам снова будет предложено (всего три запроса). Затем показан экран, на который указывается, что доступ к нужному ресурсу запрещен. На экране отображается код состояния HTTP 401, похожий на следующую ошибку:

Не разрешено
ОШИБКА HTTP 401. Запрашиваемой ресурс требует проверки подлинности пользователей.

Снимок экрана ошибки H T T P 401.

На сервере Microsoft IIS (IIS) журналы веб-сайтов содержат запросы, которые заканчиваются кодом состояния 401.2, например следующим журналом:

#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken  
DateTime IP GET /whoami.aspx - 80 – IP Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+10.0;+WOW64;+Trident/7.0;+.NET4.0C;+.NET4.0E;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+.NET+CLR+3.5.30729) - 401 2 5 1270  
DateTime IP GET /whoami.aspx - 80 - IP Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+10.0;+WOW64;+Trident/7.0;+.NET4.0C;+.NET4.0E;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+.NET+CLR+3.5.30729) - 401 2 5 8

Или на экране отображается код состояния 401.1, например следующий журнал:

#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken  
DateTime IP GET /whoami.aspx - 80 - IP Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+10.0;+WOW64;+Trident/7.0;+.NET4.0C;+.NET4.0E;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+.NET+CLR+3.5.30729) - 401 2 5 105  
DateTime IP GET /whoami.aspx - 80 - IP Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+10.0;+WOW64;+Trident/7.0;+.NET4.0C;+.NET4.0E;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+.NET+CLR+3.5.30729) - 401 1 2148074245 18

Определите, используется ли Kerberos

При устранении неполадок с проверкой подлинности Kerberos рекомендуется упростить настройку до минимума. То есть один клиент, один сервер и один сайт IIS, работающий в порту по умолчанию. Кроме того, можно выполнять некоторые основные действия по устранению неполадок. Например, используйте тестовую страницу для проверки используемого метода проверки подлинности. Если вы используете ASP.NET, вы можете создать ASP.NET тестовую страницу проверки подлинности.

Если вы используете классический ASP, вы можете использовать следующую страницу Testkerb.asp:

<%
    authType=UCase(Request.ServerVariables("AUTH_TYPE"))
    authHeader=Request.ServerVariables("HTTP_AUTHORIZATION")
    response.write " Authentication Method : " & authType & "<BR>"
    LenAuthHeader = len(authHeader)
    response.write " Protocol : "
    if Len(authType ) =0 then response.write " Anonymous" else if authType<>"NEGOTIATE" then response.write authType else if LenAuthHeader>1000 then response.write "Kerberos" else response.write  "NTLM"
%>

Вы также можете использовать следующие средства, чтобы определить, используется ли Kerberos:

  • Fiddler
  • HttpWatch
  • Сетевой монитор
  • Средства разработчика в браузере

Дополнительные сведения о том, как можно сгенерить такие следы, см. в статью отслеживание на стороне клиента.

Когда используется Kerberos, запрос, отправленный клиентом, является большим (более 2000 битов), так как загон включает билет HTTP_AUTHORIZATION Kerberos. Следующий запрос — страница, на основе Windows kerberos для проверки подлинности входящих пользователей. Размер запроса GET составляет более 4000 bytes.

Снимок экрана запросов с более чем 4000 bytes.

Если используется рукопожатие NTLM, запрос будет значительно меньше. В следующем захвате клиента показан запрос на проверку подлинности NTLM. Запрос GET гораздо меньше (менее 1400 bytes).

Снимок экрана запросов, которые меньше 1400 bytes.

После определения сбоя проверки подлинности Kerberos проверьте каждый из следующих элементов в заданного порядке.

Проверка сбоя проверки подлинности Kerberos

В следующих разделах описываются вещи, которые можно использовать для проверки сбоя проверки подлинности Kerberos.

Клиент и сервер в одном домене

Использование Kerberos требует домена, так как билет Kerberos доставляется контроллером домена (DC). Кроме того, возможны дополнительные сценарии, в которых:

  • Клиент и сервер не в одном домене, а в двух доменах одного леса.
  • Клиент и сервер находятся в двух разных лесах.

Эти возможные сценарии обсуждаются в разделе Почему не удается делегирования Kerberos между двумя моими лесами, хотя он использовался для работы в разделе этой статьи.

Настроен ли IIS для использования интегрированной проверки подлинности

Снимок экрана Windows параметра проверки подлинности.

Включена ли интегрированная проверка подлинности в Internet Explorer

Выберите параметр Enable Integrated Windows проверки подлинности на странице Параметры Интернета.

Используется ли URL-адрес, используемый для разрешения в зону безопасности, для которой можно отправить учетные данные

Всегда запустите эту проверку для следующих сайтов:

  • Сайты, совпадают с локальной зоной интрасети браузера.
  • Сайты в зоне доверенных сайтов.

Вы можете проверить, в какой зоне браузер решает включить сайт. Для этого откройте меню File internet Explorer и выберите Свойства. В окне Properties будет отображаться зона, в которой браузер решил включить веб-сайт, на который вы просматриваете.

Проверьте зону в свойствах Internet Explorer.

Вы можете проверить, позволяет ли зона, в которую включен сайт, автоматический логотип. Для этого откройте меню internet options internet Explorer и выберите вкладку Security. После выбора нужной зоны выберите кнопку Настраиваемый уровень для отображения параметров и убедитесь, что выбран автоматический логотип. (Как правило, эта функция включена по умолчанию для зон Интрасети и доверенных сайтов).

Проверьте, выбран ли автоматический логотип.

Примечание

Даже при такой конфигурации не часто (так как для клиента требуется доступ к DC), Kerberos можно использовать для URL-адреса в интернет-зоне. В этом случае, если параметры по умолчанию не будут изменены, браузер всегда будет подсказок пользователю для учетных данных. Делегация Kerberos не будет работать в зоне Интернета. Это потому, что Internet Explorer позволяет делегирования Kerberos только для URL-адресов в зонах Интрасети и Доверенные сайты.

Настроен ли сервер IIS для отправки www-authenticate: заготавка переговоров

Проверьте, настроен ли сервер IIS для отправки загона WWW-Authenticate: Negotiate.

Если IIS не отправляет этот заголовок, используйте консоль IIS Manager для настройки заголовка Negotiate через свойство конфигурации NTAuthenticationProviders. Дополнительные сведения см. в Windows поставщиков проверки подлинности. <providers> Доступ к консоли можно получить с помощью параметра Providers Windows проверки подлинности в диспетчере IIS.

Параметры поставщиков в проверке подлинности.

Примечание

По умолчанию свойство NTAuthenticationProviders не установлено. Это приводит к отправке iiS как заглавных Windows NT, так и lan-менеджеров (NTLM).

Установлен ли клиент и сервер на одном компьютере

По умолчанию Kerberos не включен в этой конфигурации. Чтобы изменить это поведение, необходимо установить ключ DisableLoopBackCheck реестра. Дополнительные сведения см. в 926642.

Может ли клиент получить билет Kerberos

Вы можете использовать средство Kerberos List (KLIST), чтобы убедиться, что клиентский компьютер может получить билет Kerberos для данного имени основного имени службы. В этом примере основное имя службы (SPN) — http/web-server.

Примечание

KLIST является родным Windows с Windows Server 2008 для серверных операционных систем и Windows 7 Пакет обновления 1 для клиентских операционных систем.

Используйте средство KLIST, чтобы убедиться, что клиентский компьютер может получить билет Kerberos для имени основного имени службы.

При сбое запроса на билет Kerberos проверка подлинности Kerberos не используется. Может произойти откат NTLM, так как запрашиваемая SPN неизвестна dc. Если dc недостижим, не происходит откат NTLM.

Чтобы объявить SPN, см. следующую статью:

Использование spNs при настройкевеб-приложений, которые находятся на службы IIS.

Использует ли веб-сервер порт по умолчанию (80)

По умолчанию Internet Explorer не включает сведения о номере порта в SPN, который используется для запроса билета Kerberos. Это может быть проблемой, если вы используете IIS для пользования несколькими сайтами в разных портах и удостоверениях. В этой конфигурации проверка подлинности Kerberos может работать только для определенных сайтов, даже если все spNs были правильно объявлены в Active Directory. Чтобы устранить эту проблему, необходимо установить FEATURE_INCLUDE_PORT_IN_SPN_KB908209 значение реестра. (Сведения о том, как объявить ключ, см. в разделе Ключи функций Internet Explorer.) Этот параметр заставляет Internet Explorer включить номер порта в SPN, который используется для запроса билета Kerberos.

Использует ли Internet Explorer ожидаемый SPN

Если к веб-сайту можно получить доступ с помощью псевдонима (CNAME), internet Explorer сначала использует DNS-разрешение для разрешения имени псевдонима на имя компьютера (ANAME). Затем имя компьютера используется для создания SPN и запроса билета Kerberos. Даже если URL-адрес, который вошел в адресной панели Internet Explorer, internet Explorer запрашивает http://MYWEBSITE SPN для HTTP/MYSERVER, если MYWEBSITE является псевдонимом (CNAME) MYSERVER (ANAME). Это поведение можно изменить с помощью FEATURE_USE_CNAME_FOR_SPN_KB911149 ключа реестра. (См. ключи функции Internet Explorer для получения сведений о том, как объявить ключ.)

Трассировка сетевого монитора — это хороший метод проверки SPN, связанного с билетом Kerberos, как в следующем примере:

- Http: Request, GET /whoami.aspx , Using GSS-API Authorization
    Command: GET
  - URI: /whoami.aspx
     Location: /whoami.aspx
    ProtocolVersion: HTTP/1.1
    Accept:  image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
    Accept-Language:  en-US,en;q=0.5
    UserAgent:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)
    Accept-Encoding:  gzip, deflate
    Host:  web-server
    Connection:  Keep-Alive
  - Authorization: Negotiate
   - Authorization:  Negotiate YIILcAYGKwYBBQUCoIILZDCCC2CgMDAuBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHgYKKwYBBAGCNwICCqKCCyoEggsmYIILIgYJKoZIhvcSAQICAQBuggsRMIILDaADAgEFoQMCAQ6iBwMFACAAAACjggRtYYIEaTCCBGWgAwIBBaEOGwxPREVTU1kuTE9DQUyiKjAooAMCAQKhITAfGwRIVFRQG
      WhiteSpace:  
    - NegotiateAuthorization:
       Scheme: Negotiate
     - GssAPI: 0x1
      - InitialContextToken:
       + ApplicationHeader:
       + ThisMech: SpnegoToken (1.3.6.1.5.5.2)
       - InnerContextToken: 0x1
        - SpnegoToken: 0x1
         + ChoiceTag:
         - NegTokenInit:
          + SequenceHeader:
          + Tag0:
          + MechTypes: Prefer MsKerberosToken (1.2.840.48018.1.2.2)
          + Tag2:
          + OctetStringHeader:
          - MechToken: 0x1
           - MsKerberosToken: 0x1
            - KerberosInitToken:
             + ApplicationHeader:
             + ThisMech: KerberosToken (1.2.840.113554.1.2.2)
             - InnerContextToken: 0x1
              - KerberosToken: 0x1
                 TokId: Krb5ApReq (0x100)
               - ApReq: KRB_AP_REQ (14)
                + ApplicationTag:
                + SequenceHeader:
                + Tag0:
                + PvNo: 5
                + Tag1:
                + MsgType: KRB_AP_REQ (14)
                + Tag2: 0x1
                + ApOptions:
                + Tag3:
                - Ticket: Realm: ODESSY.LOCAL, Sname: HTTP/web-server.odessy.local
                 + ApplicationTag:
                 + SequenceHeader:
                 + Tag0:
                 + TktVno: 5
                 + Tag1:
                 + Realm: ODESSY.LOCAL
                 + Tag2: 0x1
                 + Sname: HTTP/web-server.odessy.local
                 + Tag3: 0x1
                 + EncPart:
                + Tag4:

Соответствует ли удостоверение пула приложений учетной записи, связанной с SPN

Когда билет Kerberos отправляется из Internet Explorer на сервер IIS, он шифруется с помощью закрытого ключа. Закрытый ключ — это хаш пароля, используемого для учетной записи пользователя, связанной с SPN. Таким образом, расшифровать билет может только приложение, которое работает под этой учетной записью.

Ниже приводится сводка алгоритма проверки подлинности Kerberos:

  1. Internet Explorer определяет SPN с помощью URL-адреса, вступив в адресную планку.

  2. SpN передается через API интерфейса поставщика службы поддержки безопасности (SSPI) (InitializeSecurityContext) в системный компонент, отвечающий за безопасность Windows безопасности (процесс службы подсистем местного органа безопасности (LSASS). На данном этапе можно увидеть, что код Internet Explorer не реализует код для построения билета Kerberos. Internet Explorer вызывает только API SSPI.

  3. LSASS использует СНО, переданный для запроса билета Kerberos в DC. Если dc может обслуживать запрос (известный SPN), он создает билет Kerberos. Затем он шифрует билет с помощью ключа, построенного из хаши пароля учетной записи пользователя для учетной записи, связанной с SPN. Затем LSASS отправляет билет клиенту. Что касается Internet Explorer, то билет является непрозрачной blob.

  4. Internet Explorer инкапсулирует билет Kerberos, предоставленный LSASS в загонке, а затем отправляет его на Authorization: Negotiate сервер IIS.

  5. IIS обрабатывает запрос и передает его в правильный пул приложений с помощью указанного загона хоста.

  6. Пул приложений пытается расшифровать билет с помощью API SSPI/LSASS и следуя следующим условиям:

    • Если билет можно расшифровать, проверка подлинности Kerberos будет успешной. Доступны все службы, связанные с билетом (вымысление, делегирование, если позволяет билет и так далее).

    • Если расшифровать билет нельзя, возвращается ошибка Kerberos (KRB_AP_ERR_MODIFIED). Эта ошибка является общей ошибкой, которая указывает, что билет был изменен каким-либо образом во время его транспортировки. Так что расшифровать билет не получается. Эта ошибка также регистрируется в журналах Windows событий.

Если вы явно не объявляете SPN, проверка подлинности Kerberos работает только в соответствии с одним из следующих удостоверений пула приложений:

  • Сетевая служба
  • ApplicationPoolIdentity
  • Другая учетная запись системы, например LOCALSYSTEM или LOCALSERVICE

Но эти удостоверения не рекомендуется, так как они являются угрозой безопасности. В этом случае билет Kerberos создается с помощью spN по умолчанию, созданного в Active Directory при добавлении в домен компьютера (в этом случае запущенного сервера IIS). Этот SPN по умолчанию связан с учетной записью компьютера. В соответствии с IIS учетная запись компьютера сопопосается с сетевой службой или объектом ApplicationPoolIdentity.

Если в пуле приложений необходимо использовать удостоверение, помимо перечисленных удостоверений, объявите SPN (с помощью SETSPN). Затем связать его с учетной записью, используемой для удостоверения пула приложений. Обычной ошибкой является создание аналогичных СНО, которые имеют различные учетные записи. Например,

  • SETSPN http/mywebsite UserAppPool1
  • SETSPN http/mywebsite UserAppPool2

Эта конфигурация не сработает, так как нет детерминистского способа узнать, будет ли зашифрован билет Kerberos для SPN http/mywebsite с помощью пароля UserAppPool1 или UserAppPool2. Эта конфигурация обычно создает KRB_AP_ERR_MODIFIED ошибок. Чтобы определить, есть ли вы в этом плохом сценарии повторяемой СНО, используйте средства, задокументированные в следующей статье:

Почему в AD 2012 R2 и AD 2016 по-прежнему можно дублировать СНО

Начиная с Windows Server 2008, вы также можете использовать обновленную версию SETSPN для Windows, которая позволяет обнаруживать дублирующиеся spNs с помощью команды при объявлении нового SPN для целевой учетной setspn –X записи. Дополнительные сведения см. в setspn.

Кроме того, рекомендуется просмотреть следующие статьи:

Не удается ли проверка подлинности Kerberos в версиях IIS 7 и более поздних версий, даже если она работает в IIS 6

Проверка подлинности режима ядра — это функция, представленная в IIS 7. Он предоставляет следующие преимущества:

  • Производительность увеличивается, так как переходы от режима ядра к пользователю больше не сделаны.
  • Расшифровка билетов Kerberos выполнена с помощью учетной записи машины, а не удостоверения пула приложений. Это изменение позволяет иметь несколько пулов приложений, работающих под разными удостоверениями без объявления SPNs.

Предупреждение

Если spN объявлен для определенной учетной записи пользователя (также используемой в качестве удостоверения пула приложений), проверка подлинности режима ядра не может расшифровать билет Kerberos, так как она использует учетную запись машины. Эта проблема типична для сценариев веб-фермы. В этом сценарии обычно объявляется spN для (виртуального) имени хост-имени NLB. Чтобы предотвратить эту проблему, используйте один из следующих методов:

  • Отключить проверку подлинности режима ядра. (Не рекомендуется с точки зрения производительности.)
  • Установите использование UseAppPoolCredentials до true. При этом сохраняется преимущество производительности проверки подлинности режима ядра, позволяя расшифровку билета Kerberos в удостоверении пула приложений. Дополнительные сведения см. в рубрике New in IIS 7 - Проверка подлинности в режиме ядра.

Почему не удается делегирование, хотя проверка подлинности Kerberos работает

В этом сценарии проверьте следующие элементы:

  • Зона Internet Explorer, используемая для URL-адреса. Делегирования Kerberos разрешено только для зон Интрасети и доверенных сайтов. (Другими словами, Internet Explorer задает флаг при вызове ISC_REQ_DELEGATE InitializeSecurityContext только в том случае, если определяемая зона — это интрасеть или доверенные сайты.)

  • Учетная запись пользователя пула приложений IIS, на который размещен ваш сайт, должна иметь флажок Доверенный для делегирования в Active Directory.

В случае сбоя делегирования рассмотрите возможность использования диспетчера конфигурации Kerberos для IIS. Этот инструмент позволяет диагностировать и исправлять конфигурации IIS для проверки подлинности Kerberos и связанных СНО в целевых учетных записях. Дополнительные сведения см. в README.md. Вы можете скачать средство отсюда.

Почему я получаю плохую производительность при использовании проверки подлинности Kerberos

Kerberos — это протокол проверки подлинности на основе запросов в более старых версиях Windows Server, таких как Windows Server 2008 SP2 и Windows Server 2008 R2. Это означает, что клиент должен отправить билет Kerberos (который может быть довольно большой blob) с каждым запросом, который сделан на сервер. Это противоречит методам проверки подлинности, которые используют NTLM. По умолчанию NTLM основан на сеансах. Это означает, что браузер будет проверить подлинность только одного запроса, когда откроет подключение TCP к серверу. Каждый последующий запрос на одно и то же подключение TCP больше не требует проверки подлинности для того, чтобы запрос был принят. В более новых версиях IIS с Windows R2 начиная с 2012 года Kerberos также основан на сеансах. Только первый запрос на новое подключение TCP должен быть аутентификацией на сервере. Последующие запросы не должны включать билет Kerberos.

Это поведение можно изменить с помощью свойства authPersistNonNTLM, если вы работаете в версиях IIS 7 и более поздних версий. Если свойство настроено на верное, Kerberos станет сеансом на основе. В противном случае он будет основан на запросе. Это будет иметь более плохую производительность, так как каждый раз необходимо включать больший объем данных для отправки на сервер. Дополнительные сведения см. в рублях Запрос на основе сеанса проверки подлинности Kerberos (или параметр AuthPersistNonNTLM).

Примечание

Возможно, не стоит слепо использовать проверку подлинности Kerberos на всех объектах. Использование проверки подлинности Kerberos для получения сотен изображений с помощью условных запросов GET, которые, скорее всего, создают 304 не измененных ответа, похоже на попытку убить муху с помощью молотка. Такой метод также не обеспечит очевидных преимуществ безопасности.

Почему не удается делегирования Kerberos между двумя лесами, хотя раньше он работал

Рассмотрим следующий сценарий.

  • Пользователи приложения находятся в домене в лесу А.
  • Ваше приложение расположено в домене в лесу B.
  • Между лесами есть доверительные отношения.

В этом сценарии делегирования Kerberos может перестать работать, даже если раньше она работала, и вы не вносили изменений ни в леса, ни в домены. Проверка подлинности Kerberos по-прежнему работает в этом сценарии. Не удается только делегирования.

Эта проблема может возникнуть из-за обновлений Windows Server, выпущенных Корпорацией Майкрософт в марте 2019 г. и июле 2019 г. Эти обновления отключили неподготовленную делегирование Kerberos (возможность делегирования маркера Kerberos из приложения в службу back-end) через границы леса для всех новых и существующих трастов. Дополнительные сведения см. в статью Updates to TGT delegation across incoming trusts in Windows Server.

Клавиши функций Internet Explorer

Эти клавиши являются ключами реестра, которые включат или выключают некоторые функции браузера. Ключи расположены в следующих расположениях реестра:

  • HKEY_USERS\<UserSID>\Software\Microsoft\Internet Explorer\Main\FeatureControl — если определено на уровне пользователя
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\ - если определено на уровне машины

Клавиши функций должны создаваться в одном из этих местоположений в зависимости от того, хотите ли вы включить или отключить эту функцию:

  • для всех пользователей на компьютере
  • только для определенной учетной записи

Эти ключи должны быть созданы по соответствующему пути. В ключе должно быть объявлено значение DWORD, которое iexplorer.exe называется. Значение каждого ключа по умолчанию должно быть верным или ложным в зависимости от нужного параметра функции. По умолчанию значение обоих ключей функций и FEATURE_INCLUDE_PORT_IN_SPN_KB908209 FEATURE_USE_CNAME_FOR_SPN_KB911149 , является ложным. Для полноты, вот пример экспорта реестра, поверив ключ функции, чтобы включить номера портов в билете Kerberos на значение true:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_INCLUDE_PORT_IN_SPN_KB908209]
"iexplore.exe"=dword:00000001