Добавить новый сервер в диспетчер серверов, получить ошибку Kerberos 0x80090322

Я настраиваю лабораторную среду Windows. Он имеет контроллер домена Win2012R2 (srv001), и я хотел бы добавить еще один сервер Win2012R2 в домен (srv003). На самом деле все идет хорошо. Я дал новому серверу статический IP-адрес в той же подсети, что и DC, указал его на правильный DNS-сервер и добавил сервер в домен.

Однако, когда я добавляю новый сервер в Диспетчер серверов, я получаю ошибку Kerberos: 0x80090322. У меня довольно длинное сообщение об ошибке, которое я опубликую ниже. Я провел некоторое тестирование и обнаружил, что на самом деле я могу настроить удаленный сеанс Powershell для сервера с использованием аутентификации Kerberos:

$s = New-PSSession -ComputerName srv003 -Authentication Kerberos
$s | Enter-PSSession

Здесь нет проблем. Я побежал Enable-PSRemoting на удаленном сервере проблем тоже нет.

Почему диспетчеру сервера не нравится мой новый сервер? Тем более что возможно настроить удаленный Powershell с использованием того же протокола, на который жалуется Server Manager.


Сообщение об ошибке, которое принадлежит к коду ошибки 0x80090322:

Не удалось обновить конфигурацию со следующей ошибкой: не удалось получить метаданные с сервера из-за следующей ошибки: WinRM не может обработать запрос. При использовании проверки подлинности Kerberos произошла следующая ошибка с кодом ошибки 0x80090322: Произошла неизвестная ошибка безопасности. Возможные причины:

  1. Имя пользователя или пароль указаны неверно.
  2. Kerberos используется, когда не указан метод аутентификации и имя пользователя.
  3. Kerberos принимает доменные имена пользователей, но не локальные имена пользователей.
  4. Имя участника службы (SPN) для имени и порта удаленного компьютера не существует.
  5. Клиентский и удаленный компьютеры находятся в разных доменах, и между двумя доменами нет доверия.

После проверки вышеуказанных проблем попробуйте следующее:

  1. Проверьте Event Viewer для событий, связанных с аутентификацией.
  2. Изменить метод аутентификации; добавьте конечный компьютер к параметру конфигурации WinRM TrustedHosts или используйте транспорт HTTPS. Обратите внимание, что компьютеры в списке TrustedHosts могут не проходить проверку подлинности.
  3. Для получения дополнительной информации о конфигурации WinRM выполните следующую команду: winrm help config.

Чтобы вернуться к пронумерованным пунктам в сообщении об ошибке:

  1. Я использую учетную запись администратора домена, чтобы сделать это.
  2. Не уверен, как это изменить в диспетчере сервера, поэтому я полагаю, что по умолчанию это должно быть сделано.
  3. Я бегу внутри домена, запускаю Диспетчер серверов как администратор домена.
  4. На самом деле на сервере есть следующие имена участников-служб, которых я не коснулся:
    1. DFSR-12F9A27C-BF97-4787-9364-D31B6C55EB04 / srv003.rwwilden01.local
    2. TERMSRV / SRV003
    3. TERMSRV / srv003.rwwilden01.local
    4. WSMAN / srv003
    5. WSMAN / srv003.rwwilden01.local
    6. RestrictedKrbHost / SRV003
    7. HOST / SRV003
    8. RestrictedKrbHost / srv003.rwwilden01.local
    9. HOST / srv003.rwwilden01.local
  5. Оба компьютера находятся в одном домене.
  6. Нет событий на клиентском компьютере.
  7. В этом не должно быть необходимости.

5 ответов

Решение

Хорошо, я наконец понял это. Я еще раз внимательно посмотрел журнал событий удаленного сервера. Он содержал ошибку со следующим текстом ошибки:

Клиент Kerberos получил ошибку KRB_AP_ERR_MODIFIED с сервера srv003. В качестве целевого имени использовался HTTP/srv003.rwwilden01.local. Это означает, что целевому серверу не удалось расшифровать билет, предоставленный клиентом. Это может произойти, когда имя участника целевого сервера (SPN) зарегистрировано в учетной записи, отличной от учетной записи, используемой целевой службой. Убедитесь, что целевой SPN зарегистрирован только для учетной записи, используемой сервером. Эта ошибка также может произойти, если пароль целевой учетной записи службы отличается от пароля, настроенного в центре распространения ключей Kerberos для этой целевой службы. Убедитесь, что служба на сервере и KDC настроены на использование одного и того же пароля. Если имя сервера не полностью определено, а целевой домен (RWWILDEN01.LOCAL) отличается от клиентского домена (RWWILDEN01.LOCAL), проверьте, есть ли в этих двух доменах учетные записи с одинаковыми именами, или используйте полное имя идентифицировать сервер.

