OpenVPN — кроссплатформенное, гибкое и удобное решение для организации VPN. Для допуска в виртуальную сеть, построенную на базе OpenVPN, клиент должен авторизоваться. В OpenVPN это можно сделать 3 способами:
по логину и паролю
по ключу и сертификату в файлах
по ключу и сертификату на «борту» криптографического USB-токена или смарт-карты
Последний способ является наиболее безопасным. В топике будет описана авторизация в OpenVPN с помощью криптографического USB-токена Рутокен ЭЦП. Рутокен ЭЦП надежно защищен PIN-кодом от несанкционированного доступа и блокируется при исчерпании попыток ввода PIN-кода, поэтому злоумышленник не попадет в VPN даже в случае кражи токена. Кроме того, в Рутокен ЭЦП аппаратно реализованы алгоритмы ГОСТ и RSA, поэтому аутентификация производится «на борту» токена. Благодаря этому закрытый ключ никогда не покидает токен и его невозможно украсть из оперативной памяти компьютера с помощью троянов.
В топике будет показано, как развернуть тестовый VPN, а также корпоративный УЦ на базе open source приложения XCA. С помощью УЦ будет создан ключ и сертификат сервера OpenVPN и произведена инициализация токена клиента. Затем настроим клиент OpenVPN таким образом, чтобы пользователь мог авторизоваться в OpenVPN с помощью Рутокен ЭЦП.
Сервер OpenVPN и XCA буду поднимать на Ubuntu.
Настройка УЦ
Для начала установим системные компоненты, необходимые для работы Рутокен ЭЦП:CCID-драйвер
sudo apt-get install libccid
PC/SC
sudo apt-get install libpcsclite1 pcscd
Установим XCA:
sudo apt-get install xca
Запустим XCA:
sudo xca
Следует создать новую базу File->New Database.
Создадим ключ УЦ: Private Keys-> New Key, newcakey, RSA, 1024.
Создадим сертификат УЦ:
Создадим ключ сервера OpenVPN: Private Keys-> New Key, newserver, RSA, 1024.
Создадим сертификат сервера OpenVPN:
ВАЖНО! У сертификата сервера OpenVPN должно присутствовать специальное расширение (extendedKeyUsage — serverAuth)
Экспортируем сертификат УЦ в файл ca.crt, ключ сервера в файл server.key и сертификат сервера в файл server.crt, чтобы их можно было подсунуть серверу OpenVPN (Private Keys->Export, Certificates->Export).
Настройка сервера OpenVPN
Установим openvpn:
sudo apt-get install openvpn
Создадим файл с параметрами ДХ:
openssl dhparam -out dh1024.pem 1024
Тестовый конфиг сервера OpenVPN (ВНИМАНИЕ! Конфиг сервера предназначен только для демонстрации, не надо его брать за основу вашего сервера):
port 1194
proto tcp
dev tap
ca /home/vic/Desktop/ca.crt
cert /home/vic/Desktop/server.crt
key /home/vic/Desktop/server.key
dh /home/vic/Desktop/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
cipher BF-CBC
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
Запустим сервер OpenVPN
sudo openvpn --config /home/vic/Desktop/demo.ovpn
Понятно, что в боевой конфигурации сервер будет запускаться как демон и ключи/сертификаты не будут лежать в home.
Инициализация Рутокен ЭЦП клиента
Теперь можно приступить к тому, ради чего все затевалось — инициализации Рутокен ЭЦП для авторизации клиента в VPN.
Для того, чтобы XCA научился работать с токеном ему нужно дать библиотеку PKCS#11 данного токена. Библиотеку PKCS#11 под Linux с поддержкой RSA для Рутокен ЭЦП можно скачать здесь
Итак, File->OptionsВнимание! Если вы форматировали Рутокен ЭЦП с помощью, например, утилит OpenSC, то перед началом работы Рутокен ЭЦП следует отформатировать под виндой через Панель управления->Панель управления Рутокен
Для начала можно поменять PIN, Token->Change PIN.
Создадим ключ RSA «на борту» Рутокен ЭЦП:
Private Keys->New Key
в Namе введем newclientkey. По запросу вводим правильный PIN.
Теперь выдадим клиенту сертификат, с помощью которого он бы смог авторизоваться в OpenVPN и запишем этот сертификат на Рутокен ЭЦП:
ВАЖНО! У сертификата клиента OpenVPN должно присутствовать специальное расширение (extendedKeyUsage — clientAuth)
XCA предложит сохранить сертификат на токен, следует согласиться.
Настройка клиента OpenVPN
У меня рабочее место пользователя — Windows 7. Так как Рутокен ЭЦП работает через стандартный CCID-драйвер, то на Windows 7 его драйвера устанавливать не надо (на XP надо).
Я установил виндовый OpenVPN и обломался. Оказывается openvpn.exe под винду собирается без поддержки механизма подключения токенов через PKCS#11. Но нашел таки правильный openvpn.exe. Его можно скачать на сайте проекта OpenSC www.opensc-project.org/downloads/users/alonbl/build/, третий архив сверху на момент написания статьи. Распакуйте архив и замените файлы в папке установки openvpn.
Конфиг клиента:
client
dev tap
proto tcp
remote xxx.xxx.xxx.xxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca c:/Users/vic/Desktop/openvpn/ca.crt
pkcs11-providers c:/Users/vic/Desktop/openvpn/rtPKCS11ECP.dll
pkcs11-id 'Aktivx20Cox2E/Rutokenx20ECP/2ab17cca/Rutokenx20ECPx20x3Cnox20labelx3E/2C84962D1AF5792A'
pkcs11-pin-cache 300
comp-lzo
verb 3
В параметре pkcs11-providers следует указать путь к библиотеке PKCS#11 Рутокен ЭЦП (библиотека под винду с поддержкой RSA доступна для скачивания).
В параметре pkcs11-id следует указать значение ID контейнера, в котором на Рутокен ЭЦП хранятся ключ и сертификат пользователя. Этот ID можно получить с помощью команды:
openvpn --show-pkcs11-ids [путь к библиотеке PKCS#11 Рутокен ЭЦП]
Удобнее это делать при инициализации токена, а пользователю выдавать уже готовый конфиг, сертификат УЦ, токен и PIN-код токена.
Установим VPN соединение. Для этого следует подключить Рутокен ЭЦП, запустить с правами администратора в командной строке:
openvpn --config [путь к файлу конфига]
По запросу следует ввести PIN.
После установки соединения я смог пропинговать сервер по адресу 10.8.0.0 виртуальной сети.