Считается, что публичные (открытые) сети не обеспечивают необходимый уровень безопасности соединений. Существуют риски перехвата трафика злоумышленниками в подобных сетях — в кафе, вокзалах, торговых центрах, и др. Перехваченный трафик может стать источником информации, которая поможет взломать аккаунты\серверы, украсть конфиденциальную информации, или стать причиной других инцидентов безопасности.
VPN (virtual private network) — один из способов создать частную (приватную) сеть, используя общедоступные сети.
VPN используется как рядовыми пользователями, так и организациями всех размеров.
Доступ к частной сети имеют только определенные пользователи (используя многочисленные виды аутентификации), все соединения защищены шифрованием, поэтому перехват трафика не позволяет получить доступ к ценным (полезным) данным.
В общем виде, функционирование частной сети зависит от конкретной реализации.
Чаще используется клиент-серверная модель, в которой коммуникацию между узлами сети обеспечивает один или более серверов VPN. Под сервером понимается как физический или виртуальный хост с серверной ОС (а нередко и десктопной), так и специализированные сетевые устройства, поддерживающие ту или иную технологию VPN.
Вид коммуникаций может быть точка-точка (т.е. один хост коммуницирует с каким-то другим о определённым хостом), и объединение целых подсетей (с заметными изменениями маршрутизации).
OpenVPN — широко распространенная решение по реализации технологии VPN (и одноименный протокол).
Это кроссплатформенное решение, доступное для операционных систем Linux, Windows, MacOS, Android.
Лицензия GNU GPL допускает использование коммерческими организациями.
Далее пошагово показано, как установить, а затем запустить OpenVPN в серверной роли на хосте с ОС Ubuntu, применяя базовую конфигурацию, достаточную для безопасной работы.
Немного пояснений перед действиями
OpenVPN функционирует в связке с PKI.
Разработчики рекомендуют к применению скрипт easyrsa — он позволяет упростить выпуск\отзыв ключей и сертификатов. Скрипт становится доступным после загрузки пакета «easy-rsa» — его запуск с нужными опциями поможет провести подготовку к работе своего центра сертификации (ЦС).
В дальнейших действиях предполагается использование ассиметричного шифрования, требующего наличия на каждом хосте закрытого (для шифрования передаваемых пакетов) и открытого (для расшифровки) ключей.
Хосты частной (приватной) сети проводят распознавание (аутентификацию) друг друга перед взаимодействием, т.е. удостоверяются, что другая сторона та, за кого себя выдает. Это выполняется путем предоставления обеими сторонами своих публичных ключей.
В простом случае, каждый хост должен иметь копию открытого ключа всех остальных хостов частной сети для аутентификации (и для возможности безопасного обмена данных).
Но, следить за наличием ключей затруднительно, а также возможна подмена ключа.
Вместо этого вводится сторонний участник взаимодействия, которому доверяют остальные хосты –ЦС. Его назначение обработать запрос на выпуск сертификата для каждого открытого ключа. Обработка — значит выпуск и подписание этого сертификата своим собственным (который известен всем хостам). Таким образом, любому хосту достаточно проверить, что сертификат заверен ЦС.
Исходя из пояснений, для настройки потребуются:
- Закрытый ключ и сертификат для ЦС;
- Серверный закрытый ключ OpenVPN, сертификат открытого ключа, подписанный в ЦС;
- Клиентский закрытый ключ, сертификат открытого ключа, также подписанный сертификатом ЦС;
- Дополнительный файл, сформированный в соответствии с протоколом Diffie-Hellman. Использование такого файла затрудняет для злоумышленника расшифровку перехваченного трафика при компрометации закрытого ключа (т.е. когда ему удалось заполучить каким-то образом ключ).
- Специальный ключ HMAC как дополнение в целях безопасности, защищающий от различных атак на систему.
Установка
OpenVPN можно установить:
- из исходников;
- из репозитория Ubuntu;
- из репозитория разработчиков редакции Community.
Рекомендуется устанавливать обновления для ПО с помощью менеджера пакетов apt, поэтому вариант установки из исходников не подходит. В репозитории Ubuntu версия OpenVPN не совпадает с текущей стабильной версией. В репозитории разработчиков всегда имеется текущая стабильная версия, поэтому будем его использовать источником при установке.
Для добавления репозитория необходимо (все командах выполняются от root):
-
- Добавить GPG ключ в систему:
-
- Добавить новый источник поиска и установки пакетов:
-
- Произвести установку необходимых далее пакетов (включая зависимости):
Подготовка приватного ЦС
-
- Требуется сформировать поддиректорию и сопутствующее содержимое для работы ЦС:
Впоследствии, закрытые ключи «.key» помещаются в поддиректорию pki/private, выпущенные сертификаты «.сrt» в поддиректорию pki/issued.
-
- Перед началом работы easyrsa считываются значения переменных из файла «vars».
В нем записаны названия самих переменных, а также их дефолтные значения. Их допускается поменять на свое усмотрение, предварительно раскомментировав соответствующую строку.
Для внесения информативности перед выпуском сертификатов, можно изменить следующие переменные, к примеру, так:
Срок действия ключа ЦС указан в EASYRSA_CA_EXPIRE, измеряется в количестве дней. По умолчанию указано 3650 дней (т.е. 10 лет), если требуется – можно указать другой срок действия.
Также, можно поменять срок действия сертификата в строке с переменной EASYRSA_CERT_EXPIRE.
Остальные значения допустимо оставить закомментированными.
В этом же файле перед переменными представлены объяснения в виде комментариев по их использованию.
-
- Сгенерировать новый закрытый ключ и сертификат ЦС:
Рекомендуется установить сложную парольную фразу при появлении запроса на ее создание — это затруднит применение ключа в том случае, если он окажется скомпрометированным.
“Commom Name” &mdash нажать Enter, т.е. согласиться с предложенным именем в квадратных скобках, либо ввести свое произвольное имя.
Результат выполнения скрипта — закрытый ключ ЦС, сохраненный по пути «ca.key» — этот файл никогда не следует передавать никому, и хранить в недоступном для сторонних лиц месте. Также, будет создан соответствующий сертификат «ca.crt» — он используется далее в настройках.
-
- Сгенерировать файл Diffie-Hellman (процесс не моментальный, может продолжаться две-три минуты):
Файл «dh.pem» окажется в поддиректории «pki».
-
- Сгенерировать ключ HMAC:
Серверный ключ и сертификат
-
- Запустить easyrsa для генерации закрытого серверного ключа:
«nopass» позволит сгенерировать ключ без парольной фразы. Если ее задать — systemd потребует ее вводить перед каждым стартом сервиса. Если все же политика безопасности требует обязательного применения парольной фразы — не используйте эту опцию.
После запуска появится запрос на указание “Common Name” — следует указать произвольное имя, к примеру Serverspace.
Результат — закрытый серверный ключ «serverspace.key», который нельзя никому передавать. Этот же запуск скрипта сформирует и запрос сертификата — «serverspace.req».
-
- Выпустить и подписать сертификат (задействуя полученный «.req» файл):
Перед подписанием система запросит подтверждение содержащихся в нем данных «Confirm request details:» в ответ необходимо написать yes, затем скрипт запросит парольную фразу для закрытого ключа ЦС.
Серверный сертификат — «server.crt», он потребуется далее при создании конфиг-файла.
-
- Собрать все нужные файлы (ключ и сертификат сервера, файл Diffie-Hellman, сертификата ЦС и ключа HMАC) путем копирования в директорию /etc/openvpn/server:
Подготовка серверного конфиг-файла
Создать файл /etc/openvpn/server/server.conf с содержимым, представленным ниже:
proto udp
dev tun
mode server
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
server 172.16.61.0 255.255.255.0
push "redirect gateway def1"
push "dhcp-option DNS 8.8.8.8"
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
log-append openvpn.log
Порт остается дефолтным — 1194 (допустимо поменять если необходимо), трафик в udp (tcp задействуют для специфичных ситуаций), заданы подсеть и DNS, применяется сжатие.
Доступны и другие параметры (опции) — их использование определяется спецификой и конкретной задачей.
Запуск сервера OpenVPN
-
- Включить systemd сервис OpenVPN:
После старта процесса в систему добавляется новый интерфейс «tun0». Команду “ip a | grep tun0” можно выполнить для проверки его добавления, в выводе команды также должен быть отобразиться IP для этого интерфейса. Если «tun0» появился, то сервис запустился корректно.
Разрешить переход пакетов из внешнего интерфейса в созданный «tun0» (сервер начнет выполнять роль шлюза):
sysctl -p
-
- Добавить запись в IPTables, задействующую механизм NAT:
В команде указан интерфейс enp0s5 — следует заменить на имя того внешнего интерфейса, на который пойдут подключения клиентов.
После перезагрузки ОС это правило пропадет.
Для его автоматического применения достаточно добавить несложный скрипт в директорию /etc/networkd-dispatcher/routable.d/.
Например, назвать скрипт 50-ifup, и добавить такое содержимое:
if [[ "$IFACE" == "enp0s5" ]];
then
iptables -t nat -A POSTROUTING -s 172.16.61.0/24 -o enp0s5 -j MASQUERADE
fi
На этом с базовой серверной настройкой мы закончили.
Клиентский ключ и сертификат
-
- Выполнить запрос, генерирующий закрытый ключ, и соответствующий клиентский сертификат:
-
- Подписать файл созданного запроса:
Скрипт запросит подтверждение — в ответ написать yes, и затем ввести парольную фразу для ключа ЦС.
Созданный клиентский сертификат — «client_1.crt», закрытый ключ — «client_1.key».
Файлы, указанные ниже, требуется передать на то устройство, на котором предполагается создание клиентского подключения:
- ca.crt – сертификат ЦС;
- client_1.key – закрытый клиентский ключ;
- client_1.crt – сертификат клиента
- ta.key – ключ HMAC
В новой статье будет показано их применение на клиенте OpenVPN (включая их объединение вместе с параметрами для запуска).