настройка OpenVPN c применением сертификатов X.509 вместо статических ключей

Данная статья не претендует на исчерпывающее повествование по данной теме. В ней не раскрываются все возможности и опции настройки пакетов OpenSSL и OpenVPN. Впрочем, и о том, и о другом писалось уже достаточно много, в том числе и в «СР».

В любом случае, за более подробной информацией рекомендуется обратиться к сайтам разработчиков и man-страницам.

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

Статья писалась как пошаговое руководство-инструкция для начинающих, позволяющее с нуля настроить соединение 2-х и более машин по технологии VPN, используя свободно распространяемое ПО.

Начиная с версии 2 в пакете OpenVPN появилась возможность создавать соединения типа точка-многоточка с использованием на сервере одного виртуального адаптера tap/tun и, как следствие, использовать один процесс демона OpenVPN.

Установка и настройка производится на машине с установленной ОС FreeBSD, настроенной сетевой подсистемой и доступом в Интернет. Автор описал процесс настройки под FreeBSD 4.11-RELEASE-p11 и FreeBSD 5.3-RELEASE-p20, который проверил сам лично.

На машине были установлены следующие пакеты (устанавливалось из коллекции портов при помощи portinstall):

- OpenSSL v. 0.9.7g;
- OpenVPN v. 2.0.2.

создание Certificate Authority (CA)

После установки OpenSSL, файл конфигурации (openssl.cnf), потребуется отредактировать, чтобы при необходимости изменить каталоги, в которых будут располагаться ключи, сертификаты и прочее во время настройки, а также имена и наименование организации.

Как правило, конфиг располагается в каталоге /usr/local/openssl/ либо в /etc/ssl/.

После редактирования openssl.cnf делаем следующее.

1. Создаем файл /usr/local/openssl/serial c содержимым «01»;

2. Создаем каталоги /crl, /newcerts, /private.

Для каталога private, в целях безопасности частного ключа сервера, рекомендую установить права только для пользователя root.

3. Создаем пустой файл /usr/local/openssl/index.

4. И, наконец, создаем сертификат CA:

# openssl req -nodes -config openssl.cnf -days 1825 -x509 -newkey rsa -out ca-cert.pem -outform PEM

создание сертификата X.509

Теперь, когда мы имеем CA, мы можем создавать сертификаты и ключи для машин, образующих туннель. Вместо приведенных в примере host_x и client_x рекомендую указывать осмысленное имя вашей машины-сервера и клиентов, что бы потом не запутаться самому.

Сгенерируем частный ключ для сервера (его настоятельно рекомендуется хранить в тайне):

# openssl genrsa -out host_x.key

Генерируем сертификат:

# openssl req -new -nodes -key host_x.key -out host_x.csr
# openssl ca -batch -config openssl.cnf -in host_x.csr -out host_x.cert


Теперь повторим то же самое, но только для клиента:

# openssl genrsa -out client_x.key
# openssl req -new -nodes -key client_x.key -out client_x.csr
# openssl ca -batch -config openssl.cnf -in client_x.csr -out client_x.cert


И в конце создаем ключик ta.key. Этот ключ используется для предотвращения DoS-атак и UDP port flooding.

# openvpn --genkey --secret ta.key

Таким образом мы получили подписанный нами же сертификат X.509.
Необходимо повторить эти действия для всех имеющихся у нас машин.
Далее следует создать ключ Диффи Хельман (подробнее о нем на сайте http://www.rsasecurity.com/rsalabs/node.asp?id=2248).Этот ключ используется для шифрования трафика при установлении соединения:

# openssl dhparam -out dh1024.pem 1024

Теперь переходим к конфигурированию самого OpenVPN.
Файл конфигурации для сервера у меня находится в /usr/local/etc/openvpn/ и выглядит так:

proto udp
dev tap0 # использую tap, хотя можно и tun (рекомендуется)
port 1194

# TLS parms
tls-server
ca /etc/ssl/ca-cert.pem
cert /etc/ssl/host_x.cert
key /etc/ssl/host_x.key
dh /etc/ssl/dh1024.pem

mode server

ifconfig 10.10.10.10 255.255.255.248
ifconfig-pool 10.10.10.11 10.10.10.15

duplicate-cn
tls-auth /etc/ssl/ta.key 0

#cipher BF-CBC# Blowfish (default)
#cipher AES-128-CBC # AES
cipher DES-EDE3-CBC # Triple-DES

user nobody
group nobody

persist-key
persist-tun

comp-lzo
keepalive 10 120

status /var/log/openvpn-status.log
log /var/log/openvpn.log

verb 3


Файл конфигурации для клиента у меня такой:

client
proto udp
remote aaa.ccc.yyy.xxx
port 1194
dev tap

resolv-retry infinite

persist-key
persist-tun

tls-client
dh dh1024.pem
ca ca-cert.pem
cert client_x.cert
key client_x.key

#cipher BF-CBC# Blowfish (default)
#cipher AES-128-CBC # AES
cipher DES-EDE3-CBC # Triple-DES

tls-auth ta.key 1

ping 10

comp-lzo

verb 3
mute 10


После создания файлов конфигурации, при помощи скрипта, созданного при инсталляции запускаем демона openvpn на сервере:

# sh /usr/local/etc/rc.d/openvpn.sh start

Проверяем. запустился ли демон:

# sockstat | grep openvpn

Если видим что-то вроде

nobody openvpn 33072 3 udp4 *:1194*:*

значит, сервер готов принимать входящие подключения.

Далее запускаем клиента на своей машине. Рекомендую использовать GUI-оболочку, если клиентом будет являться машина с Windows.

Если клиентом выступает машина с FreeBSD, то запуск аналогичен серверной части.

Для прояснения некоторых моментов образования соединения нелишним будет изучить вывод, который пишется в /var/log/openvpn.log.

Именно используя его, автор получил большую часть информации, пригодившейся при отладке конфигов. Регулировать детализацию логирования помогает ключик verb.

Для более детального изучения возможностей OpenVPN, настоятельно рекомендую изучить примеры конфигов на http://openvpn.net/howto.html#examples. Ну и, конечно, рекомендуется не забывать о том, что многие ошибки до нас уже кто-то совершал и с аналогичными проблемами уже сталкивался, а по сему Google - ваш лучший помощник :)



Мстислав Дубчак


Сетевые решения. Статья была опубликована в номере 08 за 2006 год в рубрике sysadmin

©1999-2024 Сетевые решения