AD FS и Single Sign-On в Windows Server: настройка SSO

Что такое AD FS и зачем нужен SSO

Active Directory Federation Services (AD FS) — роль Windows Server, обеспечивающая Single Sign-On (единый вход) для веб-приложений и облачных сервисов. AD FS позволяет пользователям Active Directory аутентифицироваться один раз и получать доступ к приложениям без повторного ввода учётных данных — как к внутренним корпоративным, так и к внешним SaaS-сервисам.

AD FS поддерживает стандартные протоколы федерации: SAML 2.0 (Security Assertion Markup Language), WS-Federation, OAuth 2.0 и OpenID Connect. Это означает совместимость с тысячами приложений: Office 365, Salesforce, AWS, GitLab, Jira, Confluence и любыми приложениями, поддерживающими SAML/OIDC.

Архитектура AD FS: сервер AD FS выступает в роли Identity Provider (IdP) — при обращении к защищённому приложению (Service Provider / Relying Party) пользователь перенаправляется на страницу входа AD FS, аутентифицируется через Active Directory, получает токен (SAML assertion / JWT) и перенаправляется обратно в приложение с подтверждением личности.

Требования к инфраструктуре

Для production-развёртывания AD FS необходимы:

  • Windows Server 2019/2022 — член домена Active Directory
  • SSL-сертификат — от публичного CA (Let's Encrypt, DigiCert) для FQDN вида adfs.company.ru
  • DNS-запись — A-запись adfs.company.ru → IP сервера AD FS
  • Service Account — gMSA (Group Managed Service Account) для службы AD FS
  • Дополнительно: WAP (Web Application Proxy) — для доступа из интернета без VPN

Минимальные ресурсы: 4 ядра, 8 ГБ RAM, 100 ГБ диск. Для HA — два AD FS-сервера за балансировщиком + SQL Server для конфигурации (вместо WID).

Установка AD FS на Windows Server

Предварительные шаги: импорт SSL-сертификата и создание service account:

# PowerShell: создание gMSA для AD FS
# На контроллере домена:
Add-KdsRootKey -EffectiveImmediately
New-ADServiceAccount -Name "svc-adfs" -DNSHostName "adfs.company.ru" `
  -PrincipalsAllowedToRetrieveManagedPassword "ADFS-Server$"

# На AD FS сервере: установка gMSA
Install-ADServiceAccount -Identity "svc-adfs"
Test-ADServiceAccount -Identity "svc-adfs"
# True

Установка роли AD FS:

# Установка роли
Install-WindowsFeature -Name ADFS-Federation -IncludeManagementTools

# Импорт SSL-сертификата (если ещё не установлен)
Import-PfxCertificate -FilePath C:\certs\adfs.company.ru.pfx `
  -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString -String "CertPass" -AsPlainText -Force)

# Получение thumbprint сертификата
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -like "*adfs.company.ru*" }
$cert.Thumbprint

Конфигурация AD FS

Запуск мастера настройки через PowerShell:

# Настройка первого сервера AD FS в ферме
Install-AdfsFarm `
  -CertificateThumbprint $cert.Thumbprint `
  -FederationServiceDisplayName "Company SSO" `
  -FederationServiceName "adfs.company.ru" `
  -GroupServiceAccountIdentifier "DOMAIN\svc-adfs$" `
  -OverwriteConfiguration

# Проверка работоспособности
Get-AdfsProperties | Select-Object HostName, FederationServiceName, Identifier

# Endpoint метаданных (должен быть доступен по HTTPS):
# https://adfs.company.ru/FederationMetadata/2007-06/FederationMetadata.xml

# Проверка из браузера:
# https://adfs.company.ru/adfs/ls/IdpInitiatedSignOn.aspx
# Должна отобразиться страница входа

Настройка SAML-федерации для веб-приложений

Добавление приложения (Relying Party Trust) для SAML-аутентификации. Пример — интеграция с корпоративным GitLab:

# Добавление Relying Party через метаданные
Add-AdfsRelyingPartyTrust `
  -Name "GitLab" `
  -MetadataUrl "https://gitlab.company.ru/users/auth/saml/metadata" `
  -IssuanceAuthorizationRules '@RuleTemplate = "AllowAllAuthzRule" => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");'

