32,29
рейтинг
31 января 2012 в 12:49

Разработка → Авторизация в 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 виртуальной сети.
Автор: @VicTun
Компания «Актив»
рейтинг 32,29

Комментарии (60)

  • 0
    есть ли возможность использования токена если клиентская машина под Linux причем не факт, что x86?
    • 0
      Да, конечно. Все делается точно также. Только на клиентском месте следует использовать библиотеку PKCS#11 под linux соответствующей разрядности. Библиотеку можно скачать на странице www.rutoken.ru/hotline/download/nix/. Ну и не забыть установить нужное системное ПО:

      sudo apt-get install libccid
      sudo apt-get install libpcsclite1 pcscd
      • +1
        если не заведется, то посмотрите здесь
      • 0
        мне бы для ARM :)
        • 0
          Вообще говоря под ARM Рутокен ЭЦП заводили forum.rutoken.ru/topic/1589/.
          • 0
            Спасибо.
  • 0
    Внимание! Перед началом работы Рутокен ЭЦП следует отформатировать под виндой через Панель управления->Панель управления Рутокен


    То есть совсем без винды завести не получится?
    • 0
      Вообще говоря, если вы купили Рутокен ЭЦП, то он уже нужным образом отформатирован. Вот если вы его форматировали, например, утилитами OpenSC и изменили формат, нужный библиотеке PKCS#11 Рутокен ЭЦП — в таком случае восстаносить нужное форматирование пока можно только виндой.
  • +1
    Можно ли с помощью этого ВПН передавать персональные данные?
    • 0
      Если вы собрались передавать персональные данные через OpenVPN, то OpenVPN должен шифровать канал с помощью сертифицированной реализации российских криптоалгоритмов. Наиболее простое решение по переползанию с обычного OpenVPN на OpenVPN с сертифицированными ГОСТами, это продукт МагПро OpenVPN-ГОСТ. По сути, это полный аналог OpenVPN, но в качестве криптографического «ярда» он использует СКЗИ МагПро КриптоПакет
      • 0
        Спасибо.
        Правильно ли я понимаю, что этот GUI Вы тоже не учили выдавать ГОСТовые ключи и сертификаты? Или с этим вопросом лучше к разработчикам ГОСТового OpenVPN?
        • 0
          XCA? Он не умеет выдавать ГОСТовые сертификаты. Можно использовать для этой цели утилиту openssl из того же МагПро КриптоПакета
      • 0
        ну вы же для использования РуТокена качали особенную версию OpenVPN, с поддержкой интерфейса PKCS#11. А этот МагПро OpenVPN-ГОСТ умеет использовать эту библиотеку?
        • 0
          Насколько я знаю — да. Но сделано у них не через интерфейс PKCS#11, а через специальную библиотеку, сделанную по спецификации engine openssl.
  • 0
    Потерял флешку — прыгнул в окно…
    • 0
      Потерял Рутокен — запросил по почте запороленный PKCS#12-контейнер с ключом и сертификатом короткого срока действия (временный токен).
  • 0
    Делал тоже самое, только все исключительно «от и до» под linux, разве что с обычным Рутокеном. Для него не нужно ничего скачивать, все прекрасно работает с opensc-0.11.13 при помощи pkcs15-tool/init.
    Вот только вводить пин от токена неудобно, когда запускается openvpn в виде демона…
    • 0
      В чем глубокий смысл запуска openvpn на клиенте в виде как демона?
      • 0
        да собственно такой же, как запускать демоном иксы или торрент клиент какой-нибудь — чтобы все это происходило автоматически при старте системы и без особого участия пользователя, т.к. все равно запускать их надо по умолчанию.
        • 0
          А как вы решили проблему ввода ПИН-кода? Или вы отказались от двухфактороной аутентификации (по токену и пину) и перешли к однофактороной (токену), прикопав пин в init скрипте?
          • 0
            в init скрипте пин нельзя прикопать, когда openvpn стартует как демон, его надо вводить, заходя по телнету на определенный порт в его cli.
            • 0
              Вы не находите этот способ немного геморройным?
              • 0
                настолько, насколько считаю запуск опенвпн в виде процесса вручную с последующим вводом пинкода.
                • 0
                  забыл добавить: под рутом. Когда как пинкод можно ввести под любым пользователем в системе.
                  • 0
                    Вы молодец
                    :):):)
                  • 0
                    Но без шуток говоря, проблема запуска openvpn не из-под рута имеется
  • 0
    Можно ли использовать не «Рутокен ЭЦП», а простой Руктокен? У меня где-то завалялась пара таких, можно было бы применить :)
    • 0
      s/Руктокен/Рутокен/g
    • 0
      Да, можно. Только используйте библиотеку PKCS#11 из opensc-0.11.13.
  • 0
    Хороший пост.
    Вот бы одмины моей конторы сделали через OpenVPN, а то из-за rdp с аццесом по eToken'у приходится запускать венду в виртуалке, ибо по-другому никак.
    • 0
      Попробуйте rdesktop (RDP-клиент под linux). К нему можно подцепить токен.
      • 0
        eToken цепряется, только вот rdesktop довольно глючный, и к именно рабочему RDP cерверу не коннектится. FreeRDP коннектится на ура, но не поддерживает авторизацию по eToken'у.
        • 0
          В чем именно проблема «глючности» rdesktopa?
          Я его много где внедрял — особых проблем не было.
          • 0
            Не помню точно почему не хотел. Приду домой — попробую ещё раз.
            • 0
              для доступа к смарт-карте на машинке должен работать pcscd и уметь определять карту. Кроме того, сам rdesktop должен быть собран с ключом --enable-smartcard
              • 0
                pcscd установлен и работает, rdesktop собран с соответствующим ключом. Не коннектится именно rdesktop. Т.е. он (не помню точно) вроде пишет Connection Timeout, или что-то в этом роде. При этом FreeRDP соединяется на ура, но авторизоваться не получается, т.к. FreeRDP не поддерживает авторизацию по eToken'у.
                • 0
                  а с Windows машинки коннектится?
                  • 0
                    Да.
                    • 0
                      можно посмотреть — видит ли карту pcscd
                      это можно сделать либо программкой pcsc_scan из пакета pcsc-tools, либо запустив pcscd с флагом -afddd
                      • 0
                        Не суть в карте даже :) Даже если я не указываю --enable-smartcard, то rdesktop должен соединиться с RDP сервером, и предложить залогиниться под моими реквизитами. Как, например, это делает FreeRDP. Или я может быть чего-то не знаю о rdesktop'е? :)
                        • 0
                          это да.
                          Все флаги правильно указываете?
                          • 0
                            Насколько я помню — да. Пробовал несколько месяцев назад, сейчас смутно помню. Окажусь вечером дома — попробую ещё раз, освежу память. :)
                            • 0
                              ну вроде бы разницы между rdesktop и FreeRDP в этом плане быть не должно
                              • 0
                                Пытаюсь хоть как нибудь соединиться и в итоге:

                                └─[% >rdesktop 81.*.*.*:60000
                                Autoselected keyboard map en-us
                                ERROR: recv: Connection reset by peer


                                Сервер к которому подключаюсь доступен. FreeRDP спокойной подключается.
                                • 0
                                  первое что приходит в голову, что у rdesktop какой то косяк с портами
                                  на стандартные порты ведь коннектится…
                      • НЛО прилетело и опубликовало эту надпись здесь
                        • 0
                          Странно, но 2XClient тоже не хочет подключаться — dl.dropbox.com/u/585714/2X Client Session Error_001.png
                          Хоть подключен и через роутер — порты все открыты. Закинул пк с которого подключаюсь в DMZ — тоже самое.
                          • НЛО прилетело и опубликовало эту надпись здесь
                            • 0
                              Тоже самое :)
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • 0
                                  Увы:

                                  ┌─[bosha@bosha-pc]──(/opt/2X/Client/bin)
                                  └─[% >./appserverclient -m MX -u user -p pass -s *.*.*.*:60000
                                  ┌─[bosha@bosha-pc]──(/opt/2X/Client/bin)
                                  └─[% >


                                  Если пытаться соединится к другому моему ПК:

                                  ┌─[bosha@bosha-pc]──(/opt/2X/Client/bin)
                                  └─[% >./appserverclient -m MS -u bosha -p password -s 192.168.1.2:3389

                                  ERROR in CRdpConnector: FIXME: pduType 6 (pduType2 0) was not completely parsed

                                  ERROR in CRdpParser: ParseShareControlHeader: received unsupported TS_PROTOCOL_VERSION 0x0


                                  rdesktop к нему же цепляется на ура.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                    • 0
                                      Да.
                                    • 0
                                      В общем-то даже если добавить ssl:// ситуацию это не меняет…
        • +1
          Freerdp уже поддерживает аутентификацию по смарткартам.
          Как собирать и использовать, можно найти здесь: github.com/FreeRDP/FreeRDP/issues/107
          • 0
            Это отличная новость! Вечером попробую. Спасибо.
          • 0
            Это было почти. :) Почти заработало. Дальше буду уже прыгать от issue которое сделал на github :)
            Ещё раз спасибо. :)
    • 0
      Есть еще одна идея. Запустить stunnel и настроить его таким образом, чтобы он принимал соединения на localhost и SSL-ил их на ваш виндовый RDP-сервер. При этом stunnel умеет работать с токенами.

      Таким образом, rdesktop-ом вы будете ходить на localhost, а пробрасывать на сервер и авторизовывать вас на нем по токену будет stunnel.

      Ну а потом по каналу уже будет бегать RDP-траффик. Я попробую у себя так сделать, если получится — напишу на хабр.
      • 0
        Будет просто отлично. Надеюсь получится :)
  • 0
    Обновите картинки, пожалуйста!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка