От Windows Server до входа по RDP: руководство целиком¶
Это руководство проводит через весь путь на пустом месте: от свежей установки Windows Server до того, как сотрудник со своего устройства входит на удалённый рабочий стол по карте Alatyr, не вводя пароль. Каждый шаг заканчивается проверкой — переходите к следующему, только когда проверка прошла.
Если домен, УЦ и NDES у вас уже есть, начните с шага 5; короткий порядок для готовой инфраструктуры — в «Настройке». Как сертификат получает UPN и SID сотрудника — в «Откуда берутся UPN и SID».
Имена в примерах
Домен — corp.example (NetBIOS CORP), контроллер домена и УЦ —
dc01.corp.example, сервер Alatyr — alatyr.corp.example, машина, на
которую входят по RDP, — rdp01.corp.example, сотрудник —
ivanov@corp.example. Подставьте свои.
Шаг 1. Требования и схема¶
flowchart LR
subgraph Client["Устройство сотрудника"]
Agent["Агент Alatyr<br/>карта, ключ в TPM"]
MSTSC["Клиент RDP"]
end
subgraph Win["Windows Server: dc01"]
DC["AD DS + DNS<br/>контроллер домена"]
CA["AD CS<br/>ЦС предприятия"]
NDES["NDES (SCEP)<br/>IIS, mscep.dll"]
end
Server["Сервер Alatyr"]
RDP["RDP-хост: rdp01<br/>член домена"]
Agent -->|"заявка, сертификат"| Server
Server -->|"SID по UPN, LDAPS 636"| DC
Server -->|"SCEP, HTTPS 443"| NDES
NDES --> CA
MSTSC -->|"RDP 3389, карта в сеансе"| RDP
RDP -->|"Kerberos PKINIT"| DC
classDef alatyr fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#111827
classDef external fill:#f3f4f6,stroke:#9ca3af,stroke-width:1px,stroke-dasharray: 4 3,color:#111827
class Agent,Server alatyr
class DC,CA,NDES,RDP,MSTSC external
| Компонент | Что нужно | Комментарий |
|---|---|---|
| Контроллер домена | Windows Server 2022 с актуальными накопительными обновлениями | обновления нужны для строгого сопоставления сертификатов (KB5014754) |
| ЦС предприятия (AD CS) | Enterprise Root CA или подчинённый ЦС предприятия | в руководстве — на том же сервере, что и контроллер |
| NDES | роль службы регистрации сетевых устройств, IIS с HTTPS | на том же сервере, что и ЦС, либо на отдельном члене домена |
| Сервер Alatyr | установлен по «Установке» | должен достигать dc01 по 443 (NDES) и 636 (LDAPS) |
| RDP-хост | Windows, член домена, с полным доменным именем в DNS | вход по карте возможен только по имени, не по IP-адресу |
| Устройство сотрудника | Windows 10/11 с TPM 2.0 и агентом Alatyr | в домене или вне его; с Linux — см. «Вход по RDP → С Linux» |
Сетевые доступы: агент → сервер Alatyr (API); сервер Alatyr → dc01:636
(LDAPS) и NDES по HTTPS; клиент → RDP-хост по 3389; RDP-хост → контроллер
домена (Kerberos). Клиенту вне домена доступ к контроллеру не обязателен.
Как убедиться. Схема нарисована для вашей сети: известны имена всех узлов, открыты перечисленные порты.
Шаг 2. Windows Server: AD DS, контроллер домена, DNS¶
На чистом Windows Server, от имени локального администратора:
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
Install-ADDSForest -DomainName 'corp.example' -DomainNetbiosName 'CORP' `
-SafeModeAdministratorPassword (Read-Host -AsSecureString 'Пароль DSRM') `
-InstallDns -NoRebootOnCompletion -Force
Restart-Computer
После перезагрузки войдите доменным администратором. Готовность определяйте по ответу каталога, а не по тому, что машина загрузилась:
Get-ADDomain | Select-Object DNSRoot, NetBIOSName, DomainMode
Resolve-DnsName dc01.corp.example
У сотрудников, которые будут входить по карте, заполните атрибуты:
userPrincipalName— обязательно, по нему сервер Alatyr найдёт SID;displayName— желательно: это имя в плитке входа, без него там дважды стоит UPN.
Клиентам и RDP-хосту укажите DNS-сервером контроллер домена; RDP-хост введите
в домен (Add-Computer -DomainName corp.example -Restart).
Как убедиться. Get-ADDomain отвечает, Resolve-DnsName находит
контроллер, Get-ADUser ivanov -Properties displayName показывает UPN и имя.
Шаг 3. AD CS: ЦС предприятия и шаблон для входа по карте¶
3.1. Установите ЦС предприятия¶
Учётной записи, которая ставит ЦС предприятия, нужно членство в Enterprise
Admins; после добавления в группу выйдите из системы и войдите снова. Без
этого установка падает с 0x80072082, и в тексте ошибки нет ни слова о
правах.
Install-WindowsFeature ADCS-Cert-Authority -IncludeManagementTools
Install-AdcsCertificationAuthority -CAType EnterpriseRootCA `
-CACommonName 'Corp Issuing CA' `
-KeyLength 2048 -HashAlgorithmName SHA256 `
-ValidityPeriod Years -ValidityPeriodUnits 10 -Force
Как убедиться. certutil -ping отвечает, а
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration'
показывает имя ЦС в значении Active.
3.2. Создайте шаблон сертификата¶
В консоли шаблонов (certtmpl.msc) сделайте копию шаблона Smartcard Logon
(«Вход со смарт-картой») и назовите её, например, CorpSmartcardLogon. В
копии:
| Вкладка | Значение | Почему |
|---|---|---|
| Subject Name | Supply in the request; флажок «User principal name» в альтернативном имени снят | при SCEP заявителем выступает служебная запись NDES: имя из каталога было бы её именем, а не сотрудника |
| Extensions → Application Policies | Smart Card Logon и Client Authentication | без назначений в политике приложений шаблон второй версии выпускает сертификат без EKU вовсе |
| Extensions → Key Usage | только цифровая подпись | с шифрованием ключа карта отвергает сертификат как несовпадающий с ключом |
| Request Handling | назначение — подпись; экспорт закрытого ключа не разрешать | с флагом экспорта выдача на карту падает с 0x80090009 ещё до обращения к ЦС |
| Cryptography | RSA, минимальная длина ключа 2048; провайдер смарт-карты | ключ карты Alatyr — RSA-2048; ключ короче или другого типа ЦС отвергает |
| Security | право Enroll — только служебной записи NDES (шаг 4) | «имя из заявки» позволяет заявителю попросить любой UPN, поэтому заявителей должно быть ровно один |
Проверьте получившийся шаблон значениями, а не галочками на экране:
$root = (Get-ADRootDSE).configurationNamingContext
$dn = "CN=CorpSmartcardLogon,CN=Certificate Templates,CN=Public Key Services,CN=Services,$root"
$t = Get-ADObject $dn -Properties 'msPKI-Certificate-Name-Flag','msPKI-Private-Key-Flag',
'msPKI-Certificate-Application-Policy','msPKI-Minimal-Key-Size'
$n = [int64]$t.'msPKI-Certificate-Name-Flag'
"ENROLLEE_SUPPLIES_SUBJECT: {0}" -f (($n -band 0x00000001) -ne 0) # True
"SUBJECT_ALT_REQUIRE_UPN: {0}" -f (($n -band 0x02000000) -ne 0) # False
"EXPORTABLE_KEY: {0}" -f (([int]$t.'msPKI-Private-Key-Flag' -band 0x10) -ne 0) # False
$t.'msPKI-Certificate-Application-Policy' # 1.3.6.1.4.1.311.20.2.2 и 1.3.6.1.5.5.7.3.2
$t.'msPKI-Minimal-Key-Size' # 2048
3.3. Опубликуйте шаблон на ЦС¶
Restart-Service CertSvc -Force
certutil -SetCATemplates "+CorpSmartcardLogon"
certutil -CATemplates
Форма с + добавляет шаблон к списку, а не заменяет список. Если только что
созданный шаблон командлет Add-CATemplate называет несуществующим —
перезапустите службу ЦС и опубликуйте через certutil, как выше.
Как убедиться. certutil -CATemplates перечисляет CorpSmartcardLogon, а
проверка флагов дала значения из комментариев.
Шаг 4. NDES: адрес SCEP для сервера Alatyr¶
NDES принимает заявку по протоколу SCEP и передаёт её ЦС от имени своей служебной учётной записи. Сервер Alatyr ходит именно сюда.
4.1. Служебная учётная запись¶
Заведите доменного пользователя, например CORP\svc-ndes, и дайте ему:
- право Enroll на шаблон
CorpSmartcardLogon(шаг 3.2) — и никому больше; - право Enroll на шаблоны
CEPEncryptionиEnrollmentAgentOfflineи опубликуйте оба на ЦС (certutil -SetCATemplates "+CEPEncryption",certutil -SetCATemplates "+EnrollmentAgentOffline"): по ним NDES при установке получает свои сертификаты регистрирующего агента. По умолчанию они не опубликованы, и установка падает на этом запросе.
Установку NDES и правку прав на шаблоны выполняйте доменным администратором.
4.2. Установите роль¶
Установите роль Network Device Enrollment Service (Server Manager или
Install-AdcsNetworkDeviceEnrollmentService) со служебной учётной записью из
4.1 — по документации
Microsoft.
Две особенности:
- если NDES ставится на тот же сервер, что и ЦС, не указывайте параметр
-CAConfig— с ним установка отказывает с0x8007139f; - в разделе реестра
HKLM\SOFTWARE\Microsoft\Cryptography\MSCEPукажите ваш шаблон в значенияхSignatureTemplate,EncryptionTemplateиGeneralPurposeTemplate(подробно — в той же документации Microsoft) и перезапустите IIS:iisreset.
4.3. Пароль заявки (challenge) выключите¶
Сервер Alatyr не передаёт NDES пароль заявки: по SCEP пароль кладётся внутрь самой заявки, а заявку подписывает ключ карты на устройстве сотрудника, и дописать в неё что-либо на сервере нельзя. Поэтому проверку пароля на NDES выключите:
Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Cryptography\MSCEP\EnforcePassword' `
-Name EnforcePassword -Value 0 -Type DWord
iisreset /restart
Значение должно лежать в подразделе EnforcePassword, а не в самом
MSCEP. Страница mscep_admin при этом не нужна, а поле «SCEP challenge» в
админке Alatyr оставьте пустым.
NDES без пароля должен быть доступен только серверу Alatyr
Шаблон берёт имя из заявки, и пароль не проверяется: любой, кто дотянется
до mscep.dll, сможет попросить сертификат входа на любой UPN. Закройте
доступ к NDES сетевыми правилами так, чтобы до него доходил только сервер
Alatyr. Граница доверия при этом — сервер Alatyr: он сверяет имя заявки с
утверждённой человеком личностью, а заявку «Вход в AD» одобряет только
человек.
4.4. HTTPS и адрес¶
Админка Alatyr принимает адрес SCEP только по https. Привяжите к сайту
IIS на сервере NDES сертификат с полным доменным именем этого сервера,
выданный вашим ЦС. Адрес для Alatyr:
https://dc01.corp.example/certsrv/mscep/mscep.dll
4.5. Отпечаток ЦС¶
Alatyr сверяет ЦС, которому передаёт заявку, по отпечатку SHA-256
сертификата ЦС. NDES в ответ на GetCACert отдаёт несколько сертификатов —
два своих (регистрирующего агента) и сертификат ЦС; нужен именно сертификат
ЦС. Пин на сертификат агента тоже сработает, но выдача остановится в день его
перевыпуска.
Не берите поле «Thumbprint» из оснастки: оно показывает SHA-1. На сервере ЦС:
certutil -ca.cert C:\Windows\Temp\ca.cer
certutil -hashfile C:\Windows\Temp\ca.cer SHA256
Или с любой машины, у которой есть openssl:
curl -s "https://dc01.corp.example/certsrv/mscep/mscep.dll/pkiclient.exe?operation=GetCACert" -o ca.p7b
openssl pkcs7 -inform DER -in ca.p7b -print_certs \
| openssl x509 -noout -subject -fingerprint -sha256
(openssl x509 печатает первый сертификат из списка; найдите среди
напечатанных -print_certs тот, у которого subject — ваш ЦС.)
Тот же отпечаток понадобится агентам, вторым после корня Alatyr (шаг 9.1): в этом руководстве ЦС — Enterprise Root CA, то есть сам себе корень. У подчинённого ЦС предприятия агентам нужен отпечаток самоподписанного корня цепочки, а не этого ЦС — «Отпечаток корня Enterprise CA».
Как убедиться. Запрос возможностей отвечает списком, в котором есть
POSTPKIOperation и SHA-256:
curl -s "https://dc01.corp.example/certsrv/mscep/mscep.dll/pkiclient.exe?operation=GetCACaps"
Отпечаток SHA-256 сертификата ЦС записан — он понадобится в шаге 7.
Шаг 5. Строгое сопоставление, NTAuth и доверие к УЦ¶
Строгое сопоставление (KB5014754). Контроллер домена с актуальными
обновлениями принимает вход по сертификату, только если сертификат надёжно
привязан к учётной записи. Alatyr обеспечивает такую привязку SID сотрудника в
сертификате: агент кладёт его в альтернативное имя заявки в виде
tag:microsoft.com,2022-09-14:sid:<SID>, и шаблон с «именем из заявки»
переносит его в сертификат. Ослаблять режим сопоставления на контроллерах для
этого не нужно — достаточно актуальных обновлений и каталога для SID из
шага 6. Режимы и сроки — в KB5014754.
NTAuth. Контроллер домена доверяет выпуск сертификатов для входа только тем ЦС, что опубликованы в хранилище NTAuth. ЦС вне NTAuth выпустит безупречный сертификат, который Windows всё равно отвергнет на экране входа. От имени администратора домена:
& certutil.exe "-ca.cert" C:\Windows\Temp\ca.cer
& certutil.exe -dspublish -f C:\Windows\Temp\ca.cer NTAuthCA
& certutil.exe -dspublish -f C:\Windows\Temp\ca.cer RootCA # у ЦС предприятия корень обычно уже опубликован
& certutil.exe -pulse
В PowerShell аргумент -ca.cert берите в кавычки: без них команда молча
ничего не делает. Если контроллеров несколько — repadmin /syncall /d /e /P.
На клиентах и RDP-хосте перед первой пробой:
gpupdate /force
certutil -pulse
Как убедиться. Объект CN=NTAuthCertificates,CN=Public Key
Services,CN=Services,CN=Configuration,DC=corp,DC=example содержит ваш ЦС
(certutil -viewstore -enterprise NTAuth показывает его в окне), а
certutil -verifystore -enterprise Root на клиенте находит корень.
Шаг 6. Каталог для SID¶
SID сотрудника сервер Alatyr берёт у контроллера домена по UPN — учётной записью только для чтения, по LDAPS. Без этого шага сертификат выпишется без SID и вход по нему контроллер отвергнет. Принцип, права и поведение при сбоях — «Откуда берутся UPN и SID».
6.1. Учётная запись только для чтения¶
Обычный доменный пользователь без дополнительных прав: читать objectSid и
раздел конфигурации леса может любая доменная учётная запись. Заводите в три
действия — если пароль задать прямо в New-ADUser и он не пройдёт политику
паролей, объект всё равно создастся, но отключённым и без пароля:
New-ADUser -Name 'svc-alatyr-ldap' -SamAccountName 'svc-alatyr-ldap' `
-UserPrincipalName 'svc-alatyr-ldap@corp.example' `
-Path 'CN=Users,DC=corp,DC=example' -Enabled $false
Set-ADAccountPassword -Identity 'svc-alatyr-ldap' -Reset
Enable-ADAccount -Identity 'svc-alatyr-ldap'
Set-ADUser 'svc-alatyr-ldap' -PasswordNeverExpires $true
В привилегированные группы её не добавляйте.
6.2. LDAPS¶
Контроллер домена в лесу с ЦС предприятия обычно сам получает сертификат и начинает слушать порт 636. Проверьте с машины сервера Alatyr:
openssl s_client -connect dc01.corp.example:636 -servername dc01.corp.example </dev/null \
| openssl x509 -noout -subject -issuer
Издателем должен быть ваш ЦС. Сервер Alatyr проверяет сертификат контроллера — и сертификат NDES из шага 4 — по доверенным корням своей системы, а корня вашего ЦС там нет. Как его добавить — в шаге 7.1.
6.3. Переменные сервера¶
В .env сервера Alatyr:
ALATYR_DIRECTORY_URL=ldaps://dc01.corp.example:636
ALATYR_DIRECTORY_BIND_DN=CN=svc-alatyr-ldap,CN=Users,DC=corp,DC=example
ALATYR_DIRECTORY_BIND_PASSWORD=<пароль>
ALATYR_DIRECTORY_BASE_DN=DC=corp,DC=example
ALATYR_DIRECTORY_BASE_DN обязан содержать компоненты DC=. Прочие параметры
(таймаут, суточная квота) — в «Конфигурации».
Как убедиться — после перезапуска сервера в шаге 7.1: в журнале строка
каталог настроен.
Шаг 7. Сервер Alatyr: доверие, издатель, политика¶
7.1. Доверие к вашему ЦС, сеть NDES и имена домена¶
Всё задаётся в .env набора развёртывания и одним файлом — правка
docker-compose.yml и отдельный override не нужны.
Корень вашего ЦС в доверии — для LDAPS к контроллеру и HTTPS к NDES.
Выгрузите сертификат ЦС (шаг 4.5 уже положил его в C:\Windows\Temp\ca.cer),
переведите в PEM и положите в каталог trust рядом с docker-compose.yml:
openssl x509 -inform der -in ca.cer -out trust/corp-root.pem
chmod 644 trust/corp-root.pem
Сервер доверяет этому корню вдобавок к системным. Если между корнем и сертификатами контроллера есть промежуточные ЦС — положите их в тот же файл подряд.
Разрешение ходить в частную сеть NDES. Издатель SCEP по умолчанию не
ходит на частные адреса (защита от подделки запросов на стороне сервера), а
NDES в локальной сети всегда на таком адресе. Укажите адрес NDES как можно
уже — с маской /32.
В .env — вместе с переменными каталога из шага 6.3:
ALATYR_EXTRA_CA_FILE=/etc/alatyr/trust/corp-root.pem
ALATYR_SCEP_INTERNAL_CIDRS=192.0.2.10/32
Путь в ALATYR_EXTRA_CA_FILE — внутри контейнера: каталог trust набора
виден серверу как /etc/alatyr/trust. Ключ ALATYR_SCEP_ENC_KEY, которым
шифруются настройки издателя SCEP, набор заводит сам при первом запуске;
не меняйте его — иначе сохранённые настройки издателя перестанут
расшифровываться.
Имена домена разрешаются на машине сервера. Сервер ходит к контроллеру и NDES по полному доменному имени — по нему же выписаны их сертификаты. Проверьте с машины сервера и из контейнера:
getent hosts dc01.corp.example
docker compose exec server nslookup dc01.corp.example
Домен в зоне .local на Debian и Ubuntu
systemd-resolved по умолчанию отправляет имена *.local только в
mDNS, и getent отвечает «не найдено», хотя DNS-сервер сети имя знает.
Контейнеры при этом получают SERVFAIL. Укажите зону явно:
sudo mkdir -p /etc/systemd/resolved.conf.d
printf '[Resolve]\nDNS=<DNS-сервер, знающий зону>\nDomains=~corp.local\n' \
| sudo tee /etc/systemd/resolved.conf.d/corp-local.conf
sudo systemctl restart systemd-resolved
Затем перезапустите сервер:
docker compose up -d
docker compose logs server | grep -E 'каталог|корни TLS'
Как убедиться. В журнале строки дополнительные корни TLS добавлены к
системным и каталог настроен — а не каталог не настроен и не
настройки каталога неполны.
7.2. Издатель для цели «Вход в AD»¶
Настройки → Удостоверяющие центры → строка «Вход в AD» → «Изменить»:
| Поле | Значение |
|---|---|
| Бэкенд | SCEP — другого у этой цели не бывает |
| SCEP URL | https://dc01.corp.example/certsrv/mscep/mscep.dll |
| Отпечаток CA (SHA-256) | отпечаток из шага 4.5; двоеточия, пробелы и регистр не важны |
| SCEP challenge | пусто (шаг 4.3) |
| Защита ключа | «PIN самой карты» |
| Включён | да |
«PIN самой карты» — единственная ступень, при которой карта работает в сеансе RDP: ключ подписывает по PIN, который человек вводит в окне Windows. Ступень применяется только к новому ключу устройства, поэтому выберите её до первой выдачи.
Нажмите «Проверить соединение»: она проходит имя, TLS, получение сертификата ЦС и сверку отпечатка.
7.3. Политика выдачи¶
Настройки → Политика выдачи → в колонке «Выдаём» включите «Вход в AD (смарт-карта)». На свежей установке включён только Wi-Fi.
Как убедиться. У строки «Вход в AD» в «Удостоверяющих центрах» статус «Настроен», проверка соединения успешна, а в «Политике выдачи» в колонке «Готовность» — «Готов — политика разрешает, ЦА настроен».
Шаг 8. RDP-хост¶
Машина, на которую входят: член домена corp.example, с полным доменным
именем в DNS. От имени её администратора:
# приём подключений и NLA
Set-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Terminal Server' fDenyTSConnections 0
Set-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' UserAuthentication 1
New-NetFirewallRule -DisplayName 'RDP' -Direction Inbound -Protocol TCP -LocalPort 3389 -Action Allow
Add-LocalGroupMember 'Remote Desktop Users' 'CORP\Domain Users'
Зарегистрируйте на цели минидрайвер карты — командой агента Alatyr из того же выпуска; считыватель на цели не нужен, только регистрация:
alatyr-agent install-reader --minidriver-only
Без минидрайвера Windows не знает проброшенную карту и показывает на экране входа «Connect a smart card» при полностью исправной остальной цепочке.
Рекомендуется не оставлять отключённые сеансы жить
(MaxDisconnectionTime, fResetBroken — групповая политика Remote Desktop
Session Host → Session Time Limits). Remote Credential Guard не обязателен;
если вы им пользуетесь — «Вход по RDP», шаг 1.
Как убедиться. Test-NetConnection rdp01.corp.example -Port 3389 с клиента
проходит, а на цели
(Get-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp').UserAuthentication
показывает 1.
Шаг 9. Устройство сотрудника¶
9.1. Установите агента¶
На Windows-устройстве сотрудника, от имени администратора, — пакет из выпуска
(«Установка → Windows»). Сначала установите
доверие к издателю пакета — сертификату из подписи самого .msi
(«Установка → Windows», шаг 1):
msiexec /i alatyr-agent-<версия>-x64.msi /qn `
ALATYR_SERVER=https://alatyr.corp.example `
ALATYR_CA_FINGERPRINT=<корень Alatyr>,<корень ЦС из шага 4.5> `
ALATYR_CORP_DOMAIN=corp.example
Отпечаток корня Alatyr печатает first-up.sh; второй — корень ЦС
предприятия (шаг 4.5). Без второго отпечатка
одобренный сертификат не ставится: окно агента показывает «Одобрено, но не
устанавливается» с отпечатком присланного корня.
UPN сотрудника агент по умолчанию собирает как <логин>@<корпоративный
домен> либо берёт почту (ALATYR_CORP_EMAIL). Он обязан совпасть с
userPrincipalName в AD; если нет — задайте его от имени сотрудника:
alatyr-agent ad-logon-upn ivanov@corp.example («Откуда
UPN»).
9.2. Назначьте цель и одобрите заявку¶
- В админке: Устройства → строка машины → «Разрешённые назначения
сертификатов» → отметьте
ad_logonи сохраните. Или сотрудник просит цель сам, а вы разрешаете её в «Запросах назначений». - Дальше агент всё делает сам: поднимает на устройстве смарт-карту (собственный считыватель, карта обслуживается штатным драйвером Windows), заводит в TPM ключ RSA-2048, узнаёт у сервера SID сотрудника, подаёт заявку с UPN и SID. Сотрудник при этом видит в окне Alatyr ход выдачи цели.
- В «Запросах» появится заявка «Вход в AD» — одобрите её. Автоматического одобрения у этой цели нет; при одобрении сервер ещё раз сверяет SID с каталогом.
9.3. PIN карты¶
Сотрудник за своей машиной, один раз:
'<PIN>' | & alatyr-agent.exe card-set-pin # ключ создаётся ПОД этим PIN
'<PIN>' | & alatyr-agent.exe card-unlock # предъявить PIN агенту
& alatyr-agent.exe card-prepare
То же — из окна Alatyr: раздел цели → «Предъявить PIN карты». Попыток PIN пять; на нуле ключ уничтожается. Подробности — «Настройка», шаг 7.
Как убедиться.
certutil -scinfo -silent
certutil -dump <файл-сертификата.cer> | findstr /C:"Principal Name" /C:"sid:"
certutil -scinfo показывает карту и сертификат; в сертификате Principal
Name — UPN сотрудника (не служебной записи NDES) и строка
URL=tag:microsoft.com,2022-09-14:sid:S-1-5-21-…. SID совпадает с
Get-ADUser ivanov | Select SID.
Какие устройства могут входить
Windows — в домене и вне его. Linux — как клиент RDP, через
xfreerdp3 с поддержкой Kerberos («Вход по RDP → С Linux»).
macOS — готового клиента RDP с входом по карте нет
(«Пределы и нюансы»). Локальный вход
по карте в саму машину не поддерживается намеренно — только удалённый
рабочий стол.
Шаг 10. Вход по RDP с картой¶
На устройстве сотрудника, от его имени:
- Включите проброс карты в умолчаниях клиента RDP — один раз:
alatyr-agent rdp --enable-redirect
- Проверьте готовность — по полному доменному имени цели:
alatyr-agent rdp --target rdp01.corp.example
Ждите строки готово: можно подключаться. То же показывает окно Alatyr в
разделе «Подключение по RDP».
3. Подключитесь: mstsc /v:rdp01.corp.example. Не запускайте подключение из
.rdp-файла — его диалог сбрасывает галочку проброса карты.
4. В окне учётных данных выберите плитку смарт-карты и введите PIN карты.
Пароль нигде не вводится.
Как убедиться. Открылся рабочий стол rdp01. На контроллере домена в
журнале безопасности — событие 4768 (билет по сертификату, Result Code
0x0, издатель — ваш ЦС) и следом 4769; на RDP-хосте — 4624 с типом
входа 10. Вход прошёл при строгом сопоставлении — значит, SID в сертификате
верный.
Шаг 11. Если что-то не так¶
| Симптом | Причина | Что сделать |
|---|---|---|
В журнале агента «каталог не сообщил SID», в сертификате нет строки sid: |
каталог не настроен, недоступен или не нашёл UPN | «Если каталог не настроен или недоступен»; после исправления alatyr-agent reissue ad_logon |
| Сервер не запускается: «настройки каталога неполны» | задан ALATYR_DIRECTORY_URL без DN, пароля или поддерева |
дописать все четыре переменные (шаг 6.3) |
В журнале сервера x509: certificate signed by unknown authority при обращении к каталогу или NDES |
корень вашего ЦС не в доверии сервера | шаг 7.1: файл в trust и ALATYR_EXTRA_CA_FILE |
Сервер не находит контроллер или NDES по имени (no such host), проверка издателя падает на имени |
машина сервера не разрешает имена домена; для зоны .local — systemd-resolved |
шаг 7.1, «Имена домена» |
LDAP Result Code 49 |
неверный пароль учётной записи привязки | сверить ALATYR_DIRECTORY_BIND_PASSWORD с каталогом |
Проверка издателя отвечает отказом из-за адреса (blocked_target) |
NDES на частном адресе, не разрешённом серверу | ALATYR_SCEP_INTERNAL_CIDRS (шаг 7.1) |
CA fingerprint mismatch |
в админке отпечаток не того сертификата | взять SHA-256 сертификата ЦС (шаг 4.5) |
Заявка в ошибке с failInfo=badMessageCheck |
NDES требует пароль заявки | выключить EnforcePassword (шаг 4.3); журнал NDES — Application, источник NetworkDeviceEnrollmentService |
Отказ из-за размера ключа (0x80094811) |
шаблон требует ключ другого размера или типа | RSA, минимум 2048 (шаг 3.2) |
В Principal Name служебная запись NDES; заявка в ошибке с двумя личностями |
шаблон строит имя из каталога | «Supply in the request» (шаг 3.2), перевыпустить |
| В сертификате нет назначений (EKU) | пустая политика приложений у шаблона | добавить Smart Card Logon и Client Authentication (шаг 3.2) |
0x80090009 при выдаче на карту |
в шаблоне разрешён экспорт закрытого ключа | снять флаг (шаг 3.2) |
| Вход отвергнут с ошибкой про сопоставление сертификата | ЦС не в NTAuth — самая частая причина; либо в сертификате нет SID | шаг 5; затем проверка SID (шаг 9.3) |
| Одобрение отклонено: «SID в заявке не совпал с каталогом» | устройство прислало не тот SID или учётная запись сменилась | разобраться до перевыпуска (подробнее) |
| «Connect a smart card» на удалённом экране | на цели нет минидрайвера; проброс не включён или сброшен диалогом .rdp |
шаг 8 и шаг 10.1 |
| Подключение спрашивает пароль, карты нет | цель задана IP-адресом; либо сохранена учётная запись для этой цели | подключаться по полному доменному имени; cmdkey /delete:TERMSRV/rdp01.corp.example |
| «The revocation status of the domain controller certificate … could not be determined» | клиент вне домена не может достать списки отзыва | «Клиент вне домена: списки отзыва» |
| «Key does not exist» | запись о карте указывает на прежний контейнер ключа | alatyr-agent card-rebind от имени сотрудника |
| «Provider could not perform the action since the context was acquired as silent» | переподключение к сеансу при выключенном NLA | включить NLA на цели (шаг 8) |
Больше разборов — «Настройка → Если вход не проходит» и «Вход по RDP → Если не получилось».
Что дальше¶
- Откуда берутся UPN и SID — кто что знает и кому доверяет.
- Пределы и нюансы — отзыв, срок действия, продление и платформы.
- Вход по RDP — Remote Credential Guard, вход с Linux и клиенты вне домена.