# Или вручную (если метаданные недоступны)
Add-AdfsRelyingPartyTrust `
  -Name "Custom App" `
  -Identifier "https://app.company.ru/saml" `
  -SamlEndpoint (New-AdfsSamlEndpoint -Binding POST -Protocol SAMLAssertionConsumer `
    -Uri "https://app.company.ru/saml/acs") `
  -IssuanceAuthorizationRules '@RuleTemplate = "AllowAllAuthzRule" => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");'

Настройка Claim Rules — какие атрибуты AD передавать приложению:

# Правила трансформации Claims
$rules = @'
@RuleName = "Send LDAP Attributes"
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", 
   Issuer == "AD AUTHORITY"]
=> issue(store = "Active Directory", 
   types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
            "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname",
            "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname",
            "http://schemas.xmlsoap.org/claims/Group"),
   query = ";mail,givenName,sn,tokenGroups;{0}", 
   param = c.Value);

@RuleName = "Send NameID"
c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"]
=> issue(Type = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
   Issuer = c.Issuer, Value = c.Value,
   Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] = 
   "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress");
'@

Set-AdfsRelyingPartyTrust -TargetName "GitLab" -IssuanceTransformRules $rules

Федерация AD FS с Office 365

Интеграция AD FS с Microsoft 365 — наиболее распространённый сценарий. Позволяет пользователям входить в Office 365 с корпоративными учётными данными Active Directory:

# Установка модуля Azure AD (MSOnline)
Install-Module -Name MSOnline -Force
Connect-MsolService

# Конвертация домена в федеративный
Set-MsolDomainAuthentication `
  -DomainName "company.ru" `
  -Authentication Federated `
  -ActiveLogOnUri "https://adfs.company.ru/adfs/services/trust/2005/usernamemixed" `
  -PassiveLogOnUri "https://adfs.company.ru/adfs/ls/" `
  -MetadataExchangeUri "https://adfs.company.ru/adfs/services/trust/mex" `
  -SigningCertificate (Get-Content C:\certs\adfs-token-signing.cer -Raw) `
  -IssuerUri "http://adfs.company.ru/adfs/services/trust" `
  -LogOffUri "https://adfs.company.ru/adfs/ls/?wa=wsignout1.0" `
  -PreferredAuthenticationProtocol SAMLP

# Проверка
Get-MsolDomainFederationSettings -DomainName "company.ru"

# Или используйте модуль Azure AD Connect (рекомендуется):
# Azure AD Connect автоматически настраивает федерацию
# при выборе метода "Federation with AD FS"

Настройка Web Application Proxy для доступа извне

WAP (Web Application Proxy) публикует AD FS в интернет, позволяя мобильным пользователям и внешним приложениям использовать SSO:

# На отдельном сервере в DMZ (не в домене!)
Install-WindowsFeature -Name Web-Application-Proxy -IncludeManagementTools

# Импорт того же SSL-сертификата
Import-PfxCertificate -FilePath C:\certs\adfs.company.ru.pfx `
  -CertStoreLocation Cert:\LocalMachine\My `
  -Password (ConvertTo-SecureString -String "CertPass" -AsPlainText -Force)

# Настройка WAP
Install-WebApplicationProxy `
  -CertificateThumbprint $cert.Thumbprint `
  -FederationServiceName "adfs.company.ru" `
  -FederationServiceTrustCredential (Get-Credential)
  # Введите учётные данные доменного администратора

# Публикация AD FS через WAP
Add-WebApplicationProxyApplication `
  -Name "ADFS" `
  -ExternalUrl "https://adfs.company.ru/" `
  -BackendServerUrl "https://adfs.company.ru/" `
  -ExternalCertificateThumbprint $cert.Thumbprint `
  -ExternalPreauthentication PassThrough

OAuth 2.0 и OpenID Connect в AD FS

AD FS в Windows Server 2019/2022 полноценно поддерживает OAuth 2.0 и OpenID Connect (OIDC), что позволяет интегрироваться с современными SPA и мобильными приложениями:

# Создание Application Group для OAuth/OIDC
Add-AdfsApplicationGroup -Name "Intranet Portal" -ApplicationGroupIdentifier "IntranetPortal"

# Регистрация Server Application (backend/confidential client)
Add-AdfsServerApplication `
  -Name "Portal Backend" `
  -ApplicationGroupIdentifier "IntranetPortal" `
  -Identifier "https://portal.company.ru" `
  -RedirectUri "https://portal.company.ru/auth/callback" `
  -GenerateClientSecret

# Регистрация Web API (ресурс)
Add-AdfsWebApiApplication `
  -Name "Portal API" `
  -ApplicationGroupIdentifier "IntranetPortal" `
  -Identifier "https://portal.company.ru/api" `
  -AccessControlPolicyName "Permit everyone"

# Правила claim для API
Set-AdfsWebApiApplication `
  -TargetIdentifier "https://portal.company.ru/api" `
  -IssuanceTransformRules '@RuleName = "Send UPN"
c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"]
=> issue(claim = c);'

Endpoint-ы для OIDC-интеграции:

# OpenID Configuration (discovery endpoint)
# https://adfs.company.ru/adfs/.well-known/openid-configuration

# Authorize endpoint:
# https://adfs.company.ru/adfs/oauth2/authorize

# Token endpoint:
# https://adfs.company.ru/adfs/oauth2/token

# UserInfo endpoint:
# https://adfs.company.ru/adfs/userinfo

Кастомизация страницы входа

AD FS позволяет брендировать страницу входа под корпоративный стиль:

# Установка логотипа и иллюстрации
Set-AdfsWebTheme -TargetName default `
  -Logo @{path="C:\branding\logo.png"} `
  -Illustration @{path="C:\branding\illustration.jpg"}

# Изменение текстов
Set-AdfsGlobalWebContent `
  -SignInPageDescriptionText "Вход в корпоративную систему компании" `
  -HomeRealmDiscoveryOtherOrganizationDescriptionText "Выберите организацию" `
  -ErrorPageGenericErrorMessage "Ошибка аутентификации. Обратитесь в ИТ-отдел."

