Настраиваем VPN на Linux. Часть 1. Сертификационный центр

Предположим, вы не доверяете VPN-сервисам, либо вас не устраивают высокие тарифы, либо хотите иметь полный контроль над сервером, с возможностью подключать сколько угодно клиентом и использовать любые протоколы. Для вас и предназначен данный раздел! Здесь мы рассмотрим процесс настройки VPN-сервера на Linux, на машине с Debian 7 64bit на борту и OpenVPN, в качестве реализации.

Процесс настройки VPN вручную состоит из нескольких этапов:

  1. Организация сертификационного центра
  2. Настройка VPN-сервера, выдача сертификата
  3. Настройка VPN клиента/ов, выдача сертификататов

Прежде всего стоит сказать, две вещи:

  1. Мы выбрали наиболее простой метод настройки – не идеальный, в плане безопасности, но чуть более универсальный и быстрый в развертывании. В любом случае, в конце данного руководства вы получите защищенную VPN-сеть, которую, при легком “допиливании напильником” можно подстроить под любые потребности и к которой легко подключать новых клиентов (ведь для большинства пользователей, это приоритет).
  2. Всё же, отдавая предпочтение самостоятельной настройке, вы теряете в географической гибкости – быстро менять IP не получится (хотя, при наличии нескольких серверов, клиент легко может между ними переключаться).

Разворачиваем сертификационный центр

Настройка VPN начинается с построения (Public Key Infrastructure) на основе x.509 сертификатов и открытых ключей - это программный комплекс, включающий в себя сам СА со списком отзыва сертификатов и софт для генерации ключей. Выдавать сертификаты можно несколькими способами:

  1. Безопасный метод Создается PKI и сертификационный центр, аналогичный софт ставится на машины клиентов. Чтобы получить сертификат, клиент должен сформировать запрос и закрытый ключ – запрос передается СА – СА подписывает его или отклоняет – подписанный сертификат передается клиенту. Передача происходит вручную, или по защищенным каналам.
  2. Сертификационный центр самостоятельно генерирует закрытый ключ и сертификат, или оные вместе в зашифрованном пакете PKCS12 - пакет передается на машину клиента — клиент может подключаться к VPN.

Мы говорили об этом выше, но повторим – сертификаты и ключи нужны для ограничения круга лиц, имеющих доступ к серверу; передавать закрытые ключи по сети крайне нежелательно (по крайней мере, в незашифрованном виде), открытый ключ распространяется свободно и математически связан с закрытым - он служит для расшифровки данных, зашифрованных закрытым ключом. А сертификаты объединяют в себе функции открытого ключа и подтверждают, что такой-то ключ принадлежит такому-то хосту, действует столько-то, и с этим ключом можно получить доступ к серверу. Проще говоря, x.509 сертификат – это улучшенный открытый ключ из философии ассиметричного шифрования.

Для настройки OpenVPN потребуется пакет openvpn – он лежит в репозиториях большинства Linux-систем.

 

# apt-get update

# apt-get install openvpn

 

После установки, по пути “/usr/share/doc/openvpn/examples/” должна появиться директива /easy-rsa/2.0. Если её нет - дополнительно установите пакет easy-rsa:

 

# apt-get install easy-rsa

 

И тогда нужная папка появится по пути “/ush/share/easy-rsa”

Настройку СА не стоит производить из под root [в идеале - это вообще должна быть отдельная машина, не подключенная к сети], но так как в нашем случае СА и VPN-сервер – одна и та же машина, то будем работать под root. В противном случае, лучше создать для СА отдельного пользователя без рутовых прав.

 

# useradd - s /bin/bash -m ca

# passwd ca [passwd]

# su ca

 

Дабы избежать удаления всех конфигов при очередном обновлении, перенесем утилиту easy-rsa в директиву конфигов openvpn:

 

# sudo cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn

 

Или:

 

# sudo cp -R /usr/share/easy-rsa/ /etc/openvpn

 

И перейдем в директорию easyrsa:

 

# cd /etc/openvpn/easy-rsa/2.0

 

vpnlinux 1

