Установка OpenVPN сервера
Это часть серии статей посвященных соединению территориально разделенных локальных сетей при помощи OpenVPN.
В этой статье рассматривается установка и создание ключей и сертификатов для OpenVPN cервера и клиентов под Debian GNU/Linux. Несмотря на то, что статья написана для описания процесса соединения локальных сетей двух офисов, описанное здесь действия универсальны для любых целей использования OpenVPN.
Установка OpenVPN
Убедитесь, что пакет openvpn уже установлен. Если еще нет, то в Debian его можно установить, например так:
apt-get install openvpn
root@router ~ # apt-get install openvpn Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: liblzo2-2 libpkcs11-helper1 The following NEW packages will be installed: liblzo2-2 libpkcs11-helper1 openvpn 0 upgraded, 3 newly installed, 0 to remove and 2 not upgraded. Need to get 613 kB of archives. After this operation, 1,474 kB of additional disk space will be used. Do you want to continue [Y/n]? Get:1 http://ftp.debian.org/debian/ testing/main liblzo2-2 i386 2.06-1 [66.2 kB] Get:2 http://ftp.debian.org/debian/ testing/main libpkcs11-helper1 i386 1.09-1 [49.2 kB] Get:3 http://ftp.debian.org/debian/ testing/main openvpn i386 2.2.1-3 [497 kB] Fetched 613 kB in 0s (3,450 kB/s) Preconfiguring packages ... Selecting previously unselected package liblzo2-2. (Reading database ... 51278 files and directories currently installed.) Unpacking liblzo2-2 (from .../liblzo2-2_2.06-1_i386.deb) ... Selecting previously unselected package libpkcs11-helper1. Unpacking libpkcs11-helper1 (from .../libpkcs11-helper1_1.09-1_i386.deb) ... Selecting previously unselected package openvpn. Unpacking openvpn (from .../openvpn_2.2.1-3_i386.deb) ... Processing triggers for man-db ... Setting up liblzo2-2 (2.06-1) ... Setting up libpkcs11-helper1 (1.09-1) ... Setting up openvpn (2.2.1-3) ... Restarting virtual private network daemon.:. localepurge: Disk space freed in /usr/share/locale: 0 KiB localepurge: Disk space freed in /usr/share/man: 0 KiB Total disk space freed by localepurge: 0 KiB
Создание сертификатов и ключей для OpenVPN
Для функционирования OpenVPN необходим сертификат сервера и сертификаты клиентов, выпущенные одним Центром Сертификации (Certification Authority, CA), то есть требуется инфраструктура открытых ключей (Public Key Infrastructure, PKI). Самый простой способ получить эти сертификаты, это воспользоваться входящим в пакет набором скриптов easy-rsa на OpenVPN сервере, который будет принимать входящие подключения.
Пакет openvpn предоставляет набор скриптов называющихся easy-rsa. По умолчанию, эти скрипты находятся в каталоге /usr/share/easy-rsa/ . Однако, они должны находится в /etc/openvpn чтобы работать без проблем. Скопируем эти файлы:
cp -R /usr/share/easy-rsa/ /etc/openvpn
Теперь необходимые для настройки OpenVPN PKI файлы теперь находятся в каталоге /etc/openvpn/easy-rsa/ . Они понадобятся для создания ключей и сертификатов.
Настройка переменных для OpenVPN PKI
Чтобы меньше набирать в последующих действиях, стоит внести несколько исправлений в файл /etc/openvpn/easy-rsa/vars . В самом конце файла находится несколько строк определяющих содержимое создаваемых сертификатов. Измените это по своему усмотрению:
export KEY_COUNTRY="RU" export KEY_PROVINCE="YourProvince" export KEY_CITY="YourCity" export KEY_ORG="YourCompany" export KEY_EMAIL="mail@example.com" export KEY_CN="CommonName" export KEY_NAME="KeyName" export KEY_OU="OrganisationUnit"
KEY_CN, т.е. Common Name сертификата необходимо будет указывать свое для каждого сертификата, таким образом стоит оставить это полу пустым, или ввести что-то, что будет в любом сертификате.
Cтрочки:
export PKCS11_MODULE_PATH=changeme export PKCS11_PIN=1234
лучше закоментировать, эти переменные определены выше.
Из необязательного, можно увеличить размер ключа до 2048, изменив 1024 на 2048 в строке:
export KEY_SIZE=1024
но следует помнить, что это увеличит накладные расходы.
Следующие две строки определяют срок действия выдаваемых сертификатов в днях:
# Срок действия сертификата Центра Сертификации export CA_EXPIRE=3650 # Срок действия выпускаемых сертификатов export KEY_EXPIRE=3650
где значение по-умолчанию составляет приблизительно 10 лет, что более чем достаточно.
Инициализируем инфраструктуру открытых ключей (PKI) для OpenVPN
Следующие команды инициализируют Центр Сертификации (CA) и PKI:
cd /etc/openvpn/easy-rsa/ source vars ./clean-all ./build-ca
Последняя команда запустит генерацию сертификата Центра Сертификации (CA), задав предварительно несколько вопросов, на большинство из которых было отвечено при внесении изменений в файл /etc/openvpn/easy-rsa/vars . Лишь Common Name сертификата должно быть уникальным.
root@router1 ~ # cd /etc/openvpn/easy-rsa/ root@router1 /etc/openvpn/easy-rsa # source vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys root@router1 /etc/openvpn/easy-rsa # ./clean-all root@router1 /etc/openvpn/easy-rsa # ./build-ca Generating a 1024 bit RSA private key ...........................................++++++ .++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [RU]: State or Province Name (full name) [YourProvince]: Locality Name (eg, city) [YourCity]: Organization Name (eg, company) [YourCompany]: Organizational Unit Name (eg, section) [OrganisationUnit]: Common Name (eg, your name or your server's hostname) [CommonName]:CompanyOpenVPNRCA Name [KeyName]:CompanyOpenVPNRCA Email Address [mail@example.com]:
В результате будет сгенерировано два файла: ca.crt с сертификатом центра сертификации и ca.key с приватным ключом. Важно убедиться, что права на чтение приватного ключа есть только у root. Это ключ центра сертификации, и он не должен быть скомпрометирован, иначе придется перевыпустить все сертификаты, так как злоумышленник завладевший таким сертификатом сможет подключиться к OpenVPN серверу.
Создание сертификата сервера OpenVPN
Выпуск сертификата сервера выполняется при помощи команды:
./build-key-server server
по-умолчанию, Common Name сертификата будет server, что в большинстве случаев очень неудобно, и стоит установить Common Name, например, в FQDN имя OpenVPN сервера. Дополнительно запрашиваемые challenge password и optional company name оставьте пустыми.
root@router1 /etc/openvpn/easy-rsa # ./build-key-server router1.example.com Generating a 1024 bit RSA private key .................++++++ .........++++++ writing new private key to 'router1.example.com.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [RU]: State or Province Name (full name) [YourProvince]: Locality Name (eg, city) [YourCity]: Organization Name (eg, company) [YourCompany]: Organizational Unit Name (eg, section) [OrganisationUnit]: Common Name (eg, your name or your server's hostname) [router1.example.com]: Name [KeyName]:router1.example.com Email Address [mail@example.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'RU' stateOrProvinceName :PRINTABLE:'YourProvince' localityName :PRINTABLE:'YourCity' organizationName :PRINTABLE:'YourCompany' organizationalUnitName:PRINTABLE:'OrganisationUnit' commonName :PRINTABLE:'router1.example.com' name :PRINTABLE:'router1.example.com' emailAddress :IA5STRING:'mail@example.com' Certificate is to be certified until Jan 31 21:33:25 2022 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
В результате будет создано три файла router1.example.com.csr c кодом запроса сертификата, router1.example.com.key с приватным ключом сертификата и router1.example.com.crt с выпущенным сертификатом. Также важно убедится, что файл с приватным ключом доступен на чтение только для root. Это ключ и сертификат сервера OpenVPN.
Создание сертификатов клиентов
Сертификаты клиентов выпускаются аналогично:
./build-key client1
вместо client1 укажите уникальный идентификатор клиентского подключения. Каждое клиентское подключение должно иметь свой уникальный ключ с уникальным именем. Вся остальная информация может быть одинаковой. Пользователей можно будет добавить в любое время.
root@router1 /etc/openvpn/easy-rsa # ./build-key user_office2 Generating a 1024 bit RSA private key ...++++++ ...............................++++++ writing new private key to 'user_office2.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [RU]: State or Province Name (full name) [YourProvince]: Locality Name (eg, city) [YourCity]: Organization Name (eg, company) [YourCompany]: Organizational Unit Name (eg, section) [OrganisationUnit]: Common Name (eg, your name or your server's hostname) [user_office2]: Name [KeyName]:user_office2 Email Address [mail@example.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'RU' stateOrProvinceName :PRINTABLE:'YourProvince' localityName :PRINTABLE:'YourCity' organizationName :PRINTABLE:'YourCompany' organizationalUnitName:PRINTABLE:'OrganisationUnit' commonName :T61STRING:'user_office2' name :T61STRING:'user_office2' emailAddress :IA5STRING:'mail@example.com' Certificate is to be certified until Jan 31 21:50:09 2022 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
В результате будет создано три файла user_office2.csr c кодом запроса сертификата, user_office2.key с приватным ключом сертификата и user_office2.crt с выпущенным сертификатом. Также важно убедится, что файл с приватным ключом доступен на чтение только для root. Это ключ и сертификат клиента сервера OpenVPN.
Генерация Diffie Hellman параметров
Diffie Hellman параметры определяют метод авторизации и обмена ключами используемый OpenVPN сервером. Следующая команда создает эти параметры:
./build-dh
И да, это может длиться относительно долго.
root@router1 /etc/openvpn/easy-rsa # ./build-dh Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time .........+............+............................................................. ...................+............................................................+... .......................+............................................................ ..............+...............+..................................................... .............+................+.............................................+....... .............................+..................................+................... ........................................................+........................+.. +.................................+....................................+............ .................................................................+.................. .............................................+...+.................................. ...............+.................................................................... .................................................................................... .............................++*++*++*
Перемещение ключей
Все созданные ключи и сертификаты сейчас находятся в каталоге /etc/openvpn/easy-rsa/keys/ . Их необходимо переместить.
Серверу OpenVPN понадобится сертификат центра сертификации, сертификат и ключ сервера а также параметры Diffie Hellman. В случае вышеописанного примера, это файлы:
ca.crt dh1024.pem router1.example.com.crt router1.example.com.key
Эти файлы необходимо скопировать в каталог /etc/openvpn/ на этом же хосте:
cd /etc/openvpn/easy-rsa/keys cp ca.crt dh1024.pem router1.example.com.crt router1.example.com.key /etc/openvpn
На клиентский хост, который будет выполнять подключение к серверу OpenVPN необходимо скопировать приватный ключ и сертификат клиента, а также сертификат центра сертификации. В случае вышеописанного примера, это файлы:
ca.crt user_office2.crt user_office2.key
Обратите внимание, приватный ключ центра сертификации копировать не следует! Мало того, в случае если произойдет утечка приватного ключа центра сертификации, то будет необходимо перевыпустить все сертификаты.
Продолжение: Настройка сервера и клиента OpenVPN.
В openvpn.conf раскомментировать нужный сервер для подключения и обновить линию «прото»:
-TCP, когда порт 443 используется
-UDP, когда порт 123 используется