«Актив» corporate blog
Information Security
31 January 2012

Аутентификация в OpenVPN c помощью Рутокен ЭЦП

image
OpenVPN — кроссплатформенное, гибкое и удобное решение для организации VPN. Для допуска в виртуальную сеть, построенную на базе OpenVPN, клиент должен авторизоваться. В OpenVPN это можно сделать 3 способами:
  • по логину и паролю
  • по ключу и сертификату в файлах
  • по ключу и сертификату на «борту» криптографического USB-токена или смарт-карты
Последний способ является наиболее безопасным. В топике будет описана авторизация в OpenVPN с помощью криптографического USB-токена Рутокен ЭЦП. Рутокен ЭЦП надежно защищен PIN-кодом от несанкционированного доступа и блокируется при исчерпании попыток ввода PIN-кода, поэтому злоумышленник не попадет в VPN даже в случае кражи токена. Кроме того, в Рутокен ЭЦП аппаратно реализованы алгоритмы ГОСТ и RSA, поэтому аутентификация производится «на борту» токена. Благодаря этому закрытый ключ никогда не покидает токен и его невозможно украсть из оперативной памяти компьютера с помощью троянов.

В топике будет показано, как развернуть тестовый VPN, а также корпоративный УЦ на базе open source приложения XCA. С помощью УЦ будет создан ключ и сертификат сервера OpenVPN и произведена инициализация токена клиента. Затем настроим клиент OpenVPN таким образом, чтобы пользователь мог авторизоваться в OpenVPN с помощью Рутокен ЭЦП.


Сервер OpenVPN и XCA буду поднимать на Ubuntu 11.10.

Настройка УЦ


Для начала установим системные компоненты, необходимые для работы Рутокен ЭЦП:
  • 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.
Создадим сертификат УЦ:
image

image

image

Создадим ключ сервера OpenVPN: Private Keys-> New Key, newserver, RSA, 1024.
Создадим сертификат сервера OpenVPN:

image
image

ВАЖНО! У сертификата сервера OpenVPN должно присутствовать специальное расширение (extendedKeyUsage — serverAuth)
image

Экспортируем сертификат УЦ в файл 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
image

Внимание! Если вы форматировали Рутокен ЭЦП с помощью, например, утилит OpenSC, то перед началом работы Рутокен ЭЦП следует отформатировать под виндой через Панель управления->Панель управления Рутокен

Для начала можно поменять PIN, Token->Change PIN.

Создадим ключ RSA «на борту» Рутокен ЭЦП:
Private Keys->New Key
image
в Namе введем newclientkey. По запросу вводим правильный PIN.

Теперь выдадим клиенту сертификат, с помощью которого он бы смог авторизоваться в OpenVPN и запишем этот сертификат на Рутокен ЭЦП:

image

image

ВАЖНО! У сертификата клиента OpenVPN должно присутствовать специальное расширение (extendedKeyUsage — clientAuth)
image

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 'Aktiv\x20Co\x2E/Rutoken\x20ECP/2ab17cca/Rutoken\x20ECP\x20\x3Cno\x20label\x3E/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.1 виртуальной сети.

+23
24.9k 163
Comments 60
Top of the day