Страницы

суббота, 28 апреля 2018 г.

OpenVPN certificates. Подготовка ключей и сертификатов туннеля для Ubuntu 16.04.3 LTS

В учебных целях исследования openvpn сервиса был запущен выделенный сервер у хостинг-провайдера. Был установлен сервис OpenVPN для исследования возможностей туннелей.

Место хранения сертификатов и ключей на виртуальном сервере

Нужно определить где на виртуальном частном сервере будут хранится
ключи.
Здесь существует дыра в безопасности, т.к. поставщик
виртуального частного сервера может иметь доступ к приватному, закрытому ключу сервера.
Поставщик всегда имеет доступ уровня root. Это часто прямо написано в
пользовательском соглашении. Там же написано и об юридической ответственности пользователя за всё.

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

Пусть авторитетные сертификаты будут лежать в папке /etc/openvpn/authorities
Пусть приватный и публичный ключ (сертификат) сервера будут лежать в папке /etc/openvpn/keys

mkdir /etc/openvpn/authorities
mkdir /etc/openvpn/keys

В принципе, виртуальный частный сервер надо условно считать частным.

Старая максима - "что знают двое, знает и свинья". В свете этой мудрости,
когда для преобразования сообщения используется два ключа... Мда...

Очень интересно, где та свинья, которая знает.

Т.е. для частного обмена информацией, даже со "своим" сервером, требуется ограничение физического доступа третьих лиц к серверу.
Если этого нет, то это не частный обмен, а общественный.

※※※

Частный удостоверяющий центр Certificate Authority (CA)


Минимально, частный удостоверяющий центр сводится к двум файлам - частному (секретному) ключу и общественному (открытому) самоподписанному сертификату частного удостоверяющего центра.

Местом хранения данных частного удостоверяющего центра (CA) можно выбрать usb-накопитель и хранить его в труднодоступном месте, после использования.

Генерация ключа и самоподписанного сертификата (genrsa) собственного удостоверяющего центра, на 10 дней (под root-пользователем):

openssl genrsa -out authority.key 4096
openssl req -x509 -new -key authority.key -days 10 -out authority.crt

Для шифрования (шифром -idea) частного ключа собственного удостоверяющего центра и неинтерактивной генерации:
openssl genrsa -idea -out authority.key 4096
openssl req -x509 -new -key authority.key -days 10 -out authority.crt -subj '/C=RU/ST=SPBFC/L=SPB/CN=Private Authority'
Возможна утечка персональных данных, через сертификат собственного удостоверяющего центра.

Для большей анонимности можно опустить заполнение полей опции -subj. Кто выпустил, зачем выпустил?
Не надо упрощать работу читателю сертификатов. Цифры. Только цифры и ничего более.
Каждый день отсрочки - ценен.

Генерация SSL-ключей сервера и клиентов


Для подписи публичных ключей openvpn-сервера и openvpn-клиента,
надо сформировать 2 запроса на подпись (CSR).
Один с использованием частного ключа сервера, второй с использованием частного ключа клиента.
В примере 3 запроса.

Запрос на подпись (CSR) передаваемый в частный удостоверяющий центр, содержит оттрытый публичный ключ запрашивающего.

Генерация незашифрованных закрытых ключей (genrsa) сервера и клиентов:

openssl genrsa -out testserver.key 2048
openssl genrsa -out client1.key 2048
openssl genrsa -out client2.key 2048

или
Генерация шифрованных (-des -des3 -idea) закрытых ключей (genrsa) сервера и клиентов:
openssl genrsa -idea -out testserver.key 2048
openssl genrsa -idea -out client1.key 2048
openssl genrsa -idea -out client2.key 2048


Генерация запросов на подпись (CSR) для сервера и клиентов (команда req):
Дабы избежать интерактивности при генерации используется опция -subj
Одновременно, в файлы сертификатов сохраняются и открытые ключи. Каждая команда одной строкой:

openssl req -new -key testserver.key -out testserver.csr -subj '/C=RU/ST=SPBFC/L=SPB/CN=mytestserver.ru/emailAddress=admin@mytestserver.ru'

openssl req -new -key client1.key -out client1.csr -subj '/C=RU/ST=SPBFC/L=SPB/CN=test.client1.ru'

openssl req -new -key client2.key -out client2.csr -subj '/C=RU/ST=SPBFC/L=SPB/CN=test.client2.ru'
mytestserver.ru - это доменное имя, тут нужно указать то, которое привязано к серверу.
Подписываение запросов на подпись (CSR) и создание подписанных сертификатов (команда x509), на их основе, выполняется в частном удостоверяющем центре - в выделенной папке usb-накопителя, желательно отдельного компьютера. Для пущей безопасности можно выбрать специальное аппаратное устройство хранения ключей и сертификатов. Также можно использовать TPM-модуль в компьютере. 

