AD FS: настройка единого входа SSO для корпоративных сервисов
Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет администрирования AD-инфраструктур я развернул AD FS у более чем 20 клиентов — от юридической конторы на 40 пользователей до производственного холдинга на 400. И всегда одна и та же история: сотрудники жалуются, что у них десяток логинов — в почту, в портал, в 1С, в Confluence. А руководитель жалуется, что люди пишут пароли на стикерах. SSO решает обе задачи сразу.
Когда нужен AD FS
Active Directory Federation Services — роль Windows Server, которая выдаёт федеративные токены (SAML, WS-Fed, OAuth, OpenID Connect) пользователям, вошедшим в AD. Приложение доверяет этим токенам и пускает пользователя без отдельного пароля.
Типовые сценарии использования:
- Microsoft 365. Сотрудник входит в Outlook на домашнем ПК — его редиректит на AD FS, он вводит доменный логин/пароль, получает доступ к почте без отдельной учётки M365.
- On-premises SaaS. Confluence, Jira, GitLab — большинство поддерживают SAML. Настроил один раз — все сотрудники входят одним логином.
- Корпоративные веб-приложения. Собственные CRM, ERP, порталы на ASP.NET через WIF или OIDC.
- Extranet-порталы для партнёров. Контрагент приходит со своим IdP, вы доверяете его федерации.
- MFA через AD FS. Добавляете второй фактор единожды на уровне AD FS, и он автоматически работает во всех подключённых сервисах.
Архитектура фермы
Минимальный продакшн AD FS — ферма из двух серверов плюс два Web Application Proxy в DMZ. Внутренние серверы — AD-joined, WAP — Workgroup. Схема:
- ADFS01 и ADFS02 — во внутренней сети, объединены в ферму, БД в WID (для малых инсталляций) или SQL Server (для больших).
- WAP01 и WAP02 — в DMZ, принимают внешние запросы на sts.company.ru (443/tcp), проксируют на внутреннюю ферму.
- NLB или HW-балансировщик перед AD FS и WAP — виртуальный IP, чтобы не завязываться на конкретный сервер.
- Публичный DNS-запись sts.company.ru → внешний IP WAP.
- Внутренний DNS-запись sts.company.ru → VIP AD FS фермы.
| Роль | ОС | Требования |
|---|---|---|
| AD FS-сервер | Server 2019/2022/2025 | 4 vCPU, 8 ГБ RAM, 80 ГБ SSD, AD-joined |
| WAP | Server 2019/2022/2025 | 2 vCPU, 4 ГБ RAM, 60 ГБ SSD, Workgroup в DMZ |
| NLB/балансер | - | VIP, Health probe на 443/tcp |
Подготовка сертификатов
AD FS требует три сертификата:
- Service Communications — публичный SSL на sts.company.ru, видят внешние клиенты.
- Token-signing — самоподписанный, живёт год, автоматически ротируется.
- Token-decrypting — тоже самоподписанный, год.
Покупаем Comodo/DigiCert/Sectigo на sts.company.ru (или берём Let's Encrypt через ACME-клиент). Устанавливаем сертификат в Computer Personal Store на AD FS01.
Установка первого AD FS
Сервисная учётка с именем svc_adfs в AD, с правами Read на базу CN=Program Data,DC=company,DC=ru. В группу Managed Service Accounts добавлять не обязательно — можно обычную user account.
Install-WindowsFeature ADFS-Federation -IncludeManagementTools
$cred = Get-Credential -Message "Введите svc_adfs"
Install-AdfsFarm `
-CertificateThumbprint "B3A5F...thumbprint" `
-FederationServiceName "sts.company.ru" `
-FederationServiceDisplayName "Company SSO" `
-ServiceAccountCredential $cred
После инсталляции проверяем через браузер: https://sts.company.ru/adfs/ls/IdpInitiatedSignon.aspx (нужно включить отдельно, по умолчанию выключена). Должна появиться страница логина.
Добавление второго AD FS в ферму
Install-WindowsFeature ADFS-Federation -IncludeManagementTools
Add-AdfsFarmNode `
-PrimaryComputerName "adfs01.corp.company.ru" `
-CertificateThumbprint "B3A5F...thumbprint" `
-ServiceAccountCredential $cred
Оба сервера добавляем в NLB-кластер Windows или ставим за внешним балансером, VIP — 10.10.5.100. Внутренний DNS sts.company.ru указывает на этот VIP.
Развёртывание Web Application Proxy
WAP ставится в DMZ, без AD. Ему нужен тот же публичный сертификат sts.company.ru и трастовый токен от AD FS.
# На AD FS01 генерируем один раз одноразовый токен
Get-AdfsServerConfiguration | Select FSConfigurationProxyTrustCertificate
# На WAP
Install-WindowsFeature Web-Application-Proxy -IncludeManagementTools
$cert = (Get-ChildItem Cert:\LocalMachine\My | Where Subject -like "*sts.company.ru*").Thumbprint
Install-WebApplicationProxy `
-CertificateThumbprint $cert `
-FederationServiceName "sts.company.ru" `
-FederationServiceTrustCredential (Get-Credential)
Второй WAP — аналогично. Внешний балансировщик / CDN → 443/tcp на WAP01 и WAP02.
Relying Party Trust для Microsoft 365
Самый распространённый сценарий — SSO в Microsoft 365. Делается через Entra ID Connect (бывший Azure AD Connect). Запускаете мастер на отдельном сервере, выбираете режим Federation with AD FS, указываете домен company.ru и AD FS-сервер. Мастер сам создаёт Relying Party Trust в AD FS и добавляет домен в Entra.
Если делать вручную — через PowerShell:
$MetadataUrl = "https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml"
Add-AdfsRelyingPartyTrust `
-Name "Microsoft 365" `
-MetadataURL $MetadataUrl `
-MonitoringEnabled $true `
-AutoUpdateEnabled $true
Дальше настраиваем Claim Rules — правила выдачи атрибутов. Минимум: UserPrincipalName → UPN, objectGUID → ImmutableID.
Интеграция SAML-приложений
Любое приложение с поддержкой SAML 2.0 цепляется одинаково: экспортируете метадату AD FS (https://sts.company.ru/FederationMetadata/2007-06/FederationMetadata.xml), загружаете в приложение. Потом на AD FS создаёте Relying Party Trust из метадаты приложения и пишете Claim Rules.
Типовые Claim Rules:
# LDAP Attributes to Outgoing Claims
Email = ldap-lookup(mail)
NameID = ldap-lookup(userPrincipalName)
FirstName = ldap-lookup(givenName)
LastName = ldap-lookup(sn)
Groups = ldap-lookup(memberOf) # для авторизации по группам
У нас на практике за 2 часа подключаем типичное приложение — Confluence, GitLab, Grafana, Jenkins. Дольше только с российскими ERP-системами, где SAML-имплементация реализована «как получилось».
MFA через сторонние провайдеры
AD FS поддерживает MFA-плагины: Duo, Okta Verify, YubiKey, Multifactor.ru, на Server 2019+ — встроенный Azure MFA. Включается глобально или per Relying Party:
Set-AdfsRelyingPartyTrust `
-TargetName "Microsoft 365" `
-AdditionalAuthenticationRules 'c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid",
Value =~ "^(?i)S-1-5-21-...-RequireMFA$"] => issue(Type = "http://schemas.microsoft.com/claims/authnmethodsreferences", Value = "http://schemas.microsoft.com/claims/multipleauthn");'
Схема: если пользователь в группе RequireMFA, на второй фактор попадает обязательно. Остальные — однофакторно с домашней сети, двухфакторно извне.
Реальный кейс: SSO для юридической фирмы
В феврале 2025 юридическая фирма — 72 юриста, офис в Москва-Сити — попросили подключить SSO. Проблема: 8 сервисов (M365, iManage, Confluence, внутренний портал, DocuSign, BPMOnline, Teamwork, Dropbox Business) = 8 логинов на каждого сотрудника. Пароли сбрасывались по 10–15 раз в неделю.
За 10 рабочих дней мы развернули отказоустойчивую ферму: два Dell R650 с Xeon Platinum 8280 в дата-центре МТС под AD FS и два WAP на виртуалках в DMZ. Trust-ы для всех 8 сервисов, публичный SSL Wildcard *.lawfirm.ru, MFA через Multifactor.ru для внешнего доступа.
Результат: звонки в саппорт по паролям упали на 92% за первые два месяца. Время входа в рабочие сервисы — 4–6 секунд против минуты на ручной ввод. Стоимость работ — 220 000 руб. за всё включая лицензии сертификатов. Окупилось за квартал только на снижении нагрузки хелпдеска.
Типичные грабли
- Сертификат с истёкшим сроком. Сразу ломается всё — M365, SAML-приложения. Мониторинг срока обязателен, я ставлю алерт за 45 дней.
- Несовпадающие Claim Rules. Приложение ждёт NameID в формате email, AD FS отдаёт SID — пользователь получает «Access denied».
- WAP не видит AD FS. Забыли открыть 443/tcp между DMZ и внутренней сетью.
- Кликджекинг на странице логина. Включите
Set-AdfsResponseHeaders -SetHeaderName "X-Frame-Options" -SetHeaderValue "DENY". - Забытая автоматическая ротация token-signing. Через год ломается — проверьте
Get-AdfsProperties | Select AutoCertificateRollover.
Развернём корпоративное SSO на AD FS
Я лично проектирую и внедряю фермы AD FS с WAP, подключаю Microsoft 365, SAML- и OIDC-приложения, настраиваю MFA. Срок внедрения — от 5 до 15 рабочих дней в зависимости от числа сервисов.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ
- Зачем AD FS, если есть Entra ID (Azure AD)?
- Entra ID удобнее для облачных сценариев, но AD FS остаётся нужен, когда корпоративная политика требует держать аутентификацию в локальной инфраструктуре. Плюс AD FS работает без интернета и лицензий P1/P2.
- Сколько серверов нужно под AD FS?
- Минимум один AD FS-сервер и один Web Application Proxy в DMZ. Для продакшн — два AD FS в ферме + два WAP. Это даёт отказоустойчивость и разделение ролей internal/external.
- Что такое Relying Party Trust?
- Это доверительные отношения между AD FS и приложением-потребителем (Microsoft 365, Confluence, SharePoint). AD FS выдаёт токен пользователю, приложение его принимает без отдельной аутентификации.
- Нужен ли публичный SSL-сертификат?
- Для сервисных трастов с облаком (Microsoft 365) — обязательно. Публичный CA, Wildcard или одиночный на sts.company.ru. Для внутренних трастов достаточно сертификата от корпоративного AD CS.
- Как интегрировать с Microsoft 365 / Entra?
- Через Azure AD Connect (сейчас Entra ID Connect) с опцией Federation. Мастер сам создаёт Relying Party Trust в AD FS и прописывает домены в Entra. После этого сотрудники входят в M365 своими доменными учётками.