НейроАгент

Настройка Kerberos аутентификации для ASP.NET MVC вне домена

Полное руководство по настройке Kerberos аутентификации для ASP.NET MVC приложений на Windows Server вне домена. Узнайте о коннекторах, ADFS и альтернативных методах безопасной аутентификации.

Вопрос

Как настроить Kerberos аутентификацию для ASP.NET MVC приложения на Windows Server вне домена?

У меня есть веб-приложение на ASP.NET MVC, работающее на IIS Windows Server. Клиенты подключаются к приложению из домена, но сам сервер не является частью домена.

Ранее сервер был в домене, и IIS использовал учетную запись пула приложений для подключения к домену и получения необходимых токенов Kerberos. Приложение успешно обрабатывало аутентификацию пользователей через SSO. Теперь, когда сервер вне домена, настройка учетной записи IIS для подключения к домену невозможна.

Вопрос: можно ли без переписывания логики приложения настроить IIS с использованием прокси-сервера или других расширений IIS для подключения к домена и распределения Kerberos токенов?

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

Переход на Linux не рассматривается, так как приложение представляет собой монолит на устаревшем фреймворке, и его переписка потребует значительных временных затрат, которые бизнес не готов предоставить.

НейроАгент

Kerberos аутентификация для ASP.NET MVC приложения вне домена на Windows Server требует специальных настроек, так как стандартная конфигурация IIS не может напрямую обращаться к домену для получения билетов. Основными решениями являются использование коннекторов Kerberos, настройка доверия между доменом и сервером, либо переход на ADFS для централизованной аутентификации с сохранением существующей логики приложения.

Содержание

Основные подходы к решению

При работе с ASP.NET MVC приложением вне домена существует несколько подходов для реализации Kerberos аутентификации:

  1. Использование коннекторов Kerberos - специальные компоненты, которые выполняют роль посредника между сервером и доменом
  2. Настройка доверия между доменом и сервером - создание доверительных отношений без добавления сервера в домен
  3. Интеграция с ADFS - развертывание службы федерации для обработки аутентификации
  4. Использование прокси-серверов - настройка прокси для перенаправления запросов аутентификации в домен

Каждый из этих подходов имеет свои преимущества и недостатки, выбор зависит от конкретных требований инфраструктуры и безопасности.


Настройка Kerberos через коннекторы

Для реализации Kerberos аутентификации вне домена можно использовать специализированные коннекторы:

Microsoft Kerberos Constrained Delegation

Хотя сервер не входит в домен, можно настроить делегирование с ограничениями:

powershell
# Настройка SPN для веб-приложения
setspn -S HTTP/your-web-server your-domain\service-account

# Разрешение делегирования для службы
Set-ADComputer -Identity "your-web-server" -PrincipalsAllowedToDelegateToAccount "your-domain\service-account"

Использование MIT Kerberos для Windows

Для работы вне домена можно установить MIT Kerberos для Windows:

  1. Скачайте и установите MIT Kerberos для Windows
  2. Настройте файл krb5.conf указанием контроллера домена
  3. Используйте kinit для получения билетов вручную

Пример конфигурации krb5.conf

ini
[libdefaults]
    default_realm = YOURDOMAIN.LOCAL
    dns_lookup_realm = false
    dns_lookup_kdc = true

[realms]
    YOURDOMAIN.LOCAL = {
        kdc = domain-controller.yourdomain.local
        admin_server = domain-controller.yourdomain.local
    }

[domain_realm]
    .yourdomain.local = YOURDOMAIN.LOCAL
    yourdomain.local = YOURDOMAIN.LOCAL

Использование ADFS

ADFS (Active Directory Federation Services) является наиболее надежным решением для вашего сценария:

Шаги по интеграции ADFS

  1. Развертывание ADFS сервера - может быть установлен на отдельном сервере или контроллере домена
  2. Настройка доверия между ADFS и приложением - создание федеративного доверия
  3. Модификация web.config приложения - добавление конфигурации для работы с ADFS

Пример конфигурации ADFS в ASP.NET MVC

xml
<system.identityModel>
  <identityConfiguration>
    <audienceUris>
      <add value="https://your-app-domain.com" />
    </audienceUris>
    <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <trustedIssuers>
        <add thumbprint="ADFS-CERT-THUMBPRINT" name="https://your-adfs-server/adfs/services/trust" />
      </trustedIssuers>
    </issuerNameRegistry>
  </identityConfiguration>
</system.identityModel>

<system.web>
  <authentication mode="None" />
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>

<microsoft.identityModel>
  <service>
    <federationConfiguration>
      <cookieHandler requireSsl="false" />
      <wsFederation passiveRedirectEnabled="true" issuer="https://your-adfs-server/adfs/ls" realm="https://your-app-domain.com" reply="https://your-app-domain.com" requireHttps="false" />
    </federationConfiguration>
  </service>
