OpenVPN

Материал из ALT Linux Wiki
Версия от 17:38, 26 августа 2015; RabochyITs (обсуждение | вклад) (/Создание ключей средствами openssl утилиты; требует доработки и редактирования опытными тестерами/)

Рассмотрена настройка OpenVPN в режиме "server" на сервере Altlinux P7 с SysVinit. В случае systemd есть отличия.

Пакеты

openvpn - полнофункциональное решение VPN на базе SSL

Размещение файлов

  • /var/lib/openvpn/ — Корневой каталог после инициализации демона (chroot).
    • /var/lib/openvpn/etc/openvpn/ccd — Каталог, в котором размещаются файлы особых параметров для подключаемых клиентов (Client Config Directory).
    • /var/lib/openvpn/cache — Рабочий каталог, является текущим для работы демона после инициализации (в него демон записывает файлы, у которых не указан путь - ipp и status).
  • /etc/openvpn/ — Каталог с файлами настройки.
    • /etc/openvpn/ccd — Символическая ссылка на /var/lib/openvpn/etc/openvpn/ccd (файлы доступны и до, и после chroot).
    • /etc/openvpn/keys/ — Каталог для хранения ключей (точнее, для информации ограниченного доступа)

Особенности работы и конфигурации

Каждый файл конфигурации по маске /etc/openvpn/*.conf является конфигурацией отдельного экземпляра демона openvpn. Для имени экземпляра берётся имя файла без суффикса ".conf".

Настройки стартового скрипта располагаются в файле /etc/sysconfig/openvpn, по умолчанию он устанавливает следующие переменные окружения:

CHROOT=yes
OPENVPNUSER=openvpn
OPENVPNGROUP=openvpn
MANUAL=""

Стартовый скрипт /etc/init.d/openvpn может запускать и останавливать как все экземпляры демона, так и каждый по отдельности. Значение переменной MANUAL в /etc/sysconfig/openvpn указывает экземпляры, которые нужно запустить при старте системы (и при запуске стартового скрипта без параметра).

Для ручного запуска (остановки, проверки) одного экземпляра в конце командной строки указываем имя экземпляра. Например:

[root@kuvepus openvpn]# service openvpn start server
Adjusting environment for openvpn:                                                                                                                                                            [ DONE ]
Starting openvpn service:                                                                                                                                                                     [ DONE ]
[root@kuvepus openvpn]# service openvpn status client-one
openvpn is stopped


Когда запускаем сервис, демон openvpn запускается, читает файл конфигурации из /etc/openvpn/, читает оттуда же файлы dh, ca и ключи. Этот каталог доступен демону только при его запуске.

Дальше демон выполняет chroot в /var/lib/openvpn/ и cd в /var/lib/openvpn/cache, понижает привилегии до пользователя openvpn, затем инициализирует работу с сетью.

Таким образом, файл конфигурации размещаем в /etc/openvpn, все ключи размещаем в /etc/openvpn/keys, файлы настроек клиентов - в /etc/openvpn/ccd/ или /var/lib/openvpn/etc/openvpn/ccd/. В файле конфигурации указываем

  • ifconfig-pool-persist и status — без полного пути либо с путём /cache/
  • ca, dh, cert, key — с путём /etc/openvpn/keys/
  • client-config-dir /etc/openvpn/ccd
Совет.

Если нужны несколько экземпляров сервера openvpn, файлы в параметрах status и ifconfig-pool-persist указывайте разные, например, с именем экземпляра в префиксе.

Пример

$ cat /etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca   /etc/openvpn/keys/admin.ca
dh   /etc/openvpn/keys/dh4096.pem
cert /etc/openvpn/keys/server.crt
key  /etc/openvpn/keys/server.key
comp-lzo
server 192.168.254.0 255.255.255.0
tls-server
cipher AES-256-CBC
verb 3
mute 10
keepalive 10 60
user nobody
group nogroup
persist-key
persist-tun
status server_status.log
ifconfig-pool-persist server_ipp.txt
verb 3
management localhost 1194
push "route 192.168.1.0 255.255.255.0"
client-config-dir /etc/openvpn/ccd
route 192.168.2.0 255.255.255.0
route 192.168.3.0 255.255.255.0

Создание ключей

Создание ключей для OpenVPN тунеля средствами openssl утилиты.

Наличие в системе установленного пакета.

rpm -qa openssl
openssl-1.0.1k-alt3.M70P.1

Открываем файл /var/lib/ssl/openssl.cnf и меняем значение параметра policy на: policy = policy_anything Это для того, чтобы можно было подписывать любые сертификаты. После чего создаем следующие папки и файлы:

mkdir -p /root/CA/demoCA
cd /root/CA - далее все команды вводим находясь в данном каталоге /root/CA
mkdir -p ./demoCA/newcerts
touch ./demoCA/index.txt - текстовый файл база с действующими и отозванными сертификатами
echo '01' > ./demoCA/serial - файл индекса для базы ключей и сертификатов
echo '01' > ./demoCA/crlnumber - файл индекса для базы отозванных сертификатов

(без этого OpenSSL будет сильно ругаться, ответ кроется в файле /var/lib/ssl/openssl.cnf ).

less /var/lib/ssl/openssl.cnf   - посмотреть файл (выход q)

Создадим "самоподписанный" сертификат my-ca.crt и закрытый ключ my-ca.pem, которыми мы будем заверять/подписывать ключи и сертификаты клиентов, желающих подключиться к нашему серверу.

openssl req -new -x509 -keyout my-ca.pem -out my-ca.crt

Generating a 2048 bit RSA private key
..................................................+++
................................................................................+++
writing new private key to 'my-ca.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
…
-----
Country Name (2 letter code) [RU]:RU
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (e.g., your name or your server's hostname) []:CA-ORG
Email Address []:

Подробнее:

  • -req - запрос на создание сертификата,
  • -x509 - создать самоподписанный сертификат стандарта X.509,
  • -keyout - записать закрытый ключ в файл,
  • -out - записать сертификат в файл.

В процессе создания, первым делом, нам предложат ввести пароль для закрытого ключа (крайне важно). Придумываем пароль, вводим, подтверждаем. Далее, будет задано несколько вопросов о том, кто мы такие. Вводим международное обозначение страны, например RU, UA, CN, далее указываем регион, город/село/деревню, название нашей организации, свои ФИО, адрес электронной почты. Все. Наш корневой "самоподписанный" сертификат готов к употреблению.

Далее, нам потребуется создать пару "ключ-сертификат" для сервера и каждого клиента, желающего подключиться к нашему серверу.

Создание ключа и запроса на подпись для сервера:

openssl req -new -nodes -keyout server.pem -out server.crs

Generating a 2048 bit RSA private key
......................+++
..........................................+++
writing new private key to 'server.pem'
-----
...
-----
Country Name (2 letter code) [RU]:RU
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (e.g., your name or your server's hostname) []:vpn-server
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
  • -nodes - означает, что шифровать закрытый ключ не нужно (иначе при каждом запуске туннеля надо будет вводить пароль на ключ).

Так же вводим описание для владельца ключа, как и ранее.

И подписываем запрос на сертификат своим "самоподписанным" my-ca.crt сертификатом и ключом my-ca.pem:

openssl ca -cert my-ca.crt -keyfile my-ca.pem -days 3650 -in server.crs -out server.crt
Using configuration from /var/lib/ssl/openssl.cnf
Enter pass phrase for my-ca.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Aug 26 11:58:11 2015 GMT
            Not After : Aug 23 11:58:11 2025 GMT
        Subject:
            countryName               = RU
            commonName                = vpn-server
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                FA:E5:0B:67:9A:B9:03:18:8F:13:D1:30:FB:63:21:A1:83:8D:99:0C
            X509v3 Authority Key Identifier:
                keyid:65:29:B0:0A:8A:93:AA:4C:68:77:9F:6F:AF:FF:E8:FA:6B:11:27:BA

Certificate is to be certified until Aug 23 11:58:11 2025 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
  • -cert, корневой сертификат удостоверяющего центра
  • -keyfile, секретный ключ удостоверяющего центра

Отвечаем два раза положительным "игреком" (y), в итоге, получаем связку "ключ-сертификат" для сервера server.

Теперь генерируем запрос на сертификат для пользователя:

openssl req -new -nodes -keyout user_1.pem -out user_1.crs

И подписываем запрос на сертификат своим "самоподписанным" my-ca.crt сертификатом и ключом my-ca.pem:

openssl ca -cert my-ca.crt -keyfile my-ca.pem -days 365 -in user_1.crs -out user_1.crt

Отвечаем два раза положительным "игреком" (y), в итоге, получаем связку "ключ-сертификат" для пользователя user_1.

Последние действие - создание параметров Диффи-Хеллмана (исключительно для сервера):

openssl gendh -out server.dh 2048

Файлы запросов на сертификаты можно удалить:

rm  *.crs

В результате в каталоге /root/CA должен получиться такой набор файлов:

ls -l
итого 40
drwxr-xr-x 3 root root 4096 авг 26 15:07 demoCA
-rw-r--r-- 1 root root 1123 авг 26 14:47 my-ca.crt
-rw-r--r-- 1 root root 1834 авг 26 14:47 my-ca.pem
-rw-r--r-- 1 root root 4202 авг 26 14:58 server.crt
-rw-r--r-- 1 root root  424 авг 26 15:14 server.dh
-rw-r--r-- 1 root root 1708 авг 26 14:52 server.pem
-rw-r--r-- 1 root root 4190 авг 26 15:07 user_1.crt
-rw-r--r-- 1 root root 1708 авг 26 15:05 user_1.pem

Разносим ключи и сертификаты по каталогам сервера и клиента.

  • my-ca.crt - для сервера и клиентов
  • my-ca.pem - только для подписи сертификатов, лучше хранить на отдельном от OpenVPN сервера компьютере
  • my-ca.crt, server.crt, server.dh, server.pem - для сервера OpenVPN
  • my-ca.crt, user_1.crt, user_1.pem - для клиента OpenVPN

Для новых клиентов создать новые ключи и отдать комплектом my-ca.crt, новый_сертификат.crt, новый_ключ.pem.

В конфигурационном файле OpenVPN сервера размещаем ссылку на эти ключи (пути до ключей подставляем свои) :

ca   /root/CA/my-ca.crt
cert /root/CA/server.crt
key  /root/CA/server.pem
dh   /root/CA/server.dh

В конфигурационном файле OpenVPN клиента размещаем ссылку на эти ключи (пути до ключей подставляем свои):

ca   /etc/net/ifaces/tun0/my-ca.crt
cert /var/lib/ssl/certs/user_1.crt
key  /var/lib/ssl/private/user_1.pem

Смотрим базу ключей:

cat  /root/CA/demoCA/index.txt
V       250823115811Z           01      unknown /C=RU/CN=vpn-server
V       160825120737Z           02      unknown /C=RU/CN=user_1
  • v- действующий ключ (валидный)

Создание списка отзыва сертификатов

Для создания списка отзыва сертификатов необходимо выполнить следующую команду:

openssl ca -cert my-ca.crt -keyfile my-ca.pem -gencrl -out crl.pem

Просмотр crl.pem:

openssl crl -noout -text -in crl.pem

Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: /C=RU/CN=CA-ORG
        Last Update: Aug 26 13:19:40 2015 GMT
        Next Update: Sep 25 13:19:40 2015 GMT
        CRL extensions:
            X509v3 CRL Number:
                1
No Revoked Certificates.
    Signature Algorithm: sha1WithRSAEncryption
         32:b5:de:eb:99:3c:30:7f:0d:11:7c:80:39:36:0d:d7:35:72:
         a3:6b:e8:b3:8f:de:3f:77:06:27:e0:68:ea:5c:25:ea:3d:92:
         22:6e:d9:8a:11:28:4a:82:f4:95:cf:db:6c:51:f6:b1:f1:ca:
         1e:34:a2:b6:21:18:a1:84:96:13:90:db:94:bc:a5:f3:19:5d:
         cb:09:df:49:b8:2d:3b:4f:23:3b:04:e3:fd:49:5b:1b:35:19:
         ce:a5:c4:2b:61:c4:58:70:94:32:8f:2a:85:ed:fb:d5:21:da:
         8c:f1:29:0d:51:fb:22:17:fa:6b:21:37:81:b6:0d:cf:c9:8a:
         f9:19:a4:aa:d1:cd:33:6c:b7:eb:a3:bf:0d:5c:d7:87:e4:a5:
         34:2e:2c:29:e2:86:50:8d:5d:80:ac:7f:bd:8d:34:5a:20:e9:
         f2:cc:77:d7:97:a3:14:3a:39:ab:14:5b:1c:67:23:76:19:b7:
         31:15:4b:88:f2:cd:4a:4b:63:a6:ab:de:4d:7f:7d:23:49:1b:
         a1:36:c4:9f:62:86:6a:f2:77:22:cd:ff:73:ff:4c:b3:f0:c8:
         a7:68:4e:7e:26:a6:5f:55:4e:25:aa:7c:e8:e2:38:63:3a:d6:
         15:76:02:8d:22:00:94:87:72:5d:e1:ed:44:35:7b:02:c6:bb:
         9f:f2:76:0e

Отозвать серификат user_1.crt:

openssl ca -cert my-ca.crt -keyfile my-ca.pem -revoke user_1.crt -out crl.pem

Using configuration from /var/lib/ssl/openssl.cnf
Enter pass phrase for my-ca.pem:
Revoking Certificate 02.
Data Base Updated

Обновить список (обязательно после каждого отзыва сертификата):

openssl ca -cert my-ca.crt -keyfile my-ca.pem -gencrl -out crl.pem

Просмотр crl.pem:

openssl crl -noout -text -in crl.pem

Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: /C=RU/CN=CA-ORG
        Last Update: Aug 26 13:30:36 2015 GMT
        Next Update: Sep 25 13:30:36 2015 GMT
        CRL extensions:
            X509v3 CRL Number:
                3
Revoked Certificates:
    Serial Number: 02
        Revocation Date: Aug 26 13:28:05 2015 GMT
    Signature Algorithm: sha1WithRSAEncryption
         55:eb:cb:99:6e:01:e5:47:77:69:fc:ca:8b:d7:d0:8d:a2:5a:
         2f:90:93:71:f7:d1:70:16:75:eb:99:fa:4a:8a:43:e9:79:7d:
         43:f1:82:ac:7f:46:df:41:3b:39:59:ac:bc:5d:e1:79:85:03:
         7d:72:cb:65:c8:2e:7c:54:ec:67:07:7d:3a:08:8b:87:64:b4:
         7b:b7:dd:1c:a2:44:b1:ad:e5:76:fd:a3:10:b3:a7:81:fd:05:
         34:3f:eb:20:66:d2:7d:77:a0:e5:79:f8:88:10:e5:bb:95:d8:
         f0:d2:92:c2:ae:0f:42:2b:34:09:f5:3d:73:7d:c8:42:ea:7b:
         dc:d9:3f:c2:f2:a8:8d:63:77:3d:89:37:0b:50:70:7e:0d:c2:
         66:a5:03:61:b8:5e:25:98:9a:42:93:cf:38:74:3e:d3:a3:5c:
         2f:6c:76:52:6c:c6:0e:24:72:71:40:34:98:06:50:08:a9:8f:
         8f:66:05:3c:c2:f5:55:fe:14:d6:01:44:99:c2:8d:ce:41:c3:
         42:1e:3f:8b:c0:7f:07:44:51:bd:1d:eb:bf:ca:6d:fa:31:77:
         f1:f5:69:30:11:b1:35:58:53:05:e2:7c:90:34:66:a1:58:1d:
         78:ef:84:8b:22:23:d0:71:8f:84:9d:f7:53:f9:81:96:01:03:
         60:73:1b:b2

Для AltLinux файл crl.pem поместить в каталог /var/lib/openvpn