Аутентификация в 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 виртуальной сети.
    «Актив» 43,78
    Компания
    Поделиться публикацией

    Вакансии компании «Актив»

    Комментарии 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
    • 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
                                            Тут в посте про Thinstation про 2X RDP — решения говорили
                                            habrahabr.ru/blogs/sysadm/136921/

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

                                                    Да, он умеет цепляться к MS RDP. Я так понимаю, что имеется в виду клиент под Linux. В таком случае, если клиент запускается в графическом режиме, то действительно, в нем нет возможности добавить подключение к обычному RDP серверу, только к их серверу можно создать подключение. К обычному RDP можно подключиться только запуская другой бинарник из консоли с параметрами. После установки (я на Ubuntu 11.10 тестил) бинарники по умолчанию лежат по пути "/opt/2X/client/bin". Там должно быть 2 бинарника: 2XClient (графический клиент) и appserverclient (это как раз то, что нужно).

                                                    Если запустить appserverclient без параметров, то он покажет хэлп по параметрам запуска. Чтобы подключиться к стандартному виндовому серверу по RDP нужно запускать клиента примерно вот так:

                                                    ./appserverclient -m MX -u user -p password -s myTerminalServerIP

                                                    Это звучит очень тупо, но параметры юзер и пассворд обязательны. Без них клиент не запустится, выдав ошибку сегментирования.

                                                    Надеюсь, это поможет. Если это не то, что вы имели в виду или не помогло — пишите, обязательно помогу советом.
                                                    • 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
                                                        SSL используете?
                                                        • 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
                                  Обновите картинки, пожалуйста!

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

                                  Самое читаемое