Служба удаленных рабочих столов (часть 4)

Опубликовано: 30.09.2020
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

В предыдущих публикациях по теме удаленных рабочих столов была развернута начальная инфраструктура серверов, настроены роли брокера сессий и веб-сайта, создана первая коллекция терминальных приложений. В этой части я расскажу, как подписать серверы сертификатом и адаптировать веб-сайт под нужды компании.

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

Напомню, что моя инфраструктура удаленных рабочих столов состоит из следующих компонентов:
- сервер управления (брокер сессий) - wsAAA060,
- веб-сервер для публикации приложений - wsAAA060,
- хост с терминальными приложениями - wsAAA058,
- сервер хранения профилей пользователей - wsAAA057,
- сервер терминальных лицензий - wsAAA102.

Помимо перечисленных серверов, которые непосредственно участвуют в организации удаленных сессий, есть сервера, на которых завязана инфраструктура компании:
- доменный контроллер - wsAAA001,
- DNS-сервер - wsAAA001,
- корневой центр сертификации - wsAAA005.

Итак, для упрощения взаимодействия пользователей с RDS-инфраструктурой необходимо создать DNS-запись псевдонима CNAME для инфраструктуры. Я буду использовать псевдоним fc.domain.com, который будет ссылаться на веб-сервер wsAAA060. Чтобы создать данную запись, необходимо на доменном контроллере (или на другом сервере, где стоит консоль управления DNS) выполнить следующую команду в консоли PowerShell.

Примечание. Задачи, описанные ниже, надо выполнять в сессии доменного администратора в консоли 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.

Примечание. Задачи, описанные ниже, надо выполнять в сессии доменного администратора в консоли 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.

Remote desktop services - 048

 

Когда сертификат готов, можно переходить к подписи инфраструктуры RDS. Для выполнения этой задачи необходимо зайти на сервер управления RDS с учетной записью администратора, который создавал эту инфраструктуру (или с другой учетной записью администратора, но тогда нужно будет создать группу RDS серверов в консоли управления сервером) и выполнить шаги, показанные на картинках ниже.

Открыть настройки инфраструктуры.

Remote desktop services - 049

Перейти на вкладку сертификатов и поочередно для каждой роли привязать сертификат.

Remote desktop services - 050

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

Remote desktop services - 051

За один раз можно привязать сертификат только к одной роли.

Remote desktop services - 052

Когда все роли получат сертификат, в колонке Level можно увидеть, что роль является доверенной.

Remote desktop services - 053

Теперь веб-сайт RDS публикаций открывается без предупреждений о безопасности.

Remote desktop services - 054

 

Чтобы пользователям не набирать полный путь к сервису в виде 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>.

Remote desktop services - 055

В панели управления IIS необходимо перейти к веб-сайту RDWeb в настройки Аутентификации и отключить Anonymous authentication и включить Windows Authentication.

Remote desktop services - 056

 

Для того, чтобы изменить внешний вид веб-сайта, необходимо редактировать файлы в папке C:\Windows\Web\RDWeb\Pages. Ниже на рисунке показано, как можно изменить дизайн веб сайта, чтобы он отвечал нуждам компании. Цифрами на картинке пронумерованы изменения в файлах веб сайта, соответствующие внесенным правкам.

Remote desktop services - 057

1. Логотип компании находится в файле С:\Windows\Web\RDWeb\Pages\images\logo_02.png. Его нужно заменить на свой логотип, а в файле С:\Windows\Web\RDWeb\Pages\Site.xsl внести правки о размере картинки:

<img src="../images/logo_02.png" />
Remote desktop services - 058

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>
Remote desktop services - 059

 

3. Изменение заголовка портала производится в файле C:\Windows\Web\RDWeb\Pages\en-US\RDWAStrings.xml. За заголовок страницы отвечает переменная PageTitle, а за заголовок портала - HeadingRDWA.

Remote desktop services - 060
Примечание. Чтобы добавить иконку к веб-сайту, которая отображается во вкладке браузера, необходимо положить файл иконки favicon.ico в папку C:\Windows\Web\RDWeb\Pages, а в файле С:\Windows\Web\RDWeb\Pages\Site.xsl в секцию <head> добавить строчку <link rel="icon" href="../favicon.ico" type="image/x-icon" />.

 

4. Изменение описания портала делается в файле C:\Windows\Web\RDWeb\Pages\en-US\RDWAStrings.xml. За пояснение отвечает переменная HeadingApplicationName.

Remote desktop services - 061

Стиль .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. Ключи реестра, отвечающие за публикацию ярлыка, показаны на картинке ниже.

Remote desktop services - 062

Рекомендуется экспортировать внесенные изменения в файл, так как при каждом изменении коллекции ярлык на полный рабочий стол удаляется системой. Пример экспорта ветки реестра показан ниже.

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.