Удалёнка: опыт и лайфхаки
20 февраля 2012

Защита RDP по ГОСТ с помощью Рутокен ЭЦП. Двухуровневый TLS

Информационная безопасность
image

Протокол RDP является протоколом прикладного уровня и поэтому для его защиты идеально подходит TLS, который работает над транспортным уровнем.

В данном топике с помощью open source приложений OpenSSL и sTunnel мы защитим RDP-соединения по протоколу TLS c поддержкой российских шифрсьютов (GOST2001-GOST89-GOST89), клиентская аутентификация по ГОСТ-вым сертификатам будет проводиться аппаратно на борту USB-токена Рутокен ЭЦП с выработкой ключа согласования по схеме VKO GOST 34-10.2001. При этом ключ аутентификации является неизвлекаемым и его невозможно украсть. Так же Рутокен ЭЦП будет использоваться в качестве аппаратного ДСЧ.

Для случая аутентификации на терминальном сервере об Active Directory по сертификатам RSA мы обернем TLS по RSA в TLS по ГОСТ. Таким образом, мы получим двухуровневый TLS — RSA с клиентской аутентификацией будет идти внутри канала, защищенного ГОСТами.



В OpenSSL имеется реализация шифрсьютов TLS на базе российских алгоритмов в соответствии с draft-chudov-cryptopro-cptls.

sTunnel представляет собой компактный TLS-прокси: принимает незащищенные TCP-соединения на вход, TLS-зирует их и форвардит на удаленный сервер. В качестве «криптографического ядра» stunnel использует OpenSSL.

sTunnel из «коробки» не умеет работать с ГОСТами, поэтому я его пропатчил и пересобрал. Патч размером примерно в 2 строчки.

Рутокен ЭЦП подключается к OpenSSL способом, описанным на форуме вендора forum.rutoken.ru/topic/1639. При этом используется аппаратная реализация российских криптоалгоритмов «на борту» Рутокен ЭЦП.

Защита по ГОСТам



Базовая схема представлена на рисунке.

image

Для начала надо сделать небольшой УЦ, который бы выдавал ГОСТовые сертификаты серверу sTunnel и клиентам sTunnel. Для этого имеет смысл воспользоваться OpenSSL. Генерация клиентских ключей на токене, формирование заявок на сертификаты описаны в статье habrahabr.ru/blogs/infosecurity/134725. Ключ и сертификат сервера имеет смысл делать в виде обычных файлов.

Подробно на этой теме я не буду останавливаться.

Настройка сервера:

Инсталлируем sTunnel как службу на виндовый сервер с поднятым терминальным сервером и конфигурируем его:
  • скачиваем и распаковываем архив ubuntuone.com/4zOP5AR39vKxk0uF6rwxNM
  • говорим stunnel -install (при этом stunnel регистрируется как служба)
  • устанавливаем системную переменную окружения OPENSSL_ENGINES=[путь к папке, в которую распаковали архив]
  • подкладываем sTunnel сертификат УЦ, сертификат и ключ сервера (в соответствии с конфигом)
  • подкладываем конфиг (я его сохранил в файл stunnel.conf и положил рядом c sTunnel.exe)
  • перезагружаем компьютер

Конфиг сервера:
verify = 2

cafile = crypto/ca.crt
cert = crypto/server.crt
key = crypto/server.key

engine=gost

socket = l:TCP_NODELAY=1 
socket = r:TCP_NODELAY=1 

debug = 7 
output = stunnel.log 

client = no 

[RDP-TLS-GOST] 
ciphers = GOST2001-GOST89-GOST89
accept = 1494 
connect = localhost:3389 


Не забудьте на сервере закрыть файрволлом 3389 порт IP-адреса, торчащего наружу!

Настройка клиента (на винде):
  • скачиваем и распаковываем архив ubuntuone.com/5D4sNc9i29MDgdW9KvROZa
  • подкладываем сертификат клиента и сертификат УЦ (ключ клиента на токене)
  • устанавливаем для пользователя переменную окружения OPENSSL_ENGINES=[путь к папке, в которую распаковали архив]
  • подкладываем конфиг


Конфиг клиента:
verify=2
client=yes

CAFile=ca.crt

output=stunnel.log
sslVersion=TLSv1
taskbar=yes
DEBUG=7

engine=pkcs11_gost
engineCtrl=MODULE_PATH:rtPKCS11ECP.dll
engineCtrl=INIT 
engineCtrl=PIN:12345678

[RDP-TLS-GOST]
engineNum=1
key=100
cert=client.crt
accept = 127.0.0.1:8088
connect = x.x.x.x:1494
ciphers = GOST2001-GOST89-GOST89
TIMEOUTclose = 1



Важный момент. sTunnel не требует установки с правами администратора. Вообще говоря его можно использовать совместно с Рутокен ЭЦП Flash.
Рутокен ЭЦП Flash представляет собой CCID-устройство, которое не требует установки драйверов на современных ОС. Нужные файлы кладутся на Flash-память и пишется небольшой
скрипт для винды, который запускает процесс sTunnel с нужным окружением (OPENSSL_ENGINES=) и запускает RDP-клиент Windows на нужный хост: порт (mstsc /v:127.0.0.1:8088)

Двухуровневый TLS



В случае аутентификации пользователей об Active Directory по сертификатам RSA я предлагаю использовать обычный TLS c хранением клиентского ключа аутентификации RSA на Рутокен ЭЦП, но ходить через sTunnel. В этом случае TLS по RSA будет передаваться внутри канала TLS c ГОСТ.

Возможны две схемы. В первой TLS с RSA организует непосредственно клиент RDP. При этом на токене хранятся два ключа — ГОСТовый (аутентификация «свой-чужой», чтобы авторизоваться на сервере sTunnel)
и RSA (если пользователь смог пройти первый барьер, то этот ключ используется для аутентификации об AD, пользователь сразу попадает в свою учетную запись на RDP-сервере).

image

Для доступа к ключу/сертификату RSA, хранящимся на Рутокен ЭЦП, и аппаратной реализации RSA на «борту» Рутокен ЭЦП используется на Windows Рутокен CSP (входит в дистрибутив драйверов Рутокен), на Linux приложение rdesktop работает через PC/SC.

Во второй схеме TLS по RSA и по ГОСТ обеспечивается самим sTunnel. Сразу предупреждаю, что эту вторую схему я не пробовал.

image

Для доступа к ключу RSA и аппаратной реализации RSA «на борту» Рутокен ЭЦП используется engine pkcs11 из проекта OpenSC www.opensc-project.org/engine_pkcs11.

Соответственно, в конфиге клиента sTunnel будут две секции:

[RDP-TLS-GOST]
engineNum=1
key=100
cert=client_gost.crt
accept = 127.0.0.1:8088
connect = x.x.x.x:1494
ciphers = GOST2001-GOST89-GOST89
TIMEOUTclose = 1


[RDP-TLS-RSA]
engineNum=2
key=101
cert=client_rsa.crt
accept = 127.0.0.1:8087
connect = 127.0.0.1:8088
TIMEOUTclose = 1


А ходить клиентом RDP надо на 127.0.0.1:8087.
Теги: рутокен эцп рутокен rdp ssl tls гост gost stunnel openssl pkcs11 engine_pkcs11 рутокен csp remote desktop
Хабы: Информационная безопасность
+32
22,9k 215
Комментарии 19
Реклама

Рекомендуем