настройка 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 - ваш лучший помощник :)
Мстислав Дубчак
В любом случае, за более подробной информацией рекомендуется обратиться к сайтам разработчиков и 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