Настраиваем VPN на Linux. Часть 1. Сертификационный центр
- Подробности
- Опубликовано 01.10.2016 01:52
Предположим, вы не доверяете VPN-сервисам, либо вас не устраивают высокие тарифы, либо хотите иметь полный контроль над сервером, с возможностью подключать сколько угодно клиентом и использовать любые протоколы. Для вас и предназначен данный раздел! Здесь мы рассмотрим процесс настройки VPN-сервера на Linux, на машине с Debian 7 64bit на борту и OpenVPN, в качестве реализации.
Процесс настройки VPN вручную состоит из нескольких этапов:
- Организация сертификационного центра
- Настройка VPN-сервера, выдача сертификата
- Настройка VPN клиента/ов, выдача сертификататов
Прежде всего стоит сказать, две вещи:
- Мы выбрали наиболее простой метод настройки – не идеальный, в плане безопасности, но чуть более универсальный и быстрый в развертывании. В любом случае, в конце данного руководства вы получите защищенную VPN-сеть, которую, при легком “допиливании напильником” можно подстроить под любые потребности и к которой легко подключать новых клиентов (ведь для большинства пользователей, это приоритет).
- Всё же, отдавая предпочтение самостоятельной настройке, вы теряете в географической гибкости – быстро менять IP не получится (хотя, при наличии нескольких серверов, клиент легко может между ними переключаться).
Разворачиваем сертификационный центр
Настройка VPN начинается с построения (Public Key Infrastructure) на основе x.509 сертификатов и открытых ключей - это программный комплекс, включающий в себя сам СА со списком отзыва сертификатов и софт для генерации ключей. Выдавать сертификаты можно несколькими способами:
- Безопасный метод Создается PKI и сертификационный центр, аналогичный софт ставится на машины клиентов. Чтобы получить сертификат, клиент должен сформировать запрос и закрытый ключ – запрос передается СА – СА подписывает его или отклоняет – подписанный сертификат передается клиенту. Передача происходит вручную, или по защищенным каналам.
- Сертификационный центр самостоятельно генерирует закрытый ключ и сертификат, или оные вместе в зашифрованном пакете 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
В данной директории лежат скрипты для генерации сертификатов и формирования запросов на сертификаты, примеры конфига openssl, и главное – подробный файл README, объясняющий, как это всё работает. Распакуйте его утилитой gzip:
# gzip -d README.gz
И, желательно, изучите.
Файл 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
Во время генерации вам предложат самостоятельно заполнить поля, хотя можно просто жать Enter – тогда они заполнятся на основании шаблона.
Итак, после генерации в папке ./keys появилось два ключа:
- ca.crt - открытый
- ca.key - закрытый.
Наверняка вам будет интересно, как же выглядит этот сертификат изнутри – как-то так:
Или на человеческом:
Посмотреть содержимое сертификата в виде текста можно средствами openssl, вот такой командой:
# openssl x509 -in [путь/к/сертификату] -noout -text
В сгенерированный нами сертификат входит:
- Версия
- Уникальный серийный номер
- Информация о держателе (организация, имя, контакты).
- Сроки начала и конца действия сертификата
- Информация о использумых алгоритмах.
- Открытый ключ
- Хэш
- Цифровая подпись сертификата
Информация о личности издателя и держателя – лишь дополнения, необходимые в крупных VPN-сетях и сертификатах, имеющих вес за пределами ваших сетей – без них сертификат всё ещё остается рабочим.
Немного теории.
Файл ca.key должен лежать только на машине самого сертификационного центра, а вот открытый - напротив, должен передаваться на каждую машину, которая собирается сделать запрос на сертификат и затем получить доступ к VPN-серверу.
Попробуем объяснить, как это работает:
У СА есть свой сертификат и закрытый ключ. С помощью закрытого ключа трафик шифруется, с помощью открытого – расшифровывается – это значит, что у VPN-сервера должен быть:
- свой открытый и закрытый ключ
- открытый ключ СА
- открытые ключи всех клиентов,
У СА должен быть:
- свой закрытый и открытый ключ,
- открытый ключ сервера и всех клиентов.
А у всех клиентов, которые будут взаимодействовать с сервером:
- свои закрытые и открытые ключи
- открытый ключ сервера и СА
Но всё это – в идеале, то есть в случае, если сертификаты выдаются по запросу. Мы же используем протокол PKCS12, значительно упрощающий развертывание OpenVPN сети — пакеты с сертификатами мы будем генерировать самостоятельно, а клиенту нужно только прописать путь к нему в конфигах, и IP-адрес сервера.
###
Сертификационный центр готов, теперь сгенерируем сертификат для самого сервера:
# ./build-key-server [имя-сертификата-сервера]
Во время генерации, вас попросят ввести пароль, которым будем защищен закрытый ключ сервера – запомните его, ведь он вам ещё понадобится.
Помимо ключей, OpenVPN использует дополнительные средства защиты – хэш-суммы и протокол Диффи-Хеллмана. Не будем углублятся в теорию работы второго – просто сгенерируйте одноименный файл командой:
./build-dh
Итак, вернемся в папку ./keys, и что мы видим:
- dh1024.pem - Файл Диффи-Хеллмана
- ca.crt – открытый ключ (сертификат) СА
- ca.key – закрытый ключ СА
- vpnserver.key – закрытый ключ сервера
- vpnserver.crt – сертификат сервера.
Все они, кроме закрытого ключа СА, должны быть перемещены в главную директорию VPN-сервера - /etc/openvpn.
Если вы дошли до этого этапа – значит наш СА работает как часы. Следующим шагом будет настройка самого 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 пакетами вы получаете дополнительный слой шифрования пакетов и больше нет необходимости пересылать каждый сертификат отдельно.
Сгенерируем такой пакет для нашего клиента:
# ./build-key-pkcs12 lain.iwakura.Vorona
Во время генерации вы должны ввести пароли [пароль закрытого ключа и пароль экспорта], последний из которых будет спрашиваться при каждом подключении, а также заполнить данные сертификата. После этого – можно передавать пакет на машину клиента - отправим пакет 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
Посмотреть список отозванных сертификатов можно командой:
./list-crl
А самой базой данных отозванных сертификатов является файл crl.pem из папки keys. После отзыва очередного сертификата необходимо скопировать его в папку /etc/openvpn VPN-сервера и перезагрузить, для обновления базы данных:
# /etc/init.d/openvpn restart
Советуем почитать
В случае перепечатки материалов обязательна прямая ссылка на сайт Cs-Companion.ru