В данной директории лежат скрипты для генерации сертификатов и формирования запросов на сертификаты, примеры конфига openssl, и главное – подробный файл README, объясняющий, как это всё работает. Распакуйте его утилитой gzip:

 

# gzip -d README.gz

 

И, желательно, изучите.

vpnlinux 2

Файл vars – своеобразный шаблон, на основании которого заполняются поля сертификатов – его мы и отредактируем в первую очередь. Нас интересуют лишь следующие строки:

 

# Битовая длина алгоритма шифрования, которым шифруется закрытый ключ. Если вы параноик – измените значение на 2048 – это замедлит взлом, но и скорость VPN-соединения слегка упадет.

export KEY_SIZE=1024

 

# Срок годности в днях по умолчанию, для корневого сертификата сертификационного центра.

export CA_EXPIRE=3650

 

# Срок годности по умолчанию для всех сертификатов.

# Не рекомендуется вписывать слишком большое значение

export KEY_EXPIRE=3650

 

# Информация о владельце сертификата. Ни на что, особо, не влияет, если вы разворачиваете сеть VPN для себя.

export KEY_COUNTRY="RU" #Код страны владельца

export KEY_PROVINCE="RU" #Код области владельца

export KEY_CITY="Moscow" #Город

export KEY_ORG="cs-companion" #Организация

export KEY_EMAIL=" Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. " #контактный email

export KEY_EMAIL= Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. #контактный email 2

 

Сохраним, применим изменения и очистим папку .keys скриптом ./clean-all:

 

source ./vars

source ./clean-all

 

(Важно: если после изменений файл vars не запускается – сделайте его исполняемым: “chmod +x ./vars”)

Шаблон готов – можно создавать корневой сертификат СА, и на его основе создавать сертификаты остальных пользователей. Для генерации корневого сертификата выполним:

 

# ./build-ca

 

vpnlinux 3

Во время генерации вам предложат самостоятельно заполнить поля, хотя можно просто жать Enter – тогда они заполнятся на основании шаблона.

Итак, после генерации в папке ./keys появилось два ключа:

  • ca.crt - открытый
  • ca.key - закрытый.

Наверняка вам будет интересно, как же выглядит этот сертификат изнутри – как-то так:

vpnlinux 4

Или на человеческом:

vpnlinux 5

Посмотреть содержимое сертификата в виде текста можно средствами openssl, вот такой командой:

 

# openssl x509 -in [путь/к/сертификату] -noout -text

 

В сгенерированный нами сертификат входит:

  1. Версия
  2. Уникальный серийный номер
  3. Информация о держателе (организация, имя, контакты).
  4. Сроки начала и конца действия сертификата
  5. Информация о использумых алгоритмах.
  6. Открытый ключ
  7. Хэш
  8. Цифровая подпись сертификата

Информация о личности издателя и держателя – лишь дополнения, необходимые в крупных VPN-сетях и сертификатах, имеющих вес за пределами ваших сетей – без них сертификат всё ещё остается рабочим.

Немного теории.

Файл ca.key должен лежать только на машине самого сертификационного центра, а вот открытый - напротив, должен передаваться на каждую машину, которая собирается сделать запрос на сертификат и затем получить доступ к VPN-серверу.

Попробуем объяснить, как это работает:

У СА есть свой сертификат и закрытый ключ. С помощью закрытого ключа трафик шифруется, с помощью открытого – расшифровывается – это значит, что у VPN-сервера должен быть:

  1. свой открытый и закрытый ключ
  2. открытый ключ СА
  3. открытые ключи всех клиентов,

У СА должен быть:

  1. свой закрытый и открытый ключ,
  2. открытый ключ сервера и всех клиентов.

А у всех клиентов, которые будут взаимодействовать с сервером:

  1. свои закрытые и открытые ключи
  2. открытый ключ сервера и СА

Но всё это – в идеале, то есть в случае, если сертификаты выдаются по запросу. Мы же используем протокол PKCS12, значительно упрощающий развертывание OpenVPN сети — пакеты с сертификатами мы будем генерировать самостоятельно, а клиенту нужно только прописать путь к нему в конфигах, и IP-адрес сервера.

