Настройка OpenVPN с использованием сертификатов X.509


<strong>Установка сервера OpenVPN</strong>
<!--more-->
Перед установкой сервера <strong>OpenVPN</strong> необходимо добавить в файл конфигурации ядра строку <strong>pseudo-device tun</strong>, если таковая отсутствует, пересобрать ядро и перезагрузить систему. Затем нужно установить <strong>OpenVPN</strong> из портов:

[bash]
cd /usr/ports/security/openvpn
make install
[/bash]

Файлы конфигурация сервера <strong>OpenVPN</strong> хранятся в папке /usr/local/etc/openvpn. Для создания этой папки, а также всех необходимых вложенных папок и файлов необходимо выполнить следующую последовательность команд:

[bash]
mkdir /usr/local/etc/openvpn
cd /usr/local/etc/openvpn
mkdir ccd
mkdir certs
mkdir crl
mkdir keys
mkdir private
mkdir req
chmod 700 keys private
echo "01" > serial
touch index.txt
[/bash]

Указанные команды создают папку /usr/local/etc/openvpn; вложенные в нее папки: ccd (конфигурации удаленных клиентов), certs (сертификаты клиентов и сервера), crl (списки отзыва сертификатов), keys (закрытые ключи сертификатов клиентов и сервера), private (закрытый ключ самоподписного доверенного сертификата (CA), req (запросы на сертификаты); ограничивают права доступа к папкам keys и private; создают базу данных сертификатов (файлы serial и index.txt).

<strong>Файл конфигурации </strong><strong>OpenSSL</strong>
По умолчанию <strong>OpenSSL</strong> использует файл конфигурации /etc/ssl/openssl.cnf. Я рекомендую создать отдельный файл конфигурации <strong>OpenSSL</strong> в папке /usr/local/etc/openvpn. Данный файл должен называться openssl.cnf и иметь следующее содержимое:

[bash]
[ ca ]
default_ca               = CA_default
[ CA_default ]
dir                      = /usr/local/etc/openvpn
crl_dir                  = $dir/crl
database                 = $dir/index.txt
new_certs_dir            = $dir/certs
certificate              = $dir/CA_cert.pem
serial                   = $dir/serial
crl                      = $dir/crl/crl.pem
private_key              = $dir/private/CA_key.pem
RANDFILE                 = $dir/private/.rand
default_days             = 3650
default_crl_days         = 365
default_md               = md5
unique_subject           = yes
policy                   = policy_any
x509_extensions          = user_extensions
[ policy_any ]
organizationName         = match
organizationalUnitName   = optional
commonName               = supplied
[ req ]
default_bits             = 2048
default_keyfile          = privkey.pem
distinguished_name       = req_distinguished_name
x509_extensions          = CA_extensions
[ req_distinguished_name ]
organizationName         = Organization Name (must match CA)
organizationName_default = Company
organizationalUnitName   = Location Name
commonName               = Common User or Org Name
commonName_max           = 64
[ user_extensions ]
basicConstraints         = CA:FALSE
[ CA_extensions ]
basicConstraints         = CA:TRUE
default_days             = 3650
[ server ]
basicConstraints         = CA:FALSE
nsCertType               = server
[/bash]

<strong>Создание самоподписного доверенного сертификата (CA)</strong>
Для создания самоподписного доверенного сертификата (Certification Authority, CA) и закрытого ключа для него необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl req -new -nodes -x509 -keyout private/CA_key.pem -out CA_cert.pem -days 3650
[/bash]

Команда req заставляет <strong>OpenSSL</strong> создать сертификат, ключи: -new – cоздать запрос на сертификат, -nodes – не шифровать закрытый ключ, -x509 (совместно с -new) – создать самоподписной сертификат (CA), -keyout – задает местонахождение закрытого ключа, -out – задает местонахождение самоподписного сертификата, -days – задает время действия сертификата (365×10 дней, что приблизительно равно десяти годам). В процессе выполнения команды на экран будут выданы запросы о вводе таких параметров как: Country Name, State or Province Name; Locality Name; Organization Name; Organizational Unit Name; Common Name; Email Address. Самым важным параметром является значение Common Name. В данном случае оно должно совпадать с FQDN-именем сервера. Для просмотра результата генерации самоподписного сертификата и закрытого ключа необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl x509 -noout -text -in CA_cert.pem       (для сертификата)
openssl rsa -noout -text -in private/CA_key.pem (для закрытого ключа)
[/bash]

<strong>Создание сертификата сервера</strong>
Перед созданием сертификата сервера необходимо создать запрос на сертификат сервера и закрытый ключ сервера.  Для этого необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl req -new -nodes -keyout keys/server.pem -out req/server.pem
[/bash]
Команда и ключи <strong>OpenSSL</strong> рассмотрены выше. В процессе выполнения комнды Вам опять придется ответить на вопросы. Ответы должны соответствовать ответам из предыдущего пункта. В ответ на дополнительные запросы "A challenge password []:" и "An optional company name []:" необходимо просто нажать <em><strong>enter</strong></em>. Для просмотра результата генерации запроса на сертификат и закрытого ключа сервера необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl req -noout -text -in req/server.pem  (для запроса на сертификат)
openssl rsa -noout -text -in keys/server.pem (для закрытого ключа)
[/bash]

Для создания сертификата сервера необходимо подписать запрос на сертификат сервера  самоподписным доверенным сертификатом (CA). Для этого необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl ca -batch -config openssl.cnf -extensions server -out certs/server.pem -infiles req/server.pem
[/bash]
Команда ca заставляет <strong>OpenSSL</strong> подписать запрос на сертификат, ключи: -config задает местонахождение файла конфигурации OpenSSL, -extensions – задает секцию файла конфигурации OpenSSL, содержащую дополнительные параметры генерируемого сертификата, -out – задает местонахождение генерируемого сертификата, -infiles – задает местонахождение запроса на сертификат, -batch – избавляет Вас от ответов на дополнительные вопросы. В процессе выполнения команды Вам будет задан вопрос "Sign the certificate? [y/n]:", на который нужно ответить утвердительно, после чего произойдет генерация сертификата и обновление базы данных сертификатов (файлов index.txt и serial). Для просмотра результата генерации сертификата необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

[bash]
openssl x509 -noout -text -in certs/server.pem
[/bash]

<strong>Создание файла параметров </strong><strong>Диффи-Хэлмана</strong>
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl dhparam -out dh2048.pem 2048
[/bash]
Команда <strong>dhparam</strong> приказывает <strong>OpenSSL</strong> создать файл параметров <strong>Диффи-Хэлмана</strong>, число 2048 определяет разрядность в битах. <em>Внимание:</em> данная команда выполняется достаточно медленно даже на очень мощных компьютерах.

<strong>Создание клиентских сертификатов</strong>
Процедура создания клиентских запросов на сертификаты и закрытых ключей, подписания запросов на сертификаты и генерации сертификатов, а также просмотра запросов на сертификаты, сертификатов и закрытых ключей полностью аналогична соответствующей процедуре для сервера. Сделаю одно небольшое замечание: запросы на сертификаты, закрытые ключи и сертификаты должны иметь шаблонные имена, например, вида: req/RClient для запросов на сертификаты, keys/KClient для закрытых ключей и certs/CClient для сертификатов, соответственно. Слово Client должно быть заменено именем клиента, которое обязательно должно соответствовать значению параметра Common Name, вводимого при генерации запроса на сертификат для соответствующего клиента. Возможность дублирования Common Name у нескольких клиентов определяется конфигурацией сервера. Для генерации запроса на сертификат и закрытого ключа, а также подписания запроса на сертификат и генерации сертификата для клиента Client необходимо выполнить следующие команды, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl req -new -nodes -keyout keys/KClient.pem -out req/RClient.pem
openssl ca -batch -config openssl.cnf -out certs/CClient.pem -infiles req/RClient.pem
[/bash]
Для просмотра сгенерированных запроса на сертификат, закрытого ключа и сертификата клиента Client необходимо выполнить следующие команды, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl req -noout -text -in req/RClient.pem    (для запроса на сертификат)
openssl rsa -noout -text -in keys/KClient.pem   (для закрытого ключа)
openssl x509 -noout -text -in certs/CClient.pem (для сертификата)
[/bash]
На данном этапе для рассматриваемого случая необходимо создать три групы, состоящих из запроса на сертификат / закрытого ключа / сертификата, с именами Rclient1 / Kclient1 / Cclient1, Rclient2 / Kclient2 / Cclient2 и Rclient3 / Kclient3 / Cclient3 для филиала № 1 (Common Name – client1), для филиала № 2 (Common Name – client2) и для системного администратора (Common Name – client3), соответственно.

<strong>Создание списка отзыва сертификатов</strong>
Для создания списка отзыва сертификатов необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl ca -config openssl.cnf -gencrl -out crl/crl.pem
[/bash]

Команда ca с ключем -gencrl заставляет <strong>OpenSSL</strong> создать список отзыва сертификатов, ключи: -config рассмотрен выше, -out – задает местонахождение списка отзыва сертификатов. Данная команда создает пустой список отзыва сертификатов. Для того, чтобы отозвать сертификат клиента Client необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl ca -config openssl.cnf -revoke certs/CClient.pem
[/bash]

Команда ca с ключем -revoke заставляет <strong>OpenSSL</strong> отозвать заданный сертификат, ключ -config рассмотрен выше. Для просмотра списка отозванных сертификатов необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openssl crl -noout -text -in crl/crl.pem
[/bash]

<strong>Создание статического ключа HMAC</strong>
Для создания статического ключа <strong>HMAC</strong>, обеспечивающего дополнительную защиту от <strong>DoS-атак</strong> и <strong>флудинга UDP-портов</strong>, необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
[bash]
openvpn --genkey --secret ta.key
[/bash]


Файл конфигурации сервера
По умолчанию конфигурация сервера <strong>OpenVPN</strong> хранится в файле openvpn.conf, который должен находится в папке /usr/local/etc/openvpn. В рассматриваемом случае файл конфигурации имеет следующий вид:
[bash]
dev               tun
local             *Внешний IP-адрес сервера*
port              1194
proto             udp
server            10.0.0.0 255.255.255.0
push              "route 10.0.0.0 255.255.255.0"
route             192.168.1.0 255.255.255.0
route             192.168.2.0 255.255.255.0
client-config-dir ccd
client-to-client
tls-server
dh                /usr/local/etc/openvpn/dh2048.pem
ca                /usr/local/etc/openvpn/CA_cert.pem
cert              /usr/local/etc/openvpn/certs/server.pem
key               /usr/local/etc/openvpn/keys/server.pem
crl-verify        /usr/local/etc/openvpn/crl/crl.pem
tls-auth          /usr/local/etc/openvpn/ta.key 0
comp-lzo
keepalive         10 120
tun-mtu           1500
mssfix            1450
persist-key
persist-tun
user              openvpn
group             openvpn
verb              3
[/bash]      


В данном файле заданы следующие значения параметров сервера OpenVPN: dev – интерфейс OpenVPN, local и port – IP-адрес и порт, на которых OpenVPN принимает входящие соединения, proto – протокол (в данном случае UDP), server – пул IP-адресов, выделенный для виртуальной частной сети и автоматически распределяемый между клиентами, push – команда OpenVPN, передаваемая клиенту и выполняемая клиентом (в данном случае "route 10.0.0.0 255.255.255.0" добавляет на стороне клиента маршрут к виртуальной частной сети), route – добавляет на стороне сервера маршруты к локальным подсетям, находящимся за клиентами, client-config-dir – папка с файлами конфигурации клиентов, client-to-client – разрешение клиентам “видеть” друг друга (естественно, при наличии соответствующих правил маршрутизации), tls-server – включение поддержки TLS; dh – местонахождение файла параметров Диффи-Хэлмана, ca – местонахождение самоподписного доверенного сертификата (CA), cert – местонахождение сертификата сервера, key – местонахождение закрытого ключа сервера, crl-verify – местонахождение списка отзыва сертификатов, tls-auth – местонахождение статического ключа HMAC, comp-lzo – использование LZO-компрессии трафика, keeplive – поддержание соединения (в данном случае отправка пингов каждые 10 секунд, и закрытие соединения через две минуты после отсутствия ответных пакетов, как сервером, так и клиентами), tun-mtu и mssfix – параметры передачи данных по тоннелю, persist-tun – не закрывать / открывать по-новой tun-устройство при получении сигнала SIGUSR1 (перезапуск без привилегий root) или при выполнении ping-restarts, user и group – пользователь и группа, от имени которых работает OpenVPN после запуска (запуск выполняется под root’ом), verb – уровень детализации сообщений, выдаваемых OpenVPN в /var/log/messages.

Файлы конфигурации клиентов
Файлы конфигурации клиентов являются текстовыми файлами и содержат команды, выполняемые сервером при подключении клиентов. Имена файлов конфигурации клиентов должны соответствовать Common Name клиентов, т.е. при подключении клиента с Common Name client1 сервер выполнит команды, заданные в файле client1 и т.д. Файлы конфигурации клиентов должны находиться в папке /usr/local/etc/openvpn/ccd. Для рассматриваемого случая необходимо создать три файла конфигурации клиентов client1-client3:

[bash]
cd /usr/local/etc/openvpn/ccd
touch client1 client2 client3
[/bash]
Файл client1 должен содержать две команды: добавляющую клиенту маршрут к локальной подсети центрального офиса, а также определяющую адрес локальной подсети, находящейся за клиентом:
[bash]
push "route 192.168.0.0 255.255.255.0"
iroute 192.168.1.0 255.255.255.0
[/bash]
Файл client2 аналогичен файлу client1 за исключением адреса локальной подсети, находящейся за клиентом:
[bash]
push "route 192.168.0.0 255.255.255.0"
iroute 192.168.2.0 255.255.255.0
[/bash]
Файл client3 должен содержать команды, добавляющие клиенту маршруты к локальным подсетям центрального офиса и обоих филиалов:
[bash]
push "route 192.168.0.0 255.255.255.0"
push "route 192.168.1.0 255.255.255.0"
push "route 192.168.2.0 255.255.255.0"
[/bash]
Существуют и другие способы задания маршрутов, а также другие команды, которые могут присутствовать в файлах конфигурации клиентов.


<strong>Автоматический запуск сервера</strong>
Для автоматического запуска сервера OpenVPN при загрузке операционной системы необходимо добавить строку <strong>openvpn_enable="YES"</strong> в файл /etc/rc.conf.

<strong>Замечания по настройке брандмауэров</strong>
Для корректной работы сервера OpenVPN необходимо внести следующие изменения в настройки брандмауэра:

<em>Разрешить прохождение любого трафика через интерфейс OpenVPN;
Разрешить прохождение UDP-трафика на внешний адрес сервера порт 1194;
Разрешить прохождение любого трафика из виртуальной частной сети в локальную подсеть;
Разрешить прохождение любого трафика из локальной подсети в виртуальную частную сеть;
Разрешить прохождение любого трафика из локальной подсети филиала № 1 в локальную подсеть;
Разрешить прохождение любого трафика из локальной подсети в локальную подсеть филиала № 1;
Разрешить прохождение любого трафика из локальной подсети филиала № 2 в локальную подсеть;
Разрешить прохождение любого трафика из локальной подсети в локальную подсеть филиала № 2.</em>

Для ipfw (пример) нужно добавить следующие правила:
[bash]
/sbin/ipfw -q add pass ip from any to any via ${vif}
/sbin/ipfw -q add pass udp from any to ${oip} 1194 in via ${oif}
/sbin/ipfw -q add pass ip from ${vnet} to ${inet} out via ${iif}
/sbin/ipfw -q add pass ip from ${inet} to ${vnet} in via ${iif}
/sbin/ipfw -q add pass ip from 192.168.1.0/24 to ${inet} out via ${iif}
/sbin/ipfw -q add pass ip from ${inet} to 192.168.1.0/24 in via ${iif}
/sbin/ipfw -q add pass ip from 192.168.2.0/24 to ${inet} out via ${iif}
/sbin/ipfw -q add pass ip from ${inet} to 192.168.2.0/24 in via ${iif}
[/bash]

Переменные shell имеют следующие значения: oip – внешний IP-адрес сервера, inet – адрес локальной подсети (в нашем случае – 192.168.0.0/24), vnet – адрес виртуальной частной сети (в нашем случае 10.0.0.0/24), iif – имя внутреннего интерфейса сервера (например, rl1), oif – имя внешнего интерфейса сервера (например, rl0), vif – имя интерфейса OpenVPN (например, tun0).
Настройка брандмауэров клиентов выполняется аналогично. Правила, начиная с пятого, зависят от реализованной политики маршрутизации. Для нашего случая правила ipfw для клиента client1 будут иметь вид (не забудьте, что теперь переменная shell inet определяет адрес локальной подсети клиента client1 – 192.168.1.0/24):
[bash]
/sbin/ipfw -q add pass ip from any to any via ${vif}
/sbin/ipfw -q add pass udp from any to ${oip} 1194 in via ${oif}
/sbin/ipfw -q add pass ip from ${vnet} to ${inet} out via ${iif}
/sbin/ipfw -q add pass ip from ${inet} to ${vnet} in via ${iif}
/sbin/ipfw -q add pass ip from 192.168.0.0/24 to ${inet} out via ${iif}
/sbin/ipfw -q add pass ip from ${inet} to 192.168.0.0/24 in via ${iif}
[/bash]

Правила ipfw для клиента client2 не отличаются от правил для клиента client1 (не забудьте, что теперь переменная shell inet определяет адрес локальной подсети клиента client2 – 192.168.2.0/24).

<strong>Клиентское программное обеспечение</strong>
Если клиент работает под FreeBSD, то установка клиента OpenVPN ничем не отличается от установки сервера (используется тот же самый порт), если под Windows, есть два варианта – OpenVPN и OpenVPN GUI. Первый вариант больше подходит для постоянно включенных серверов (OpenVPN может быть установлена как служба Windows), второй – для мобильных клиентов, периодически подключающихся к корпоративной сети. Например, я использую на домашнем ноутбуке OpenVPN GUI, когда мне нужно подключиться к корпоративной сети. Во всех перечисленных случаях файлы конфигурации имеют один и тот же формат. Внимание: в случае использовании Windows-клиентов не забывайте использовать в файлах конфигурации двойные бэкслэши вместо одинарных слэшей, используемых в файлах конфигурации Unix-клиентов.

<strong>Файл конфигурации клиентского программного обеспечения</strong>
Конфигурация клиента OpenVPN хранится в файле openvpn.conf, который должен находится в папке /usr/local/etc/openvpn, если мы имеем дело с FreeBSD-клиентом, или в файле с произвольным именем и расширением .ovpn, который должен находиться в папке C:Program FilesOpenVPNconfig, если при установке OpenVPN (OpenVPN GUI) не был задан путь, отличный от предлагаемого по умолчанию. Рассмотрим файл конфигурации клиента client3, установленного на ноутбук с Windows XP. Клиент OpenVPN GUI установлен в каталог по умолчанию, а ключевые файлы, которые ранее были переписаны на дискету, сохранены на диске P: в папке OpenVPN . Для рассматриваемого случая файл конфигурация клиента OpenVPN имеет следующий вид:
[bash]
client
dev          tun
proto        udp
remote       *IP-адрес сервера OpenVPN8
tls-client   *FQDN сервера OpenVPN*
tls-remote
ca           "P:\\OpenVPN\\CA_cert.pem"
cert         "P:\\OpenVPN\\Ссlient3.pem"
key          "P:\\OpenVPN\\Kсlient3.pem"
tls-auth     "P:\\OpenVPN\\ta.key" 1
ns-cert-type server
comp-lzo
tun-mtu      1500
mssfix       1450
verb         3
[/bash]

В данном файле заданы следующие значения параметров клиента OpenVPN: client – упрощенный вариант указания того, что это файл конфигурации клиента, dev – устройство OpenVPN, proto – протокол (в данном случае UDP), remote – IP-адрес сервера OpenVPN, tls-client – включение поддержки TLS, tls-remote – Common Name сервера OpenVPN, ca – местонахождение самоподписного доверенного сертификата (CA), cert – местонахождение сертификата клиента, key – местонахождение закрытого ключа клиента, tls-auth – местонахождение статического ключа HMAC, comp-lzo, tun-mtu, mssfix и verb рассмотрены выше. Повторяю, файлы конфигурации FreeBSD-клиентов отличаются только форматом задания путей к файлам.

<a href="http://www.sergeysl.ru/freebsd-openvpn-x509/">Источник</a>

Комментариев нет:

Отправить комментарий