Настройка ServicePrincipleName для веб-службы в IIS 7

Я весьма озадачен.

Учтите следующее:

  • Среда Active Directory с доменом под названием DOM
  • Блок IIS 7 с именем NetBIOS VS1
  • DNS-запись, предоставляющая псевдоним для VS1 как pineapple.london.uk.corp
  • Пул приложений, работающий как DOM\PineappleService
  • Проверка подлинности Windows включена.
  • Клиенты используют HttpWebRequest для вызова служб XML/JSON ASP.NET на коробке.

Служба обращается к рабочим станциям в сети для сбора информации. Это работает в разработке, где я использую IIS Express, который работает как я, так как IISX - это просто.exe

В работе службы работают нормально, аутентификация работает, но вызывать функции, которые приводят к тому, что служба (запущенная как PineappleService) получает доступ к материалам в сети, не удается.

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

Совсем недавно я наткнулся на эту статью, в которой, похоже, говорится о некоторых других статьях:

http://blogs.msdn.com/b/webtopics/archive/2009/01/19/service-principal-name-spn-checklist-for-kerberos-authentication-with-iis-7-0.aspx

Обратите внимание, что это говорит

Требования к SPN остаются такими же, как указано выше. Вам не нужно добавлять имена участников-служб, такие как http/ для домена1\Username1, в отличие от IIS 6.0 (где нам нужно было добавить имя участника-службы в форме http/ для идентификатора пула приложений).

Так что я больше не знаю, что правильно. Я не знаю, нужно ли мне регистрировать SPN-адреса HTTP или SPN-адреса HOST или использовать псевдоним DNS или имя NetBIOS и установить их в учетной записи PineappleService или в учетной записи компьютера VS1.

Я не могу сказать, если при попытке что-то происходит из-за медленной репликации A D, это означает, что я должен ждать час между пробой и ошибкой.

Теперь все так сложно. Я работал сисопом и разработчиком в течение 15 лет, и я чувствую конец доменов и рабочих станций, прав и политик. Это все стало слишком много.

Спасибо за вашу помощь.

Люк

2 ответа

Решение

Не следует пытаться делать это до тех пор, пока он не будет настроен и протестирован в процессе разработки в точности так, как он будет в работе. Использование проверки подлинности Windows и олицетворения с IIS и пользовательскими приложениями может быть очень сложным. Даже если бы он волшебным образом работал на производстве, не имея среды разработки, которая бы точно отражала производство, вы были бы полностью потеряны, если бы вам пришлось исследовать проблему.

SPN

Когда создается имя участника-службы, обычно создается имя участника-службы как для fqdn, так и для короткого имени. Пример:

setspn.exe -A http/computer  
setspn.exe -A http/computer.domain.com  

Рекомендуется, чтобы они совпадали с именем pre-windows 2000 (имя netbios) и именем dns, которое будет использоваться при подключении к службе. Если ни одно из них не является именем, которое будет использоваться для подключения к службе, для этого имени также должен быть SPN.

Повторяющиеся имена участников-служб, зарегистрированные для одной и той же службы / имени на разных учетных записях / компьютерах, являются частой причиной неработающего делегирования Kerberos. Setspn с радостью позволит вам создавать дубликаты SPN. Microsoft выпустила исправление, которое исправляет это поведение:

Двойное имя участника-службы регистрируется при запуске команды setspn вместе с ключом -a в Windows 7 или Windows Server 2008 R2.
https://support.microsoft.com/kb/2717045

Целевой компьютер, на котором будет расположена служба, нуждается в имени участника-службы.

   HTTP/computername.company.com
   HTTP/computername

Доверенный для делегации

Учетная запись компьютера или пользователя, которая будет выполнять олицетворение, должна быть указана как Trusted For Delegation. Если учетная запись пользователя выполняет олицетворение, учетная запись компьютера, на которой выполняется олицетворение, также должна быть настроена как доверенная для делегирования таким же образом.

В "Active Directory - пользователи и компьютеры" перейдите на вкладку "Делегирование" на компьютере или учетной записи пользователя. (В учетных записях пользователей вкладка "Делегирование" не отображается, если у нее нет имени участника-службы. Может потребоваться назначить имя пользователя, например RPC/ имя пользователя, учетной записи пользователя, чтобы появилась вкладка "Делегирование").

На вкладке делегирования выберите "Доверять этому пользователю / компьютеру для делегирования какой-либо службе (только Kerberos)" для неограниченного делегирования.