Оказалось, что я добавил управляемую служебную учетную запись неделей ранее с SPN HTTP/srv003.rwwilden.local, Я не уверен, почему Server Manager сначала пытается использовать это целевое имя, но, очевидно, это не работает. Имеет смысл, поскольку этот SPN имеет мало общего с реальным сервером.

После того, как я удалил служебную учетную запись, все стало работать так, как я хотел.

Была та же ошибка и пробовал много разных решений. Помогло использование явного адреса IPv4 вместо имени домена.

Я не мог добавить комментарий (Новая работа, новая учетная запись, без баллов) к сообщению, которое я хотел, поэтому я отвечаю. Причина, по которой использование IP-адреса помогает / решает проблему, заключается в том, что при использовании IP-адреса Kerberos не используется. Ограничение предпринимается только при использовании полного доменного имени (или имени NBT, но это только потому, что оно добавляет имя домена, что в любом случае делает его fqdn). Вообще говоря, большинство ошибок Kerberos вызвано либо именованием, либо ИД SPN, либо неправильно установленным, либо для требуемой службы. Cnames не работают между прочим, если вы не отключите строгую проверку имени и даже тогда не будут работать при некоторых обстоятельствах, поэтому я советую вам избегать их хотя бы во время диагностики. Но, честно говоря... ЛУЧШИЙ подход к выяснению подобного рода вещей (поскольку журналы Windows и Curb не очень полезны) - это использовать Wireshark. вы увидите согласование, и вы поймете, почему он терпит неудачу, что он пытается, и т. д. Кроме того, если вы включите "аналитические и отладочные" журналы в средстве просмотра событий, вы получите дополнительные журналы отладки для Curb, которые вы можете включить, которые немного более полезны., Тем не менее... Wireshark всегда твой друг imho!

У меня была эта проблема не так давно, я указал на виновника с помощью инструмента "setspn". Я лучше понял имена участников-служб, прочитав эту статью: http://support.microsoft.com/default.aspx?scid=kb;EN-US;929650

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

Например, рассмотрим учетную запись службы appPoolAccount и сервер myWebServer. Оба объекта в Active Directory будут иметь свойство ServicePrincipalName, содержащее одну и ту же строку "HTTP / myWebServer". ServicePrincipalName на myWebServer будет немного отличаться, потому что это будет HTTP/myWebServer:5985

Наличие (почти) дубликата ServicePrincipalNames приведет к сбою WinRM с ошибкой Kerberos в вопросе.

Чтобы обойти эту проблему, вы можете указать Invoke-Command включить порт при поиске ServicePrincipalName, например так:

### Tell WinRM to include the port in the SPN
Invoke-Command -ComputerName myWebServer -ScriptBlock {Get-Process} -SessionOption (New-PSSessionOption -IncludePortInSPN)

В моем случае у меня был зарегистрирован HTTP/ SPN для объекта, который принадлежал НЕ серверу. Однако я не смог найти, кому он принадлежит, потому что инструмент SETSPN.exe не показывает, какой контейнер (или объект) владеет SPN. Я использовал следующий сценарий PowerShell, чтобы найти владельца SPN. После того, как я удалил SPN и воссоздал его с сервером в качестве владельца (с помощью инструмента SETSPN.exe), я ждал 30 минут, пока все контроллеры домена синхронизируются, и затем все заработало.

# Source / credit:
# https://social.technet.microsoft.com/wiki/contents/articles/18996.active-directory-powershell-script-to-list-all-spns-used.aspx

Clear-Host
$Search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
$Search.Filter="(servicePrincipalName=*)"

## You can use this to filter for OU's:
## $Results = $Search.FindAll() | ?{ $_.Path -like '*OU=whatever,DC=whatever,DC=whatever*' }
$Results=$Search.FindAll()

foreach($Result in $Results ) {
  $UserEntry=$Result.GetDirectoryEntry()
  Write-Host "Object Name = " $UserEntry.name -BackgroundColor "yellow" -ForegroundColor "black"
  Write-Host "DN      =      "  $UserEntry.distinguishedName
  Write-Host "Object Cat. = "  $UserEntry.objectCategory
  Write-Host "servicePrincipalNames"

  $i=1
  foreach($SPN in $UserEntry.servicePrincipalName ) {
    Write-host "SPN(" $i ")   =      " $SPN
    $i++
  }

  Write-Host ""
}

У меня была проблема с Kerberos. Оказалось, что нарушены доверительные отношения между доменом и сервером. Как только я исправил это с PowerShell, все снова было хорошо.

Другие вопросы по тегам