В предыдущих публикациях по теме удаленных рабочих столов была развернута начальная инфраструктура серверов, настроены роли брокера сессий и веб-сайта, создана первая коллекция терминальных приложений. В этой части я расскажу, как подписать серверы сертификатом и адаптировать веб-сайт под нужды компании.
Для того, чтобы сайт с коллекциями терминальных приложений работал по защищенному протоколу HTTPS, а скачиваемые файлы RDP имели цифровую подпись компании, необходимо подписать сервисы сертификатом, выпущенным корпоративным центром сертификации. Также для пользователей удобнее оперировать понятными именами сервисов, а не именами серверов, поэтому необходимо создать псевдоним дня веб-сайта терминалов.
Напомню, что моя инфраструктура удаленных рабочих столов состоит из следующих компонентов:
- сервер управления (брокер сессий) - wsAAA060,
- веб-сервер для публикации приложений - wsAAA060,
- хост с терминальными приложениями - wsAAA058,
- сервер хранения профилей пользователей - wsAAA057,
- сервер терминальных лицензий - wsAAA102.
Помимо перечисленных серверов, которые непосредственно участвуют в организации удаленных сессий, есть сервера, на которых завязана инфраструктура компании:
- доменный контроллер - wsAAA001,
- DNS-сервер - wsAAA001,
- корневой центр сертификации - wsAAA005.
Итак, для упрощения взаимодействия пользователей с RDS-инфраструктурой необходимо создать DNS-запись псевдонима CNAME для инфраструктуры. Я буду использовать псевдоним fc.domain.com, который будет ссылаться на веб-сервер wsAAA060. Чтобы создать данную запись, необходимо на доменном контроллере (или на другом сервере, где стоит консоль управления DNS) выполнить следующую команду в консоли PowerShell.
# Найти существующую запись fc.domain.com - её не должно существовать, то есть команда должна вернуть ошибку Get-DnsServerResourceRecord -Name fc -ZoneName domain.com -ComputerName wsAAA001.domain.com # Создать на доменном контроллере wsAAA001.domain.com новую CNAME запись fc.domain.com = wsAAA060.domain.com, Add-DnsServerResourceRecordCName -Name fc -ZoneName domain.com -HostNameAlias wsAAA060.domain.com -ComputerName wsAAA001.domain.com
Когда псевдоним готов и реплицирован на все DNS серверы компании, можно переходить к созданию сертификата. Сертификат необходимо создавать на сервере управления RDS-инфраструктурой в консоли PowerShell.
# Создать новый файл описания сертификата If (-not(Test-Path ("C:\Temp") -PathType Container )) { New-Item -ItemType Directory -Path C:\Temp } New-Item -ItemType File -Path C:\Temp\wsAAA060-rds.inf notepad.exe C:\Temp\wsAAA060-rds.inf
В открывшемся окне блокнота необходимо вставить следующий текст, который описывает требуемый сертификат:
[Version] Signature="$Windows NT$" [NewRequest] FriendlyName = "RDS-SHA256" Subject = "CN=fc.domain.com" Exportable = TRUE KeyLength = 2048 KeySpec = 1 KeyUsage = 0xA0 MachineKeySet = True ProviderName = "Microsoft RSA SChannel Cryptographic Provider" ProviderType = 12 SMIME = FALSE Hashalgorithm = sha256 RequestType = PKCS10 Silent = True [Strings] szOID_SUBJECT_ALT_NAME2 = "2.5.29.17" szOID_ENHANCED_KEY_USAGE = "2.5.29.37" szOID_PKIX_KP_SERVER_AUTH = "1.3.6.1.5.5.7.3.1" szOID_PKIX_KP_CLIENT_AUTH = "1.3.6.1.5.5.7.3.2" [Extensions] %szOID_SUBJECT_ALT_NAME2% = "{text}dns=fc.domain.com&dns=bofc.domain.com&dns=wsAAA060.domain.com" %szOID_ENHANCED_KEY_USAGE% = "{text}%szOID_PKIX_KP_SERVER_AUTH%" [RequestAttributes] CertificateTemplate = "RemoteDesktopSHA256"
Важные моменты:
- Subject = "CN=fc.domain.com" - имя сертификата
- Exportable = TRUE - сертификат экспортируемый из хранилища сервера
- MachineKeySet = True - сертификат выпускается на сервер, а не на пользователя
- %szOID_SUBJECT_ALT_NAME2% = "{text}dns=fc.domain.com&dns=bofc.domain.com&dns=wsAAA060.domain.com" - возможные имена сервера (псевдонимы)
- CertificateTemplate = "RemoteDesktopSHA256" - шаблон, по которому создается сертификат. Этот шаблон должен существовать на сервере сертификации компании и разрешать роли Proves your identity to a remote computer, Ensures the identity of a remote computer, Remote Desktop Authentication.
Далее необходимо сохранить настройки, закрыть блокнот и последовательно выполнить команды:
# Создать файл запроса сертификата certreq.exe -new C:\Temp\wsAA060-rds.inf C:\Temp\wsAAA060-rds.req # Посмотреть содержимое запроса сертификата certutil.exe C:\Temp\wsAAA060-rds.req # Отправить запрос сертификата на корпоративный центр сертификации certreq.exe -submit -config "wsAAA005.domain.com\Internal Root CA SHA256" C:\Temp\wsAAA060-rds.req C:\Temp\wsAAA060-rds.crt # Завершить запрос сертификата и поместить сертификат в хранилище certreq.exe -accept C:\Temp\wsAAA060-rds.crt # Сбросить кэш сертификатов и обновить сертификат, чтобы подготовить его к экспорту certutil.exe -repairstore MY "fc.domain.com" # Экспортировать сертификат в файл certutil.exe -exportPFX "fc.domain.com" C:\Temp\wsAAA060-rds.pfx
В результате проделанной работы на сервере управления RDS в хранилище сертификатов в разделе Local Computer\Personal появится запрошенный сертификат с именем fc.domain.com, а так же он будет сохранен в файл wsAAA060-rds.pfx в папке C:\Temp.
Когда сертификат готов, можно переходить к подписи инфраструктуры RDS. Для выполнения этой задачи необходимо зайти на сервер управления RDS с учетной записью администратора, который создавал эту инфраструктуру (или с другой учетной записью администратора, но тогда нужно будет создать группу RDS серверов в консоли управления сервером) и выполнить шаги, показанные на картинках ниже.
Открыть настройки инфраструктуры.
Перейти на вкладку сертификатов и поочередно для каждой роли привязать сертификат.
Для привязки сертификата необходимо указывать PFX файл, полученный выше, и его пароль.
За один раз можно привязать сертификат только к одной роли.
Когда все роли получат сертификат, в колонке Level можно увидеть, что роль является доверенной.
Теперь веб-сайт RDS публикаций открывается без предупреждений о безопасности.
Чтобы пользователям не набирать полный путь к сервису в виде https://fc.domain.com/RDWeb/Pages/en-US/Default.aspx, а только псевдоним сервера fc.domain.com, необходимо в корневом каталоге веб-сервера создать файл перенаправления в нужную папку. Для этого в каталоге c:\inetpub\wwwroot нужно создать файл default.htm со следующим содержимым.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <html> <head> <meta HTTP-EQUIV="Refresh" CONTENT="0; URL=/RDWeb"> <title>Redirection</title> </head> <body> </body> </html>
Для включения механизма SSO - для входа в веб-сервис с учетной записью Windows, необходимо в папке C:\Windows\Web\RDWeb\Pages открыть файл Web.config, снять комментирование со строки <authentication mode="Windows"/> и закомментировать строки, относящиеся к <authentication mode="Forms">, а так же закомментировать секции <modules runAllManagedModulesForAllRequests="true"> и <security>.
В панели управления IIS необходимо перейти к веб-сайту RDWeb в настройки Аутентификации и отключить Anonymous authentication и включить Windows Authentication.
Для того, чтобы изменить внешний вид веб-сайта, необходимо редактировать файлы в папке C:\Windows\Web\RDWeb\Pages. Ниже на рисунке показано, как можно изменить дизайн веб сайта, чтобы он отвечал нуждам компании. Цифрами на картинке пронумерованы изменения в файлах веб сайта, соответствующие внесенным правкам.
1. Логотип компании находится в файле С:\Windows\Web\RDWeb\Pages\images\logo_02.png. Его нужно заменить на свой логотип, а в файле С:\Windows\Web\RDWeb\Pages\Site.xsl внести правки о размере картинки:
<img src="../images/logo_02.png" />
2. Удаление текста "Current folder: /" из пути к текущей папки веб сайта делается в файле С:\Windows\Web\RDWeb\Pages\Site.xsl. Для этого нужно заменить имеющиеся строки в разделе "deal with folder icons and labels" на следуюущие:
<div class="tswa_CurrentFolderLabel"> <span> <xsl:attribute name='id'><xsl:value-of select="$feedidprefix"/>CurrentFolderPath</xsl:attribute> <xsl:value-of select="substring-after(appfeed:Publisher[1]/@DisplayFolder, '/')"/> </span> </div>
3. Изменение заголовка портала производится в файле C:\Windows\Web\RDWeb\Pages\en-US\RDWAStrings.xml. За заголовок страницы отвечает переменная PageTitle, а за заголовок портала - HeadingRDWA.
4. Изменение описания портала делается в файле C:\Windows\Web\RDWeb\Pages\en-US\RDWAStrings.xml. За пояснение отвечает переменная HeadingApplicationName.
Стиль .headingApplicationName для написания этого текста находится в файле C:\Windows\Web\RDWeb\Pages\en-US\tswa.css. Его можно заменить например на такой:
.headingApplicationName { color: #174a91; font-size: 12px; }
5. Изменение имени портала (главной надписи) производится через команду PowerShell Set-RDWorkspace.
Set-RDWorkspace -Name "SAP BOFC remote access"
Стиль .headingCompanyName для написания этого текста находится в файле C:\Windows\Web\RDWeb\Pages\en-US\tswa.css. Его можно заменить например на такой:
.headingCompanyName { color: #174a91; font-size: 24px; font-family: "Segoe UI", "Calibri", Tahoma, sans-serif; font-weight: bold; text-shadow: 1px 1px 3px grey; }
6. Публикация в портале ссылки на полный рабочий стол хоста по умолчанию не доступна, если с хоста опубликовано хотя бы одно удаленное приложение. Но ссылку на полный рабочий стол можно опубликовать принудительно, отредактировав на сервере управления инфраструктурой ветку реестра, отвечающую за коллекцию приложений. Коллекции хранятся в ветке HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\CentralPublishedResources\PublishedFarms. Ключи реестра, отвечающие за публикацию ярлыка, показаны на картинке ниже.
Рекомендуется экспортировать внесенные изменения в файл, так как при каждом изменении коллекции ярлык на полный рабочий стол удаляется системой. Пример экспорта ветки реестра показан ниже.
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\CentralPublishedResources\PublishedFarms\BOFC_TEST\RemoteDesktops\BOFC_TEST] "Name"="Full Desktop" "ShowInPortal"=dword:00000001 "Folders"=hex(7):42,00,4f,00,46,00,43,00,20,00,54,00,45,00,53,00,54,00,00,00,\ 00,00 "RDPFileContents"="redirectclipboard:i:1 redirectprinters:i:1 redirectcomports:i:0 redirectsmartcards:i:1 devicestoredirect:s:* drivestoredirect:s:* redirectdrives:i:1 session bpp:i:32 prompt for credentials on client:i:1 server port:i:3389 allow font smoothing:i:1 promptcredentialonce:i:0 videoplaybackmode:i:1 audiocapturemode:i:1 gatewayusagemethod:i:0 gatewayprofileusagemethod:i:1 gatewaycredentialssource:i:0 full address:s:WSAAA060.DOMAIN.COM workspace id:s:wsAAA060.domain.com use redirection server name:i:1 loadbalanceinfo:s:tsv://MS Terminal Services Plugin.1.BOFC_TEST use multimon:i:1 "
На этом настройки веб-сервера RDS-инфраструктуры можно считать завершенными. В следующих заметках я расскажу как настроить терминальные хосты для удобной и безопасной работы пользователей.
Дополнительный материал.
Для того, чтобы выбрать сертификат для подписей RDS-сессий на конкретном сервере, можно воспользоваться следующим методом.
На сервере, где необходимо выбрать новый сертификат для RDS сессий, выполнить команду, которая покажет свойства всех имеющихся сертификатов.
Get-ChildItem cert:\LocalMachine\my Directory: Microsoft.PowerShell.Security\Certificate::LocalMachine\my Thumbprint Subject ---------- ------- 19045D8B67D4B158E9957C6A73D187FF6E01A228 CN=RDS-SHA256
У правильного сертификата нужно выбрать и запомнить отпечаток. Этот отпечаток нужно использовать для подписи RDS-сессий этого компьютера в следующих командах.
$path = (Get-WmiObject -class "Win32_TSGeneralSetting" -Namespace "root\cimv2\terminalservices" -Filter "TerminalName='RDP-tcp'").__PATH Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash="19045D8B67D4B158E9957C6A73D187FF6E01A228"}
Все заметки о службе терминалов в моем блоге можно найти по тегу RDS.