# Кастомный CSS
Set-AdfsWebTheme -TargetName default `
  -StyleSheet @{path="C:\branding\custom.css"}

# Пример custom.css:
# #loginArea { background-color: #1a365d; border-radius: 8px; }
# #submitButton { background-color: #2d6bc4; }
# .title { font-family: 'Segoe UI', sans-serif; color: #fff; }

# Для полного контроля — создание кастомной темы:
New-AdfsWebTheme -Name "CompanyTheme" -SourceName default
Export-AdfsWebTheme -Name "CompanyTheme" -DirectoryPath C:\adfs-theme
# Отредактируйте файлы в C:\adfs-theme, затем:
Set-AdfsWebTheme -TargetName "CompanyTheme" -AdditionalFileResource @{Uri="/adfs/portal/custom.js";Path="C:\adfs-theme\custom.js"}
Set-AdfsWebConfig -ActiveThemeName "CompanyTheme"

Мониторинг и troubleshooting AD FS

Диагностика проблем SSO — типичные задачи администратора:

# Включение расширенного аудита
Set-AdfsProperties -AuditLevel Verbose
auditpol /set /subcategory:"Application Generated" /failure:enable /success:enable

# Просмотр логов
Get-WinEvent -LogName "AD FS/Admin" -MaxEvents 20 | Format-Table TimeCreated, Message -Wrap

# Тест федерации
# PowerShell: проверка SAML-токена
$endpoint = "https://adfs.company.ru/adfs/services/trust/13/usernamemixed"
$body = @"
<s:Envelope xmlns:s='http://www.w3.org/2003/05/soap-envelope'
  xmlns:a='http://www.w3.org/2005/08/addressing'
  xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
  <s:Body>
    <trust:RequestSecurityToken xmlns:trust='http://docs.oasis-open.org/ws-sx/ws-trust/200512'>
      <wsp:AppliesTo xmlns:wsp='http://schemas.xmlsoap.org/ws/2004/09/policy'>
        <a:EndpointReference><a:Address>urn:federation:MicrosoftOnline</a:Address></a:EndpointReference>
      </wsp:AppliesTo>
      <trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
      <trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
    </trust:RequestSecurityToken>
  </s:Body>
</s:Envelope>
"@

Invoke-WebRequest -Uri $endpoint -Method POST -Body $body -ContentType "application/soap+xml"

# Проверка сертификатов (истечение — частая причина сбоев)
Get-AdfsCertificate | Select-Object CertificateType, Thumbprint, NotAfter | Format-Table

Типичные проблемы SSO и решения

Наиболее частые проблемы при эксплуатации AD FS:

  • Ошибка «There was a problem accessing the site» — проверьте SSL-сертификат (истёк?), DNS-резолвинг, и открыт ли порт 443 на firewall
  • Бесконечный цикл редиректов — несовпадение Identifier (Entity ID) в настройках AD FS и приложения. Проверьте URL до символа
  • Claims не приходят в приложение — откройте Relying Party Trust → Edit Claim Issuance Policy. Убедитесь, что правила трансформации настроены и атрибуты существуют в AD
  • Истечение Token-Signing сертификата — AD FS автоматически ротирует самоподписанные сертификаты, но приложения требуют обновления метаданных. Используйте Update-AdfsCertificate -Urgent
# Проверка метаданных (должны быть доступны без аутентификации)
Invoke-WebRequest -Uri "https://adfs.company.ru/FederationMetadata/2007-06/FederationMetadata.xml" | Select-Object StatusCode
# StatusCode: 200

# Обновление сертификатов
Update-AdfsCertificate -CertificateType Token-Signing
Update-AdfsCertificate -CertificateType Token-Decrypting

# Принудительная синхронизация в ферме AD FS
Set-AdfsSyncProperties -PrimaryComputerName "adfs-primary.company.local" -Role SecondaryComputer

Часто задаваемые вопросы

AD FS — on-premise решение, устанавливается на ваш Windows Server, аутентифицирует пользователей через локальный Active Directory. Azure AD (Entra ID) — облачный Identity Provider от Microsoft. Для гибридных сред используют оба: Azure AD Connect синхронизирует пользователей из AD в облако, а AD FS обеспечивает федеративную аутентификацию. Тренд — переход на Azure AD с Password Hash Sync или Pass-through Authentication, но AD FS по-прежнему нужен для строгих требований безопасности (данные не покидают периметр).

Не обязательно. Microsoft предлагает три метода аутентификации для Office 365: 1) Password Hash Sync — хэши паролей синхронизируются в Azure AD (самый простой); 2) Pass-through Authentication — аутентификация через on-premise агент без синхронизации паролей; 3) AD FS Federation — полная федерация. AD FS нужен, если требуется: smart card / certificate-based аутентификация, сложные MFA-сценарии, compliance-требования (пароли не должны покидать периметр).

Разверните ферму AD FS: минимум 2 сервера AD FS за NLB (Network Load Balancer) или аппаратным балансировщиком (F5, HAProxy). Для хранения конфигурации используйте SQL Server Always On вместо WID (Windows Internal Database) — WID поддерживает до 5 серверов, но только master-slave репликацию. Для WAP — аналогично, 2 WAP-сервера за внешним балансировщиком.

Да, Let's Encrypt сертификаты полностью поддерживаются AD FS. Однако они выдаются на 90 дней, что требует автоматического обновления. Используйте win-acme (ACME-клиент для Windows) с post-renewal скриптом: Set-AdfsSslCertificate -Thumbprint NEW_THUMBPRINT и Set-AdfsCertificate -CertificateType Service-Communications -Thumbprint NEW_THUMBPRINT. Для WAP обновление также автоматизируется.

AD FS поддерживает MFA через встроенные и внешние провайдеры. Встроенные: Azure MFA (требует лицензию Azure AD Premium), Certificate Authentication. Внешние: Duo Security, RSA SecurID, YubiKey (через плагины). Настройка: Set-AdfsGlobalAuthenticationPolicy -AdditionalAuthenticationProvider DuoMfaAdapter. Для условного MFA: Set-AdfsRelyingPartyTrust -TargetName "App" -AdditionalAuthenticationRules 'c:[Type == "http://schemas.microsoft.com/ws/2012/01/insidecorporatenetwork", Value == "false"] => issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod", Value = "http://schemas.microsoft.com/claims/multipleauthn");' — MFA только для внешних подключений.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#AD FS настройка#Single Sign-On#SSO Windows Server#ADFS федерация#SAML аутентификация#AD FS Office 365#Windows SSO#OAuth AD FS
Комментарии 0

Оставить комментарий

загрузка...