Назад | Перейти на главную страницу

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

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

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

Служба обращается к рабочим станциям в сети для сбора информации. Это работает в разработке, где я использую 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 остаются такими же, как указано выше. Вам не нужно добавлять SPN, например http / для Domain1 \ Username1, в отличие от IIS 6.0 (где нам нужно было добавить SPN в форме http / для удостоверения пула приложений).

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

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

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

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

Люк

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

SPN

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

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

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

Дубликаты 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

Надежно для делегирования

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

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

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

Для ограниченного делегирования выберите «Доверять этому пользователю / компьютеру для делегирования только указанным службам». Выберите «Использовать любой протокол аутентификации». Вы можете нажать «Добавить», перейти к компьютеру, на котором объявлены SPN службы, и добавить их. Обратите внимание, что они не будут отображаться как SPN при запуске 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», учетная запись использует ограниченное делегирование без перехода протокола.
  • Если выбран параметр Использовать любой протокол аутентификации, значит учетная запись использует ограниченное делегирование. с переходом по протоколу.

Ух! После того, как вы все настроили правильно, вы можете преобразовать все это в простой тестовый пример, который легко устранить. Допустим, вы создали SPN для 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), не имеет разрешения на доступ к ресурсам в сети. На самом деле вы не предоставили никаких сообщений об ошибках, но это действительно похоже на простую проблему с разрешениями.

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

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