openssl x509 -req -in testserver.csr -CA authority.crt -CAkey authority.key -CAcreateserial -out testserver.crt -days 10

openssl x509 -req -in client1.csr -CA authority.crt -CAkey authority.key -CAcreateserial -out client1.crt -days 10

openssl x509 -req -in client2.csr -CA authority.crt -CAkey authority.key -CAcreateserial -out client2.crt -days 10


Дополнительный секретный ключ TLS и настройка для OpenVPN

Сгенерировать специальные параметры алгоритма:
openssl dhparam -out dh2048.pem 2048

Сгенерировать специальный общий закрытый ключ (pre-shared key) для TLS надо на сервере.

root@testserver# openvpn --genkey --secret psk.key

Загрузить его потом на клиентов и на сервер - но источником этого ключа должен быть сервер.

Распространение ключей OpenVPN


Итак, после всего этого нам нужны файлы, которые мы раскладываем по папкам:

В папку удостоверяющего центра на флешке и храним в сейфе:
authority.key
authority.crt


В папки на сервере /etc/openvpn/authorities:
authority.crt

В папки на сервере /etc/openvpn/keys
testserver.key
testserver.crt
dh2048.pem

psk.key

В папку на клиенте №1:
authority.crt
testserver.crt
client1.key
client1.crt

psk.key
 
В папку на клиенте №2:
authority.crt
testserver.crt
client2.crt
client2.key

psk.key
 
Также в папке частного удостоверяющего центра (CA) можно завести журнал, в виде текстового файла, в который записывать что и когда было сделано.  Это поможет освежить историю, спустя 10 лет.
※※※

Фишки для удобства OpenVPN


Генерирование и вывод в один файл частного и общественного ключей, без шифрования:
openssl req \
-x509 -nodes -days 10 -sha256 \
-newkey rsa:2048 -keyout test.pem -out test.pem


Упаковка частного ключа и сертификата сервера, а также сертификата удостоверяющего частного центра в контейнер формата pkcs12:

openssl pkcs12 -aes256 -export -in  testserver.crt -inkey testserver.key -certfile authority.crt -name "PKCS12" -out testserver.p12
При этом, опция в настройках OpenVPN указывает на один файл-контейнер pkcs12.
pkcs12 /etc/openvpn/keys/testserver.p12
Удобно, вместо 3 файлов оперировать одним.


Копирование файла на сервер по протоколу scp:

scp -2  authority.crt root@XX.XXX.X.XXX:/etc/openvpn/authorities/authority.crt
scp -2 testserver.key root@XX.XXX.X.XXX:/etc/openvpn/keys/testserver.key
scp -2 testserver.crt root@XX.XXX.X.XXX:/etc/openvpn/keys/testserver.crt

Копирование файла с сервера на клиент по scp:

scp -2 root@XX.XXX.X.XXX:/etc/openvpn/keys/psk.key .

- точка в конце - это текущий каталог где лежат клиентские все ключи

※※※

Простейшая тестовая настройка на стороне сервера OpenVPN


Простейшая тестовая настройка сервера OpenVPN даёт возможность проверить соединение сервера и клиента, убрав лишние конфигурационные настройки, которые часто ухудшают поиск причин падения туннеля.
Приведённая настройка не даёт доступа к интернету, т.к. надо настроить маршруты и пр. Отваливается по таймауту. Нет IPv6.
Это позже.
Содержимое файла: /etc/openvpn/home.conf
Его надо сформировать в редакторе nano.


# OpenVPN server KVM1
# Open Virtual Private Network server configuration
# server: kvm1
# date: april 28, 2018

port 1194
proto udp
dev tun

# Certificate Authority (CA) - public key
ca /etc/openvpn/authorities/authority.crt
# Certificate - public key of the server, signed with CA private key via request
cert /etc/openvpn/keys/testserver.crt
# Private key (key) - secret data, private key of server
key /etc/openvpn/keys/testserver.key

# Diffie Hellman parameters
# openssl dhparam -out dh2048.pem 2048

dh /etc/openvpn/keys/dh2048.pem

topology subnet
server 192.168.6.0 255.255.255.0


Или кратко, без комментариев:

port 1194
proto udp
dev tun
ca /etc/openvpn/authorities/authority.crt
cert /etc/openvpn/keys/testserver.crt
key /etc/openvpn/keys/testserver.key
dh /etc/openvpn/keys/dh2048.pem
topology subnet
server 192.168.6.0 255.255.255.0

Для проверки запуска сервиса OpenVPN надо зайти по SSH на сервер
и запустить сервис OpenVPN:

openvpn --config  /etc/openvpn/home.conf


При этом на клиенте надо установить BC-CBC, SHA1, в настройках графического клиента, т.к. это включено на сервере по-умолчанию.
※※※

Ресурсы




※※※

Комментариев нет: