Экономим бюджет компании, или как построить криптотуннель по ГОСТу с минимальными затратами

Экономим бюджет компании, или как построить криптотуннель по ГОСТу с минимальными затратами

Экономим бюджет компании, или как построить криптотуннель по ГОСТу с минимальными затратами

Обеспечение безопасности при помощи средств криптографической защиты информации (СКЗИ) — не очень сложная задача, если все технологические участки находятся на хост-машине. Однако для того чтобы передавать и шифровать информацию одновременно, необходимо построить грамотный технологический процесс программного обеспечения. Мы расскажем, как это сделать.

 

 

 

 

  1. Введение
  2. Задача
  3. Тестовый стенд
    1. 3.1. Linux
    2. 3.2. Windows
  4. Выводы

 

Введение

Для любого системного администратора или DevOps построить VPN или «пробросить» нестандартный метод инкапсуляции пакетов (туннелирование) — не очень сложная задача. Часто для этого применяют OpenVPN, если планируется постоянное использование, либо SSH-туннелирование, если защищённое соединение нужно на один-два раза. Однако есть предприятия и ведомства, которые должны соблюдать строгие условия передачи данных, установленные законодательством. Под такие требования подпадают, например, многие структуры, которые так или иначе имеют отношение к денежным операциям: банки, микрофинансовые организации и т.п. Персональные данные тоже являются «защищаемой информацией» во всех законах и положениях.

В результате оказывается, что при шифровании необходимо использовать СКЗИ со всеми необходимыми сертификатами и лицензиями, соответствующие нормативным требованиям. Одним из примеров таких программных средств является «КриптоПро CSP». В данной статье мы будем разбирать задачу о том, как «прокинуть» средствами stunnel сетевой туннель, который будет шифроваться «КриптоПро CSP», заодно получив хоть и тестовый (на 3 месяца), но полностью валидный сертификат по ГОСТ Р 34.10-2012.

 

Задача

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

К примеру, есть две машины. Для демонстрации настройки двух операционных систем одна из них будет работать под управлением ОС семейства Linux (Ubuntu, версия не важна, но желательно — не ниже 16), вторая — под Windows 10. На win-системе будет запускаться Netcat на прослушивание какого-то определённого порта, а с nix-системы будут передаваться пакеты. Таким образом, Windows-машина будет сервером (в том числе — в отношении настроек stunnel).

Что должно получиться в итоге? При подключении с Linux к Windows через программу Netcat все пакеты будут шифроваться сертификатом GOST_2012 и сертифицированным программным обеспечением. Задача тривиальна и ставится для того, чтобы показать возможность такого манёвра. Поскольку stunnel передаёт любой протокол внутри себя, можно, к примеру, подписывать XML-файлы секретной подписью другой организации или передавать персональные данные в хранилище через интернет.

 

Тестовый стенд

Linux

Начнём с того, что система готова к настройке. Как работает «КриптоПро CSP», читатели, скорее всего, уже знают. Небольшое уточнение относительно stunnel: эта программа изначально создавалась как прокси-сервер с функцией шифрования трафика. Другими словами, она берёт, к примеру, HTTP и превращает его в своего рода HTTPS (если не вдаваться в подробности протоколирования).

Работает stunnel следующим образом: при запуске на локальной машине открывается определённый порт, указанный в конфигурационном файле, и в тот же момент приложение соединяется со своей копией на другой машине. Таким образом все пакеты, попавшие на порт localhost, шифруются, затем проксируются на другую систему и там расшифровываются. Удобство схемы состоит в том, что это — просто шлюз, которому неважно, какой протокол шифровать и передавать.

 

Рисунок 1. Схема работы stunnel

 Схема работы stunnel

 

Изначально загружаем необходимый продукт «КриптоПро» отсюда. В скачанном архиве будет примерно такой набор файлов, как на скриншоте.

 

Рисунок 2. «КриптоПро CSP» на Linux

 «КриптоПро CSP» на Linux

 

Для установки необходимо запустить install.sh. Этот скрипт добавит нужные компоненты: certmgr, cpverify, cryptcp, csptest, csptestf, curl, der2xer, genkpim, inittst, wipefile. У каждой из этих программ — своя зона ответственности, свои ключи и задачи. Для нашего сценария нужны будут только certmgr и cryptcp.