</microsoft.identityModel>

Преимущества ADFS решения

  • Сохранение существующей логики - приложение может продолжать использовать стандартные методы аутентификации
  • Централизованное управление - все политики безопасности управляются через ADFS
  • Поддержка SSO - единый вход для пользователя в разные приложения
  • Масштабируемость - возможность добавления новых приложений в федерацию

Альтернативные методы аутентификации

Если Kerberos через ADFS невозможен, рассмотрите следующие альтернативы:

Form Authentication с интеграцией домена

csharp
// Пример аутентификации через домен в коде
using System.DirectoryServices.AccountManagement;

public bool AuthenticateUser(string username, string password)
{
    using (var context = new PrincipalContext(ContextType.Domain, "your-domain.com"))
    {
        return context.ValidateCredentials(username, password);
    }
}

Использование Windows Identity Foundation (WIF)

Для более глубокой интеграции с доменом:

csharp
// Настройка WIF в web.config
<system.identityModel>
  <identityConfiguration>
    <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <trustedIssuers>
        <add thumbprint="CERT-THUMBPRINT" name="YOURDOMAIN" />
      </trustedIssuers>
    </issuerNameRegistry>
  </identityConfiguration>
</system.identityModel>

OAuth 2.0/OpenID Connect

Современный стандарт для аутентификации:

csharp
// Настройка OAuth 2.0
services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = "https://your-auth-server",
        ValidateAudience = true,
        ValidAudience = "your-app",
        ValidateLifetime = true
    };
});

Практические примеры конфигурации

Конфигурация IIS для работы вне домена

  1. Настройка пула приложений:

    • Использовать учетную запись локальной системы или специальную учетную запись
    • Установить флажок “Load User Profile” для доступа к профилю пользователя
  2. Настройка аутентификации в IIS:

    • Windows Authentication - включена
    • Anonymous Authentication - отключена
    • ASP.NET Impersonation - отключена
  3. Web.config настройки:

xml
<system.web>
  <authentication mode="Windows">
    <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
  </authentication>
  
  <identity impersonate="true" />
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>

Пример кода для работы с Kerberos вне домена

csharp
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;

public class KerberosHelper
{
    [DllImport("secur32.dll", CharSet = CharSet.Auto)]
    public static extern int LsaConnectUntrusted(
        out IntPtr LsaHandle);

    [DllImport("secur32.dll", CharSet = CharSet.Auto)]
    public static extern int LsaLookupAuthenticationPackage(
        IntPtr LsaHandle,
        ref string PackageName,
        out int AuthenticationPackage);

    public static bool AcquireKerberosTicket(string username, string password, string domain)
    {
        try
        {
            // Реализация получения Kerberos билета
            // без прямого подключения к домену
            return true;
        }
        catch
        {
            return false;
        }
    }
}

Рекомендации по безопасности

Безопасная работа с учетными данными

  1. Хранение паролей - используйте защищенные хранилища как Windows Credential Manager
  2. Шифрование соединений - всегда используйте HTTPS для передачи данных
  3. Ограничение прав - минимальные необходимые права для учетных записей
  4. Аудит доступа - ведение логов всех попыток аутентификации

Настройка политик безопасности

powershell
# Настройка политик для безопасной аутентификации
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" `
                 -Name "LocalAccountTokenFilterPolicy" -Value 1

# Настройка ограничений на делегирование
Set-ADComputer -Identity "your-web-server" `
               -TrustedToAuthForDelegation $false

Заключение

Настройка Kerberos аутентификации для ASP.NET MVC приложения вне домена требует комплексного подхода:

  1. ADFS является оптимальным решением для вашей ситуации, так как позволяет сохранить существующую логику приложения при обеспечении безопасной аутентификации через домен.

  2. Используйте коннекторы Kerberos как временное решение при невозможности развертывания ADFS, но помните о дополнительных рисках безопасности.

  3. Модифицируйте конфигурацию IIS и web.config для поддержки работы вне домена, используя специализированные инструменты и библиотеки.

  4. Рассмотрите переход на современные стандарты OAuth 2.0/OpenID Connect как долгосрочное решение для улучшения безопасности и совместимости.

  5. Обеспечьте полное тестирование всех изменений в изолированной среде перед внедрением в production, так как любая ошибка в настройке аутентификации может привести к потере доступа к приложению.

Поскольку ваша инфраструктура не позволяет перейти на Linux, а переписка приложения нецелесообразна, ADFS остается наиболее профессиональным и надежным решением, соответствующим требованиям ИБ-специалистов и обеспечивающим необходимый уровень безопасности.