Для Ограниченного делегирования выберите "Доверять этому пользователю / компьютеру для делегирования только указанным службам". Выберите "Использовать любой протокол аутентификации". Вы можете нажать "Добавить" и перейти к компьютеру, на котором рекламируются имена участников-служб, и добавить их. Обратите внимание, что они не будут отображаться как имена участников-служб при запуске setspn.exe -L domain\useraccount.

Модель делегирования

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

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

Ограниченное делегирование ограничивает действия олицетворения конкретными целевыми компьютерами и службами (HTTP, CIFS, ...), к которым может подключаться учетная запись службы, которая выполняет олицетворение. Он также имеет дополнительное удобство, заключающееся в том, что он позволяет олицетворять любую учетную запись, не имея учетных данных учетной записи или существующего токена безопасности Windows/Kerberos.

Несколько доменов

Ограниченное делегирование не работает, если серверы FE/BE находятся в разных доменах.

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

Повышенные привилегии

Учетная запись пользователя, выполняющего олицетворение, должна иметь привилегию SetTCB (действует как часть операционной системы) на компьютере, на котором выполняется код, который будет выполнять олицетворение. Обратите внимание, что в Windows Vista/7/2008 привилегия SetTCB может поддерживаться только процессами с высоким уровнем целостности, поэтому может потребоваться добавить учетную запись в локальную группу администраторов.

Идентификатор Авторизованные пользователи должен быть членом локальной группы "Пользователи" на компьютере, на котором будет выполняться олицетворение.

Акт как часть операционной системы может быть назначен с помощью gpedit.msc или gpmc.msc. Он находится в разделе "Компьютер"> "Настройки Windows"> "Настройки безопасности"> "Локальные политики"> "Назначение прав пользователя".

Как работает протокол аутентификации Kerberos версии 5
http://technet.microsoft.com/en-us/library/cc772815%28WS.10%29.aspx

  • Если выбран параметр "Использовать только Kerberos", то учетная запись использует ограниченное делегирование без перехода по протоколу.
  • Если выбран параметр Использовать любой протокол проверки подлинности, то учетная запись использует ограниченное делегирование с переходом протокола.

Уф! После того, как все настроено правильно, вы можете перевести все это в простой тестовый пример, который легко устранить. Допустим, вы создали имя участника-службы для CIFS\fileserver.company.com и хотите выдать себя за другого User@trustedDomain.company.com и получить доступ к общему ресурсу на этом сервере:

// no password required with constrained delegation
using (WindowsIdentity id = new WindowsIdentity("anotherUser@trustedDomain.company.com"))
using (WindowsImpersonationContext wic = id.Impersonate())
{
    // ImpersonationLevel will be "Impersonation" when constrained delegation is setup correctly
    // It will be "Identification" if the account performing impersonation does not have SetTCB privilege
    Debug.WriteLine("ImpersonationLevel: " + id.ImpersonationLevel);
    // Authentication type should be "Kerberos"
    Debug.WriteLine("AuthenticationType: " + id.AuthenticationType);
    Debug.WriteLine("Username: " + WindowsIdentity.GetCurrent().Name);

    Debug.WriteLine("Groups:");
    foreach (IdentityReference identity in id.Groups)
    {
        NTAccount ntaccount = identity.Translate(typeof (NTAccount)) as NTAccount;
        Debug.WriteLine("Account: " + ntaccount.Value + " SID: " + identity.Value);
    }

    // This will fail with access denied if constrained delegation is not setup properly.  
    // On the target server/resource, if it fails it may show an attempt to logon using anonymous
    string[] fileNames = Directory.GetFiles(@"\\fileserver.company.com\ShareName");
    foreach (string fileName in fileNames)
    {
        Console.WriteLine(fileName);
    }
}

Скорее всего, это вообще не проблема SPN. Скорее всего, пул приложений, запущенный под вашей учетной записью службы (PineappleService), не имеет разрешения на доступ к ресурсам в сети. Вы не предоставили никаких сообщений об ошибках, но это действительно похоже на простую проблему с разрешениями.

Вам необходимо убедиться, что ваша учетная запись службы имеет доступ ко всему (вы должны подробно это указать в своем вопросе), который вы пытаетесь получить, будь то файлы, информация и т. Д.

Для тестирования вы можете просто сделать свою служебную учетную запись администратором в домене, но вы уверены, что, черт возьми, не следует оставлять это как развертывание после производства.

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