Налаштування Kerberos авторизації на сайті IIS

Покрокова інструкція по налаштуванню на веб-сайті IIS на Windows Server 2012 R2 прозорою авторизації доменних користувачів в режимі SSO (Single Sign-On) по протоколу Kerberos.

На веб сервері запустіть консоль IIS Manager, виберіть потрібний сайт і відкрийте розділ Authentication. Як ви бачите, за замовчуванням дозволена тільки анонімна аутентифікація (Anonymous Authentication). Відключаємо її і включаємо Windows Authentication (IIS завжди спочатку намагається виконати анонімну аутентифікацію).

Відкриваємо список провайдерів, доступних для Windows аутентифікації (Providers). За умовчанням доступні два провайдера: Negotiate і NTLM. Negotiate - це контейнер, який в якості першого методу перевірки автентичності використовує Kerberos, якщо ця аутентифікація не вдається, використовується NTLM. Необхідно, щоб в списку провайдерів метод Negotiate стояв першим.

Наступний етап - реєстрація Service Principal Name (SPN) записів для імені сайту, до якого будуть звертатися користувачі. У тому випадку, якщо сайт IIS повинен бути доступний тільки по імені сервера, на якому він розташований (http: // server-name або http://server-name.contoso.com), створювати додаткові SPN записи не потрібно (SPN записи вже є у вашому профілі сервера в AD). При використанні адреси сайту, відмінного від імені хоста, або при побудові веб-ферми з балансуванням, доведеться прив'язувати додаткові записи SPN до профілю сервера або користувача.

Припустимо, у нас є ферма IIS серверів. В цьому випадку оптимально створити окремий обліковий запис в AD і прив'язати SPN записи до неї. З-під цієї ж облікового запису будуть запускати цільової Application Pool нашого сайту.

Створимо доменну обліковий запис iis_service. Переконаємося, що SPN записи для цього об'єкта не призначені (атрибут servicePrincipalName порожній).

Припустимо, що сайт повинен відповідати за адресами _http: // webportal and _http: //webportal.contoso.loc. Ми повинні прописати ці адреси в SPN атрибут службового облікового запису

Setspn / s HTTP / webportal contoso \ iis_service
Setspn / s HTTP / webportal.contoso.loc contoso \ iis_service

Таким чином, ми дозволимо цього облікового запису розшифровувати тікети Kerberos при зверненні користувачів до даних адресами і аутентифицировать сесії.

Перевірити настройки SPN у облікового запису можна так:

setspn / l iis_service

Порада. Kerberos не працюватиме коректно при наявності дублюючих SPN у різних записів домену. За допомогою наступної команди, переконайтеся, що дублікатів SPN в домені немає: setspn -x

Наступний етап - налаштування в IIS Application Pool для запуску з-під створеної сервісної облікового запису.

Виберіть Application Pool сайту (в нашому прикладі це DefaultAppPool).

Відкрийте розділ налаштувань Advanced Settings  і перейдіть до параметру Identity.

Змініть його з ApplicationPoolIdentity на contoso \ iis_service.

Потім в консолі IIS Manager перейдіть на свій сайт і виберіть секцію Configuration Editor.

У випадаючому меню перейдіть в розділ system.webServer> security> authentication> windowsAuthentication

змініть useAppPoolCredentials на True.

Тим самим ми дозволимо IIS використовувати доменну учетку для розшифровки квитків Kerberos від клієнтів.

Перезапустити IIS командою:

iisreset

Аналогічну настройку потрібно виконати на всіх серверах веб-ферми.

Протестуємо роботу Kerberos авторизації, відкривши в браузері клієнта (браузер потрібно попередньо налаштувати для використання Kerberos) адреса _http: //webportal.contoso.loc

Примітка. У моєму прикладі, на IE11 відразу авторизуватися не вийшло. Довелося додати адресу в довірені і в настройках Trusted Zones Sites виставити значення параметра User Authentication -> Logon на Automatic logon with current user name and password

Переконатися, що для авторизації на сайті використовується Kerberos можна за допомогою інспектування HTTP трафіку утилітою Fiddler (раніше ми вже згадували цю утиліту).

Запускаємо Fiddler, в браузері відкриваємо цільової сайт. У лівому вікні знаходимо рядок звернення до сайті. Справа переходимо на вкладку Inspectors. рядок Authorization Header (Negotiate) appears to contain a Kerberos ticket, говорить про те, що для авторизації на IIS сайті використовувався протокол Kerberos.