Защищаем сетевые службы при помощи stunnel

  • Автор:

stunnel-ssl-000.pngГоворя о защите сетевых служб, многие администраторы сразу вспоминают о VPN, нередко забывая об иных, не менее эффективных способах. Да, VPN позволяет эффективно решить эту задачу, но не всегда бывает удобен и очень часто избыточен. Особенно если нужно защитить одну - две сетевые службы. Поэтому давайте посмотрим на доступные альтернативы, одна из них - это stunnel, SSL-прокси с широкими возможностями, одна из них - создание защищенного соединения между двумя узлами. Подробности в нашей статье.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Чтобы понять для каких случаев предпочтительнее stunnel снова вернемся к VPN, при всех ее достоинствах некоторые из них могут обернуться недостатками. С помощью VPN легко предоставить доступ ко всем ресурсам внутренней сети, но если с той стороны находится неконтролируемый или внештатный сотрудник (скажем бухгалтер на аутсорсинге), то этот плюс моментально превращается в минус. И нам уже надо думать не о том, как доступ к сети предоставить, а о том, как бы его закрыть.

В то же время stunnel предусматривает совершенно иной принцип работы, он работает на уровне TCP-соединений и позволяет просто и эффективно защитить его при помощи современного шифрования. С его помощью клиент будет иметь доступ к одному единственному порту сетевой службы и никуда более. При необходимости можно настроить несколько таких соединений.

Для примера мы рассмотрим организацию доступа к веб-серверу с опубликованной на нем базой 1С:Предприятия, доступ к которой должен иметь удаленный сотрудник. Будем считать, что веб-сервер с модулем расширения 1С установлен на машине с Linux (Debian или Ubuntu) расположенной в локальной сети предприятия, веб-сервер принимает подключения по протоколу HTTP без шифрования. Задача - обеспечить доступ к 1С с рабочего места бухгалтера.

Все команды в ОС Linux следует выполнять от имени суперпользователя (root), если не указано иного.

Создание ключей и сертификатов

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

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

umask 077

Перейдем в корневую папку и создадим там директорию для хранения ключей и сертификатов:

cd ~
mkdir pki

Перейдем в нее и сразу создадим ключевую пару сервера:

cd pki
openssl req -new -x509 -days 3650 -newkey rsa:3072 -nodes -keyout server.key -out server.crt -subj "/O=Interface LLC/CN=stunnel"

Эта команда создает сертификат с длинной ключа 3072 бит и сроком на 10 лет, также мы указали дополнительный параметр subj, в котором по минимуму заполнили поля сертификата, чтобы в будущем можно было хотя бы понять, что это за сертификат и для чего он нужен.

Аналогичным образом создаем сертификат для клиента. Хотя если действовать правильно, то его следует формировать на ПК клиента и на сервер передавать только открытый ключ или сертфикат CA, но мы сами себе доверяем и поэтому будем формировать и хранить все в одном месте.

openssl req -new -x509 -days 365 -newkey rsa:3072 -nodes -keyout client1.key -out client1.crt -subj "/O=Interface LLC/CN=client1"

Единственный момент - срок действия сертификата, мы не рекомендуем выпускать клиентские сертификаты на большой срок, особенно если вы не контролируете устройство клиента. Лучше раз в год перевыпустить сертификат, чем где-то будет кочевать полностью неконтролируемое устройство с валидным сертификатом на 10 лет.

Теперь объединим сертификаты и ключи клиентов и сервера в один файл:

 cat server.key server.crt > server.pem
cat client1.key client1.crt > client1.pem

Вернем маску к исходным значениям:

umask 022

Ключи клиентов нам нужно будет передать на целевые ПК, поэтому скопируем их в каталог обычного пользователя (в нашем случае это andrey) и сделаем его их владельцем:

cp client1.pem ~andrey
chown andrey:andrey ~andrey/client1.pem

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

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

Обновим список пакетов в системе и установим stunnel:

apt update
apt install stunnel4

Конфигурационные файлы программы располагаются в /etc/stunnel, но сейчас там пусто, поэтому начнем с создания общего конфигурационного файла:

nano /etc/stunnel/stunnel.conf

В данном случае мы используем редактор nano, если вам больше по душе редактор от mc, то замените в команде nano на mcedit.

Затем внесем в него следующие строки:

pid = /var/run/stunnel4/stunnel.pid

debug = info
output = /var/log/stunnel.log
syslog = no

Затем плавно переходим к настройкам шифрования, так как у нас "театр одного актера", то нет необходимости поддерживать совместимость с различными типами клиентов, можно сразу задать требуемые настройки шифрования. Мы будем безальтернативно использовать последнюю версию протокола TLS 1.3:

sslVersion = TLSv1.3

В качестве эллиптической кривой для алгоритма Диффи-Хеллмана будем использовать быструю и эффективную Curve25519:

curves = X25519

Теперь зададим шифр. Здесь есть над чем подумать, так как большинство современных процессоров поддерживает аппаратное ускорение AES, то предпочтительно выбирать шифры на его основе, можно начать со 128 битного:

ciphersuites = TLS_AES_128_GCM_SHA256

Либо использовать более надежный, но и более тяжелый 256 битный шифр:

ciphersuites = TLS_AES_256_GCM_SHA384

Для систем без аппаратного ускорения AES предпочтительно использовать шифр ChaCha20, который применяется в WireGuard:

ciphersuites = TLS_CHACHA20_POLY1305_SHA256

Ниже добавим секцию для нашего сервиса, таких секций может быть множество.

[1C]
accept = 192.168.72.197:443
connect = 127.0.0.1:80
verifyPeer = yes
cert = /etc/stunnel/server.pem
CAfile = /etc/stunnel/clients.pem

Давайте разберем указанные опции:

  • accept - адрес и порт, где сервер будет принимать подключения, указываем адрес в локальной сети и порт 443 (либо любой другой).
  • connect - адрес и порт куда будем перенаправлять подключения, мы подключаемся к apache локально, можем вообще ограничить его только localhost.
  • verifyPeer - необходимо ли проверять сертификат клиента, в нашем случае необходимо, так как сервис закрытый.
  • cert - путь к ключевой паре сервера
  • CAfile - путь к файлу для проверки сертификатов клиента, он должен содержать сертификаты CA, которым мы доверяем, а в случае с самоподписанными сертификатами - их самих.

Сохраним конфигурационный файл и снова вернемся в директорию с ключами и сертификатами, скопируем нужные файлы:

cd ~/pki
cp server.pem /etc/stunnel

Теперь создадим и заполним файл доверенных сертификатов, допустим у нас есть сертификаты двух клиентов:

cat client1.crt client2.crt >> /etc/stunnel/clients.pem

Если у нас появляется еще один клиент, то добавить его сертификат в файл можно командой:

cat client3.crt >> /etc/stunnel/clients.pem

Теперь можно перезапустить сервис:

systemctl restart stunnel4

И проверить его состояние:

systemctl status stunnel4

Также не забудем добавить сервис в автозагрузку:

systemctl enable stunnel4

Перезагрузим компьютер и убедимся, что все работает и служба stunnel запускается без ошибок.

Настройка клиента stunnel

Скорее всего в качестве клиента будет выступать ПК с операционной системой Windows, поэтому дальнейшие действия мы будем рассматривать в ней, хотя файлы конфигурации, с поправкой на пути, остаются едиными для всех поддерживаемых ОС.

В первую очередь скачаем stunnel c официального сайта. Установка стандартная, единственный момент - измените расположение по умолчанию так, чтобы в пути не было пробелов, например C:\stunnel:

stunnel-ssl-001.pngПосле установки мы рекомендуем запустить GUI-приложение stunnel, которое позволяет удобно редактировать конфигурацию, перечитывать ее и здесь же выводить подробный лог. Для настройки и отладки самое то, что нужно.

stunnel-ssl-002.pngПри установке будет создан конфигурационный файл C:\stunnel\config\stunnel.conf, он содержит большое количество комментариев и примеры подключения к стандартным сервисам, вроде почтовых служб, поэтому смело удаляем его содержимое и вносим следующий текст:

[1C]
client = yes
accept = localhost:80
connect = 192.168.3.116:443
cert = client1.pem

Где:

  • client - флаг указывающий работать в режиме клиента.
  • accept - адрес и порт, на котором будет доступен сервис, так как светить им наружу не нужно, то используем localhost.
  • connect - адрес и порт сервера.
  • cert -путь к файлу с ключевой парой.

Сохраняем конфигурацию и копируем в C:\stunnel\config файл сертификата клиента client1.pem. Перезапускаем сервис и пытаемся соединиться веб-клиентом 1С с localhost, если все сделано правильно, то подключение будет успешным.

stunnel-ssl-003.pngУбедившись, что все работает как надо, полностью выходим из GUI-приложения. Для установки stunnel как службы откроем Командную строку от имени Администратора и выполним в ней команду:

C:\stunnel\bin\stunnel.exe -install

Для запуска службы выполните:

C:\stunnel\bin\stunnel.exe -start

stunnel-ssl-004.pngКак видим, настроить stunnel совсем несложно, поэтому надеемся, что данная статья будет вам полезна и вы возьмете на вооружение еще один способ безопасного использования сетевых служб.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments