Дополнительные возможности OpenVPN по обеспечению безопасности виртуальной частной сети

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

Примечание: данный материал подразумевает наличие у вас готовой к работе базовой конфигурации OpenVPN. Если такая конфигурация еще не развернута, вы можете воспользоваться одной из наших подробных инструкций по настройке OpenVPN-сервера:

tls-auth

Параметр tls-auth добавляет использование еще одной подписи HMAC к handshake-пакетам SSL/TLS, инициируя дополнительную проверку целостности. Теперь пакет, не имеющий такой подписи, будет отбрасываться, не обрабатываясь. Это обеспечит дополнительный уровень безопасности протокола SSL/TLS, защищая систему от таких атак, как:

Для активации tls-auth необходимо сгенерировать дополнительный секретный ключ, который будет использоваться совместно со стандартной парой ключей RSA.Сделать это можно с помощью следующей команды:

openvpn --genkey --secret ta.key

Теперь в стандартной директории, в которой хранятся сгенерированные ключи (easy-rsa) появится еще один файл ta.key, который нужно перенести на все устройства сети OpenVPN через защищенный канал (в те же директории, в которых хранятся пользовательские ключи .crt и .key. Затем следует добавить или расскоментировать в файле конфигурации сервера (server.conf) следующую строку:

tls-auth ta.key 0

Также нужно в файле настроек клиента (client.ovpn) добавить/расскоментировать аналогичную строку:

tls-auth ta.key 1

 

proto udp

Несмотря на то, что OpenVPN предусматривает использование как TCP, так и UDP-протокола для подключения, рекомендуем использовать UDP, так как он обеспечивает более высокий уровень защиты от DoS-атак и сканирования портов сравнительно с протоколом TCP. Выбор протокола устанавливается опцией proto в файле конфигурации сервера. Установите proto udp.

Внимание! Если вы сменили протокол на уже работающем сервере, не забудьте сделать это также в файлах конфигурации клиентов, а затем проверить разрешение для используемого порта UDP (по-умолчанию 1194) в вашем Firewall и перезапустить VPN-сервер.

 

user/group (не работает на Windows)

Сброс привилегий суперпользователя сразу после активации VPN - хороший способ сделать сервер менее привлекательной целью для различных атак. Рекомендуем всегда использовать эту опцию на серверах под управлением Linux/BSD. Этот параметр устанавливается в следующих строках файлов конфигурации сервера/клиента:

user nobody
group nobody

 

Работа VPN в непривилегированном режиме (только для Linux)

OpenVPN может работать вовсе без привелегий на машинах под управлением Linux. Такая конфигурация является более сложной в развертывании, но обеспечивает повышенный уровень безопасности. Для ее реализации нужно настроить OpenVPN на использование интерфейса iproute. Для этого укажите --enable-iproute2 в параметрах скрипта configure. Для настройки вам также понадобится установленный на машине пакет sudo.

Такая конфигурация основана на возможности Linux-систем устанавливать разрешения на создаваемый демоном OpenVPN виртуальный сетевой адаптер tun так, чтобы непривилегированный пользователь мог получить доступ к нему. Для изменения параметров сетевого интерфейса и таблицы маршрутизации обычным (не "super") пользователем при запуске iproute следует использовать параметр sudo.

Настройка OpenVPN на работу в непривилегированном режиме:

Добавьте представленный ниже скрипт в файл /usr/local/sbin/unpriv-ip (не забудьте указать этому файлу права на исполнение):

#!/bin/sh
sudo /sbin/ip $*

Чтобы разрешить для пользователя (в нашем примере '1cloud') выполнение /sbin/ip откройте visudo и добавьте следующую строку:

1cloud ALL=(ALL) NOPASSWD: /sbin/ip

Вы можете дать разрешения также и для группы пользователей:

%users ALL=(ALL) NOPASSWD: /sbin/ip

Теперь необходимо добавить в файл конфигурации OpenVPN следующие строки:

dev tunX/tapX
iproute /usr/local/sbin/unpriv-ip

(Необходимо выбрать один из интерфейсов (tun или tap) и заменить X на номер вашего интерефейса.

От имени пользователя root активируйте сетевой адаптер и дайте разрешение на управление им для пользователя и/или группы. Команда, приведенная ниже, создаст интерфейс tunX (необходимо заменить на название вашего адаптера) и даст требуемые разрешения для пользователя 1cloud и группы users.

openvpn --mktun --dev tunX --type tun --user 1cloud --group users

Теперь вы можете запустить OpenVPN от имени указанного выше рядового пользователя.

 

chroot (не работает на Windows)

Параметр chroot обеспечивает блокировку сервиса OpenVPN в условно обозначаемой "тюрьме" (chroot jail), из которой приложение не сможет иметь доступ к какой-либо части файловой системы, кроме определенной директории, указанной в опциях для параметра chroot (для получения подробной информации изучите man 1 chroot и man 2 chroot).

Например, параметр:

chroot jail

Будет означать, что OpenVPN-демон при инициализации попадет в директорию jail и переориентируется на эту папку так, чтобы в дальнейшем для службы OpenVPN не было возможности получить доступ к каким-либо файлам, кроме каталога jail и его подкаталогов. Это имеет существенное значение с точки зрения безопасности, поскольку если злоумышленнику и удастся скомпрометировать VPN-сервер инъекцией кода, "пойманный" эксплойт останется заблокированным в каталоге, полностью изолированном от основной части файловой системы.

Внимание: т.к. опция chroot изменяет домашнюю директорию для сервиса OpenVPN, следует перенести в jail-каталог все используемые при инициализации OpenVPN файлы.

 

Увеличение размера RSA-ключа

Размер RSA-ключа шифрования устанавливается директивой KEY_SIZE файла easy-rsa/vars, значение которой должно быть установлено до создания любых ключей OpenVPN. По-умолчанию этот параметр имеет значение 1024 bit , но может быть увеличен до 2048 bit без заметного влияния на производительность виртуальной частной сети, за исключением едва заметного увеличения времени рукопожатия (handshake).

 

Увеличение размера симметричных ключей

При стандартной конфигурации OpenVPN использует Blowfish - 128-битный симметричный ключ шифрования, но при этом может принимать все виды ключей, поддерживаемых библиотекой OpenSSL. Например, вы можете использовать 256-битный шифр AES (Advanced Encryption Standard), добавив в файлы настроек сервера и клиентов OpenVPN параметр:

cipher AES-256-CBC

Хранение закрытого ключа CA на отдельной машине

Перенос файла секретного ключа Центра Сертификации (ca.key) на отдельный компьютер, не подключенный к сети интернет, или на другое безопасное внешнее хранилище - хороший  способ исключить компрометацию существующих и генерацию новых, но не санкционированных ключей X509.

Дело в том, что корневой CA-сертификат не обязательно должен находиться на сервере OpenVPN. Вы вполне можете использовать отдельную машину для подписи ключей, держа ее физически изолированной, и перенося ключи с использованием отличных от интернет каналов, например съемных дисков. Это существенно осложнит потенциальному злоумышленнику задачу кражи ключа Центра Сертификации.

Отзыв сертификатов

Процедура отзыва сертификата подразумевает досрочное прекращение активности ранее созданного и заверенного сертификата пользователя во избежание его дальнейшего использования . Ниже представлены самые распространенные предпосылки для отзыва:

В рамках данного примера, мы отзовем сертификат пользователя client1.

Войдите в терминал (Linux) или командную строку (Windows) и откройте директорию easy-rsa, аналогично тому, как вы делали это при первичной генерации ключей сервера и клиентов OpenVPN. Введите следующие команды:

Linux:

./vars
./revoke-full client1

Windows:

vars
revoke-full client1

Вы должны увидеть результат, похожий на этот:

Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf DEBUG[load_index]: unique_subject = "yes" Revoking Certificate
04. Data Base Updated Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
client2.crt: /C=KG/ST=NA/O=OpenVPN-TEST/CN=client2/emailAddress=me@myhost.mydomain
error 23 at 0 depth lookup:certificate revoked

Пусть вас не смущает "error 23" в последней строке, т.к. именно этот ответ означает, что отозванный сертификат больше не проходит проверку действительности. Выполнение revoke-full генерирует CRL-файл (certificate revocation list) под именем crl.pem в подкаталоге keys. Этот файл необходимо перенести в рабочую директорию OpenVPN-сервера. Проверка CRL должна быть активирована в файле конфигурации сервера добавлением/расскоментированием строки: crl-verify crl.pem.

Валидация серверного сертификата

Для исключения атак типа Man-in-the-Middle, когда машина злоумышленника выдает себя за VPN-сервер для клиента, следует указать пользователям на необходимость проверки серверного сертификата. Для этого существует несколько способов. В данном примере мы рассмотрим метод, применимый для OpenVPN версий 2.1 и выше:

При генерации сертификата сервера укажите значения полей key usage и extended key usage (см. документацию easy-rsa для получения более подробных сведений). Затем добавьте/расскоментируйте следующую строку в файле параметров клиента:
remote-cert-tls server

Используйте перечисленные выше инструменты для повышения уровня безопасности вашей виртуальной частной сети и обращайте внимание на сохранность других элементов: используемых каналов передачи ключей и сертификатов, физическая сохранность узлов сети VPN, настройки Firewall и антивирусного ПО, права доступа пользователей к рабочим директориям. Надеемся, этот материал поможет вам в достижении ваших задач.

 

Последнее обновление: 09.04.2024