###

 

Сертификационный центр готов, теперь сгенерируем сертификат для самого сервера:

 

# ./build-key-server [имя-сертификата-сервера]

 

Во время генерации, вас попросят ввести пароль, которым будем защищен закрытый ключ сервера – запомните его, ведь он вам ещё понадобится.

Помимо ключей, OpenVPN использует дополнительные средства защиты – хэш-суммы и протокол Диффи-Хеллмана. Не будем углублятся в теорию работы второго – просто сгенерируйте одноименный файл командой:

 

./build-dh

 

vpnlinux 6

Итак, вернемся в папку ./keys, и что мы видим:

vpnlinux 7

  1. dh1024.pem - Файл Диффи-Хеллмана
  2. ca.crt – открытый ключ (сертификат) СА
  3. ca.key – закрытый ключ СА
  4. vpnserver.key – закрытый ключ сервера
  5. vpnserver.crt – сертификат сервера.

Все они, кроме закрытого ключа СА, должны быть перемещены в главную директорию VPN-сервера - /etc/openvpn.

vpnlinux 8

Если вы дошли до этого этапа – значит наш СА работает как часы. Следующим шагом будет настройка самого VPN-сервера и клиентов, а пока подробнее остановимся на том, как генерировать и удалять сертификаты.

Работа с CRL и выдача сертификатов.

Как генерировать сертификаты:

 

build-key [имя] – сгенерировать пару закрытый/открытый сертификат.

build-key-pass [имя] – аналогично, но сертификат защищен паролем, который спрашивается каждый раз при использовании.

build-key-pkcs12 – сгенерировать сертификаты в виде pkcs12-пакета.

 

Что же такое этот pkcs12-пакет? Цитируя руководство openssl - “Some would argue that the PKCS#12 standard is one big bug :-)” - и, тем не менее, это наиболее удобный способ распространения сертификатов. Как уже говорилось – это своеобразный пакет, зашифрованный на стороне сервера, и включающий в себя связку сертификатов – открытый СА; закрытый и открытый клиента. Поступая к клиенту, софт OpenVPN посылает с ним запрос на VPN-сервер, а сервер, если такой пакет был сгененерирован подходящим центром сертификации, распознает его и пускает клиента в свою сеть. С p12 пакетами вы получаете дополнительный слой шифрования пакетов и больше нет необходимости пересылать каждый сертификат отдельно.

vpnlinux 9

Сгенерируем такой пакет для нашего клиента:

 

# ./build-key-pkcs12 lain.iwakura.Vorona

 

vpnlinux 10

Во время генерации вы должны ввести пароли [пароль закрытого ключа и пароль экспорта], последний из которых будет спрашиваться при каждом подключении, а также заполнить данные сертификата. После этого – можно передавать пакет на машину клиента - отправим пакет lain.iwakura.Vorona.p12 на машину клиента под Arch Linux, через scp.

 

# scp ./keys/lain.iwakura.Vorona.p12 user@ip:/home/

 

Позже, при настройке клиента, он нам понадобится.

Как отзывать сертификаты

Выполните “./list-crl” - результатом выполнения будет создание списка отзыва сертификатов – CRL. CRL необходим для того, чтобы администратор СА смог в любой момент запретить какому-либо хосту доступ к серверу со своим сертифкатом.

Отозвать сертификат предельно просто – командой:

 

./revoke-full [имя]

 

К примеру, сгенерируем pkcs12 сертификат iwakuralain и тут же отзовем:

 

./revoke-full iwakuralain

 

vpnlinux 11

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

 

./list-crl

 

vpnlinux 12

А самой базой данных отозванных сертификатов является файл crl.pem из папки keys. После отзыва очередного сертификата необходимо скопировать его в папку /etc/openvpn VPN-сервера и перезагрузить, для обновления базы данных:

 

# /etc/init.d/openvpn restart  

Компьютерный портал "Компаньон" © 2016.
В случае перепечатки материалов обязательна прямая ссылка на сайт cs-companion.ru.