infra
November 23, 2021

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

Для любого системного администратора или DevOps’а построить VPN или пробросить нестандартный метод инкапсуляции пакетов (туннелирование) не очень сложно. Часто для этого используют OpenVPN для постоянного использования, либо ssh-туннелирование на один-два раза. Однако есть организации, которые должны соблюдать строгие рамки передачи данных, установленные законодательством. Под такие организации попадают банки, микрофинансовые организации (да и многие организации, которые так или иначе имеют отношения к финансовым операциям). Защита персональных данных тоже является “защищаемой информацией” во всех законопроектах и положениях.

В результате, опять же по законодательству, при шифровании необходимо использовать СКЗИ со всеми необходимыми ФСТЕКовскими сертификатами и лицензиями, которые удовлетворяют необходимые требования. Одним из таких программных обеспечений является КриптоПро CSP. И в данной статье будем разбирать как “прокинуть” сетевой туннель средствами stunnel, который будет шифроваться КриптоПро CSP, заодно получим хоть и тестовый (на 3 месяца), но полностью валидный по GOST_2012.

Задача

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

К примеру, есть две машины. Чтобы показать настройку двух операционных систем, одна будет на Linux Ununtu, версия не важна, но желательно не ниже 16), вторая на Windows 10. На win-системе будет запускаться NC на прослушку какого-то определенного порта, а с nix-системы будут передаваться пакеты. Таким образом windows будет сервером. В отношении настроек stunnel такая же ранжировка: Windows — сервер.

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

В бой
#Linux

Начнем с того, что система готова к настройке. Как работает КриптоПро скорее всего все уже знают. Небольшие уточнения по stunnel: этот софт изначально предназначался как прокси с функцией шифрования трафика. Другими словами — он берет, к примеру, http и превращает его в, своего рода, https (если не вдаваться в подробности протоколирования).

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

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

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

Рисунок 2. КриптоПро на 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 линукс система будет клиентом, 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. нужно запустить ее следующими со ключами: ./cpconfig -defprov –view_type.

Рисунок 3. cpconfig

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

· certusage — идентификатор назначения. Для выполнения задачи необходимы два модуля: проверка подлинности клиента (1.3.6.1.5.5.7.3.2) и проверка подлинности сервера (1.3.6.1.5.5.7.3.1)
· hashAlg — алгоритм, который будет применяться. Их можно найти тут
· ca — центр сертификации, который подпишет все это добро, чтобы оно было валидно. Сертификаты и ключи валидны ТОЛЬКО в течении 3 месяцев!!! Точнее данный УЦ его выдает на 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 = rootsetgid = rootpid = /var/opt/cprocsp/tmp/stunnel.pidsocket = l:TCP_NODELAY=1socket = r:TCP_NODELAY=1

debug = 7output = /home/bit/stunnel.log

[TestStunnel]client = yesaccept = 0.0.0.0:13501connect = 172.22.1.121:13500verify = 2cert = 0xb26305dgbhq47316f4fb80d4877383c4493b3g4d

Секция TestStunnel:
Client — указатель, является ли программа сервером или клиентом
Accept — порт, который будет открываться на локалхосте, именно к нему будет подключаться программа
Connect — ip и порт сервера, к которому будем подключаться
Verify — об этом разговор уже выше был
Cert — это как раз клиентский сертификат. Вот в этом пункте необходимо задержаться.

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

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

На этом настройка Linux закончена, можно запускать stunnel с указание конфига 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.logsocket = l:TCP_NODELAY=1socket = r:TCP_NODELAY=1debug = 7

[https]client = noaccept = 13500connect = 13501#cert =E:\srv1.000\srv.cercert = 60e26867b649ec6401a42892fa9ab752e51c7e1fCApath = TrustedPeopleverify=2

Тут все по аналогии с конфигурационным файлом клиента: accept-порт, на который подключается клиентская стуннелина (должен быть разблокирован фаерволом, проброшен во все места до наружного выхода), connect — порт для приложения (в данном случае nc).

В плане сертификата — тут та же история, либо импортим из контейнера, что совсем не рекомендуется, либо указывать отпечаток. Отпечаток можно найти в составе сертификата.

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

Лог для дебага можно будет отключить тогда, когда все будет настроено как часы.
Далее необходимо скачать nc для Windows.
Теперь надо запустить сервер stunnel, заодно перезапустить клиента. Для дебага и теста в Windows это лучше делать с командной строки.

На сервере запускается как:
nc –nvlp 13501

На клиенте:
nc 127.0.0.1 13501

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