OpenVPN
Рассмотрена настройка 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