Служба KDC прокси (Kerberos Key Distribution Center Proxy) позволяет клиентам выполнять Kerberos аутентификацию через промежуточный сервер, когда у пользователей нет прямого доступа к контроллерам домена Active Directory. Как правило, он нужен для сценариев Kerberos аутентификации внешних пользователей (из интернета), или пользователей рабочих групп. Служба KDC proxy изначально разработана для DirectAccess, RDP Gateway, файлового доступа SMB over QUIC однако в связи с планами Microsoft полностью отказаться от NTLM v1 и v2, службу Kerberos прокси возможно придется использовать и для аутентификации в других сервисах удаленного доступа.
Для выполнения обычной Kerberos аутентификации между клиентом и службой KDC на контроллере домена AD должны быть открыты следующие порты:
- UDP/TCP 88 – Kerberos аутентификация, получение билетов TGT
- UDP/TCP 464 – смена пароля пользователя через Kerberos
Открывать эти порты внешним пользователям до контроллеров домена небезопасно, поэтому на точке подключения пользователей можно создать службу KDC proxy. Клиенты устанавливают соединение с KDC прокси по HTTPS (TCP/443) порту, и уже в шифрованном туннеле через него пересылают запросы аутентификации Kerberos к контроллерам домена.
Рассмотрим простейший сценарий Remote Desktop Gateway сервера во внутреннем периметре, к которому подключаются внешние пользователи. На RDGW хосте отключена NTLM аутентификация (разрешена только Kerberos аутентификация), поэтому внешние пользователи (подключающиеся с не-доменных машин), не смогут подключиться к такому сервере с RDP ошибкой:
An authentication error has occurred. The function requested is not supported Remote computer: xxxx This could be due to CredSSP encryption oracle remediation.

В данной ситуации, т.к. клиент не можете аутентифицироваться по Kerberos на DC, будет выполнена попытка отката (fallback) до NTLM (который запрещен на хосте), в результате пользователь не сможет выполнить удаленный вход.
Чтобы внешние клиенты могли аутентифицироваться на данном RDP хосте через Kerberos, развернем на нем службу KDC Proxy Service (KPSSVC).
На хосте со службой KDC прокси должен быть установлен сертификат, который будет использоваться для шифрования трафика и проверки подлинности сервера. Extended Key Usage (EKU) сертификата должны включать
Server Authentication
,
Client Authentication
,
Kerberos Authentication
. В
SAN
сертификата должно быть включено FQDN сервера KDC прокси, по которому к нему будут обращаться клиенты. Такой сертификат можно выпустить от внутреннего CA (для тестовых развертываний можно использовать самоподписанный сертификат).
Сертификат должен быть установлен в Personal хранилище компьютера. Скопируйте отпечаток (Thumbrint) такого сертификата:
Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -like "*CN=w-rds01.winitpro.ru*" } | Select-Object -ExpandProperty Thumbprint

Теперь переходим к настройке службы KDC прокси.
Создаем точку подключения (URL endpoint):
NETSH http add urlacl url=https://+:443/KdcProxy user="NT authority\Network Service"
URL reservation successfully added

Генерируем уникальный GUID:
$appguid = [Guid]::NewGuid().ToString("B")
Задаем значение отпечатка сертификата:
$kdccert="2E9D8A634ACA8A17657AD597CE0CA7E1D634B088"
Привязываем сертификат к точке подключения:
netsh http add sslcert ipport=0.0.0.0:443 certhash=$kdccert appid=$appguid
SSL Certificate successfully added

Т.к. мы не планируем использовать аутентификацию с помощью смарт карты или Windows Hello, отключаем аутентификацию по сертификатам:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\KPSSVC\Settings" /v HttpsClientAuth /t REG_DWORD /d 0x0 /f
Включаем аутентификацию по паролю:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\KPSSVC\Settings" /v DisallowUnprotectedPasswordAuth /t REG_DWORD /d 0x0 /f
Включаем автозапуск для службы KDC Proxy Service (KPSSVC) и запускаем ее:
Set-Service kpssvc -StartupType Automatic
Start-Service kpssvc
Разрешаем входящий трафик по TCP порту 443 на сервере, чтобы клиенты могли подключиться к KDC Proxy. Создайте разрешающее правило файрвола с помощью PowerShell:
New-NetFirewallRule -DisplayName "Allow KDCProxy TCP" -Direction Inbound -Protocol TCP -LocalPort 443
Теперь нужно внести изменения на стороне клиентов, чтобы они использовали KDC прокси для подключений.
Параметры KDC прокси для клиентов можно задать через GPO Specify KDC proxy servers for Kerberos clients в разделе Computer Configuration -> Policies -> Administrative Templates -> System -> Kerberos.
Включите политику и в ее настройках (кнопка Show) добавьте строку для подключения к вашему KDC прокси в формате:
- Value name: имя вашего домена AD,
winitpro.ru - Value: строка подключения к KDC прокси для этого домена (можно указать несколько серверов):
<https w-rds01.winitpro.ru:443:kdcproxy />

Или можно добавить настройки KDC прокси на клиенте непосредственно через реестр:
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos" /v KdcProxyServer_Enabled /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\KdcProxy\ProxyServers" /v winitpro.ru /t REG_SZ /d "<https w-rds01.wintpro.ru:443:kdcproxy />" /f
Чтобы применить настройки GPO, нужно перезагрузить клиентский компьютер.
Теперь попробуйте выполнить вход на RDP gateway с клиента. Клиент должен воспользоваться KDC прокси для аутентификации на контроллере домена. Выполните команду, чтобы проверить что тикет Kerberos был выдан через
kdcproxy
:
klist get krbtgt

В будущем Microsoft планирует автоматизировать и упростить развертывание KDC прокси через веб интерфейс Windows Admin Center (WAC).