Бинарные файлы попадают в /opt/cprocsp/bin/, а не в /bin, поэтому запустить их просто командой не удастся. Необходимо либо выполнить запуск напрямую оттуда, либо сделать символьные ссылки. Не стоит только создавать ссылку с помощью curl, так как работает он «криво»: не видит список удостоверяющих центров из операционной системы и, как следствие, завершает любой запрос с ошибкой, из-за чего приходится использовать ключ -k, который отменяет проверку сертификата на валидность.

Сама по себе stunnel шифрует трафик с помощью OpenSSL, но в компании «КриптоПро» её переписали под свои нужды, так что теперь она использует утилиты для un- и de- шифрования и называется stunnel-msspi. Поставляется она в архиве вместе с CSP; также её можно скачать отдельно. Для старых версий «КриптоПро CSP» есть вероятность, что программа уже установлена, но это необходимо проверить.

Как было сказано выше, для stunnel Linux-система будет клиентом, а Windows — сервером. IP-адреса: Linux – 172.22.1.65, Windows – 172.22.1.121.

Следующий шаг — ключи и сертификаты. Для сервера нам необходимо и то, и другое, причём все это — в контейнере «КриптоПро». Для клиента требуется только сертификат, нужный для того, чтобы к туннелю не мог подключиться любой желающий. Забегая немного вперёд, отметим, что в конфигурационном файле stunnel есть опция  verify, и вот её параметры:

0. Не проверять сертификат сервера

1. Проверять сертификат при его наличии

2. Проверять сертификат всегда

3. Проверять наличие данного сертификата в хранилище TrustedUsers

Начиная с параметра 1, собственно, и нужен сертификат клиента для защиты подключения.

Итак, чтобы сгенерировать контейнер для сервера, необходимо воспользоваться утилитой cryptcp:

cryptcp -creatcert -provtype 81 -dn "C=RU, L=Rostov-na-Donu, CN=srv, 1.2.643.100.5=305867501589415" -exprt -ex -cont "\\\\.\\HDIMAGE\\srv" -ku -certusage "1.3.6.1.5.5.7.3.1" -hashAlg "1.2.643.7.1.1.2.3" -ca http://www.cryptopro.ru/certsrv

Интересные моменты относительно ключей:

  • provtype — указывает тип криптопровайдера. По умолчанию подставляется 75. Значение этих цифр можно узнать так: в каталоге /opt/cprocsp/sbin/amd64 лежит программа cpconfig, нужно запустить её с ключами -defprov -view_type.

 

Рисунок 3. Вывод программы cpconfig

 Вывод программы cpconfig

 

На скриншоте выше видно, что значение 75 устарело и соответствует ГОСТу версии 2001. ГОСТ версии 2012 на 256 и 512 бит задаётся значениями 80 и 81 соответственно.

  • certusage — идентификатор назначения. Для выполнения задачи необходимы два модуля: проверка подлинности клиента (1.3.6.1.5.5.7.3.2) и проверка подлинности сервера (1.3.6.1.5.5.7.3.1).
  • hashAlg — алгоритм, который будет применяться при шифровании. Список вариантов можно найти здесь.
  • ca — центр сертификации, который подпишет всё содержимое, чтобы оно было валидным. Важно, что сертификаты и ключи будут действовать только в течение 3 месяцев (точнее, данный конкретный УЦ, который указан в команде, выдаёт их именно на этот срок).
  • cont — контейнер, который будет создан; в нём сохранятся файлы. Если контейнер с таким именем уже есть, то, естественно, команда не отработает. Проверить можно командой certmgr -list; в её выводе отобразится исчерпывающая информация о контейнерах системы и пользователя.

Выше описаны самые «пикантные» моменты, которые могут отнять много времени. Остальные ключи и другие пояснения можно найти в документации.

Переходим к генерации сертификата для клиента. Команда аналогична, меняется только имя контейнера и идентификатор назначения сертификата.

cryptcp -creatcert -provtype 81 -dn "C=RU, L=Rostov-na-Donu, CN=srv, 1.2.643.100.5=305867501589415" -exprt -ex -cont "\\\\.\\HDIMAGE\\srv" -ku -certusage "1.3.6.1.5.5.7.3.2" -hashAlg "1.2.643.7.1.1.2.3" -ca http://www.cryptopro.ru/certsrv

Теперь с ключами и сертификатами всё готово. На всякий случай приведём команду экспорта из контейнера:

certmgr -export -provtype 81 -dest /куда экспортировать сертификат/имя сертификата -cont "\\\\.\\HDIMAGE\\имя контейнера"

Таким образом можно получить «на руки» сертификат в формате DER.

Далее нужно приниматься за настройку stunnel, а именно — его конфигурационного файла. Создаём в удобном месте файл stunnel.conf. Содержимое будет следующим:

setuid = root
setgid = root
pid = /var/opt/cprocsp/tmp/stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
output = /home/bit/stunnel.log
[TestStunnel]
client = yes
accept  = 0.0.0.0:13501
connect = 172.22.1.121:13500
verify = 2
cert = 0xb26305dgbhq47316f4fb80d4877383c4493b3g4d

Прокомментируем содержание секции TestStunnel:

  • Client — указатель на то, является ли программа сервером или клиентом;
  • Accept — локальный порт, к которому будет подключаться программа;
  • Connect — IP-адрес и порт сервера, с которым мы будем соединяться;
  • Verify — параметр, который мы уже описывали выше;
  • Cert — клиентский сертификат. На этом пункте необходимо задержаться.

Можно указать параметр двумя способами: либо импортировать сертификат из контейнера и прописать путь к файлу, либо воспользоваться отпечатком сертификата. Извлечь отпечаток можно всё той же командой certmgr -list. Идентификатор указан как SHA1 Hash.

 

Рисунок 4. Отпечаток в Linux

 Отпечаток в Linux

 

На этом настройка Linux закончена, можно запускать stunnel с указанием соответствующего файла конфигурации stunnel.conf.

 

Windows

После установки «КриптоПро CSP» необходимо скопировать контейнер с серверным ключом и сертификатом с nix-машины.

Все контейнеры попадают в /var/opt/cprocsp/keys/username и состоят из 6 файлов с расширением .key. Копируем все, хотя здесь будет небольшая проблема с импортом. «КриптоПро CSP» считает, что хранить контейнер на жёстком диске небезопасно, и поэтому необходим токен. Указанное препятствие можно обойти создав эмулятор контейнера.

Для этого необходимо скачать и установить ImDisk. Затем при помощи ImDisk Virtual Disk Driver следует создать эмулятор токена (именно так его и увидит CSP, по-русски это — просто контейнер HDD) и подключить его к системе.

 

Рисунок 5. Псевдотокен

 Псевдотокен

 

В итоге рядом с жёстким диском должен появиться ещё один носитель — это и есть токен. Туда понадобится скопировать папку с контейнером. После этих манипуляций сертификат нормально установится в «КриптоПро CSP».

Дополнительно стоит скопировать клиентский сертификат на сервер и тоже его установить.

Конфигурационный файл для stunnel-msspi:

output= C:\stunnel\stun.log
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
[https]
client = no
accept = 13500
connect = 13501
#cert =E:\srv1.000\srv.cer
cert = 60e26867b649ec6401a42892fa9ab752e51c7e1f
CApath = TrustedPeople
verify=2

Здесь всё устроено по аналогии с конфигурационным файлом клиента: accept — порт, к которому подключается клиентская копия stunnel (должен быть разблокирован в брандмауэре и «проброшен» во все места до наружного выхода), connect — порт для приложения (в данном случае — Netcat).

Повторяется история и в отношении сертификата: либо импорт из контейнера, что совсем не рекомендуется, либо указание отпечатка. Отпечаток можно найти в составе сертификата.

 

Рисунок 6. Отпечаток сертификата в Windows

 Отпечаток сертификата в Windows

 

Журнал для отладки можно будет отключить тогда, когда всё будет настроено как часы.

Теперь пора скачать Netcat для Windows.

Следующий шаг — запустить сервер stunnel, заодно перезапустив и клиент. Для отладки и тестирования в Windows лучше делать это из командной строки.

На сервере:

nc -nvlp 13501

На клиенте:

nc 127.0.0.1 13501

В командной строке сервера побежит протокол, который расскажет, что кто-то успешно подключился. Пишем в одном окне набор символов; он появляется в другом окне. Всё настроено верно.

 

Рисунок 7. Результат

 Результат

 

Выводы

В статье мы разобрали задачу о том, как получить криптотуннель с валидным ключом, подписанным самим «КриптоПро», и с алгоритмом шифрования GOST_2012, 512 бит. Сделано это с минимальными затратами — две лицензии на «КриптоПро CSP».

Можно, конечно, написать что-то своё, но лицензии JСP, к примеру, стоят намного больше. Готовые решения тоже будут значительно дороже.

Полезные ссылки: 
AM LiveПодписывайтесь на канал "AM Live" в Telegram, чтобы первыми узнавать о главных событиях и предстоящих мероприятиях по информационной безопасности.

RSS: Новые статьи на Anti-Malware.ru