Сравнительно недавно я решил перевести домашний компьютер с Windows на Linux. То есть идея такая бродила уже некоторое время, подогреваемая новостями с фронтов борьбы с добровольно-принудительной установкой Windows 10 и размышлениями о неизбежном устаревании «семерки» следом за XP, а вот поводом взяться за дело стал выход очередного LTS-релиза Ubuntu. При этом основным мотивом такого перехода я назову простое любопытство: домашний компьютер используется в основном для развлечений, ну а знакомство с новой ОС — развлечение не хуже прочих. Причем развлечение, как мне кажется, полезное в плане расширения кругозора. Дистрибутив же от Canonical был выбран просто как наиболее популярный: считаю при первом знакомстве с системой это немаловажным подспорьем.

Довольно быстро я на собственном опыте убедился, что для котиков и кино Ubuntu вполне подходит. Но, поскольку компьютер используется еще и для удаленной работы, для отказа от Windows не хватало настроенного подключения к Cisco VPN c авторизацией по eToken.

Набор программ


Было ясно, что для подключения понадобятся по меньшей мере драйвер токена и некий VPN-клиент. В результате поисков в сети получился такой список:

  1. OpenConnect — VPN-клиент, «совершенно случайно» совместимый с серверами Cisco «AnyConnect»
  2. GnuTLS — свободная реализация протоколов TLS и SSL. Что важно, в состав этой библиотеки входит утилита p11tool для работы со смарт-картами
  3. SafeNet Authentication Client — набор драйверов и дополнительных утилит, обеспечивающий работу с электронными ключами eToken

Поскольку для установки соединения OpenConnect-у требуется URL сертификата клиента, который можно узнать с помощью утилиты p11tool, и обеим программам требуется драйвер для работы со смарт-картой — с установки этого драйвера и начнем.

Установка клиента eToken


Как резонно замечено в статье про настройку eToken в Ubuntu 12.04, ссылка на SafeNet Authentication Client почти секретная. Но в то же время на просторах интернета нашлась более свежая заметка про аналогичные танцы с бубном уже в 14.04, причем с живой ссылкой на дистрибутив где-то в бразильском филиале SafeNet. Что еще интереснее, на том же сервере есть файл с актуальной версией клиента — 9.1, которая, ура-ура, не требует устаревших библиотек. Правильный же способ получения клиента — конечно обратиться к поставщику вашего ключа.

На текущий момент пакет SafenetAuthenticationClient-9.1.7-0_amd64.deb ( или SafenetAuthenticationClient-9.1.7-0_i386.deb для 32-битных систем ) элементарно ставится двойным щелчком по нему в файловом менеджере. Но во время начала работы над этим материалом еще не была исправлена ошибка в Ubuntu Software, из-за которой не работала установка сторонних пакетов. Поэтому была написана

инструкция по скачиванию и установке клиента через консоль
wget --user-agent="Mozilla" http://www.proteq.com.br/download/sac/sac9.1_linux.zip # без user-agent сервер файл не отдает
unzip sac9.1_linux.zip -d sac # в отдельную папку, чтобы помойку не разводить
mkdir sacmnt # создаем папку, куда будем монтировать iso
sudo mount -o loop sac/SAC_9_1_Linux.iso sacmnt
# sudo - выполнить с правами суперпользователя
# mount -o loop монтирует файл как блочное устройство

sudo dpkg -i sacmnt/Installation/Standard/DEB/SafenetAuthenticationClient-9.1.7-0_amd64.deb # собственно установка
sudo apt install --fix-broken # устанавливаем недостающие пакеты

#прибираемся
sudo umount ./sacmnt # размонтировать
rm -d sacmnt # удалить пустую папку
rm -r sac # папка непустая, поэтому рекурсивно


При успешной установке в меню Applications появляется приложение SafeNet Authentication Client Tools.

Установка и настройка GnuTLS


Первая из упомянутых статей была мне весьма полезна в целом, но за одну строчку я особенно благодарен автору. Вот она:
pkcs11-tool --module /usr/lib64/libeTPkcs11.so -L

Дело в том, что в определенный момент я совершенно застрял, не понимая, почему токен из родного клиента виден, а через p11tool — нет. И именно отсюда я понял, где же лежит собственно драйвер. Зная путь к драйверу, ставим и настраиваем GnuTLS по инструкции.

sudo apt install gnutls-bin
sudo mkdir /etc/pkcs11
sudo mkdir /etc/pkcs11/modules
echo 'module: /usr/lib/libeTPkcs11.so' > eToken.module # записали путь к драйверу в файл eToken.module
sudo mv eToken.module /etc/pkcs11/modules # перенесли файл в папку, где его найдет GnuTLS

Теперь с токеном смогут работать любые приложения, использующие GnuTLS. А мы сможем воспользоваться утилитой p11tool для выяснения URL-а нашего сертификата.

Чтение данных токена


Вывести список имеющихся в токене сертификатов можно следующей командой:

p11tool --login --list-certs 'pkcs11:model=eToken'

Вывод p11tool выглядит примерно так:

Object 0:
URL: pkcs11:model=eToken;manufacturer=SafeNet%2c%20Inc.;serial=99999999;token=Username;id=%XX%XX;object=%7bXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX%7d;type=cert
Type: X.509 Certificate
Label: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
ID: XX:XX
Object 1:…

Сертификатов может быть несколько, а для подключения требуется один конкретный. В инструкции по p11tool от OpenConnect в такой ситуации предлагают попробовать каждый. Я же для сопоставления сертификата с его URL составил небольшой скрипт, который выводит как URL, так и текстовые данные каждого сертификата:

sudo apt install openssl # по-умолчанию не установлен
p11tool --login --list-certs 'pkcs11:model=eToken' | grep -P pkcs11.+id.* -o | while read -r line; do p11tool --info "$line";  p11tool --export "$line" | openssl x509 -text; done

Здесь в цикле по URL-ам объектов p11tool --info выводит данные сертификата в своем представлении, а p11tool --export передает сертификат в формате pem-файла на вход openssl, который и выводит текстовое представление. Для передачи в OpenConnect нам нужен тот, где найдется строка Client Authentication — запоминаем его URL. Кроме того, если сервер использует самоподписанный сертификат, запоминаем еще и URL объекта с флагом CKA_CERTIFICATE_CATEGORY=CA.

Экспортируем сертификат удостоверяющего центра в файл (весь URL не обязателен — лишь бы он однозначно определял объект):

p11tool --export 'pkcs11:model=eToken;...' > CA.pem # подставить URL сертификата удостоверяющего центра

Наконец-то OpenConnect


Устанавливаем:

sudo apt install openconnect

Минимальный набор аргументов для подключения приведен в следующей команде:

sudo openconnect --certificate 'pkcs11:model=eToken;id=%XX%XX' your.vpn.server.com
# где %XX%XX - запомненный ранее id сертификата клиента

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

sudo openconnect --certificate 'pkcs11:model=eToken;id=%XX%XX' --cafile=CA.pem --background --pid-file=connect.pid your.vpn.server.com > connect.log
# UPD: исправил опечатку в ключе certificate

С помощью cafile мы указали сертификат удостоверяющего центра — теперь не будет вопроса относительно доверия серверу. Опция background говорит сама за себя, а pid-file позволяет указать имя файла, в котором сохранится идентификатор фонового процесса. Кроме того, пароль токена может быть указан прямо в URL с помощью атрибута pin-value. Но это несколько… небезопасно.

Останавливать фоновый процесс правильно следующей командой:

sudo kill --signal SIGINT $(< connect.pid) # $() - подстановка команды, т.к. kill не признает stdin

По сообщению SIGINT OpenConnect корректно завершает соединение, а если разорвать соединение «жестко», могут быть проблемы при следующем подключении. Хотя у меня не было.

Послесловие


Задача решена, и я радостно пользуюсь для удаленного доступа приложением Remmina, которое запускаю сразу при подключении к vpn, добавив в скрипт запуска OpenConnect команду:

cd ~
remmina --connect=./.remmina/myconnection.remmina

Правда, пришлось отключить синхронизацию буфера обмена: иначе на удаленной машине он в некоторых приложениях не работает; и включить настройку «Disable tray icon»: в противном случае при каждом подключении в трей добавляется новая иконка. Опять же, переход в домашнюю директорию перед вызовом Remmina неспроста: приложение почету-то не видит путь ~/.remmina/myconnection.remmina, а задавать полный путь с именем пользователя мне кажется неправильным.

Выводов относительно применимости Linux дома делать не буду — мне пока хватает, а статья задумана именно как HowTo.

P.S.: На окончательный выбор версии Ubuntu повлияло именно решение данной задачи: в пятой, включенной в Ubuntu 14.04, версии OpenConnect обнаружилась ошибка, мешавшая установке соединения. Вот ради лишенной той ошибки седьмой версии OpenConnect я и поставил возможно еще сырую 16.04.

Еще раз ссылки на использованные материалы:

HowTo: Интернет-банкинг для юридических лиц с использованием Aladdin eToken в Linux (Ubuntu)
Install SafeNet eToken PRO on Ubuntu 14.04 LTS
Invoking p11tool от GnuTLS
OpenConnect Smart Card / PKCS#11 support
Поделиться с друзьями
-->

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


  1. safari2012
    25.05.2016 13:17
    -1

    А причем тут разработка?


    1. martin_wanderer
      25.05.2016 13:35
      +2

      Притом, что хаб «Настройка Linux» отнесен именно к потоку «Разработка». Это обсуждалось, когда Мегамозг вернулся на Хабр.


  1. guestinger
    25.05.2016 14:09

    >> в пятой, включенной в Ubuntu 14.04, версии OpenConnect обнаружилась ошибка, мешавшая установке соединения

    Для решения этой проблемы в 14.04 можно поставить 5-ю версию openconnect и всё работает.

    В моём случае были «тормоза» с DNS — полученные при подключении адреса серверов прописывались перед домашними и запросы некоторое время «висели», после чего шли на домашние адреса.
    Проблема решается запуском скрипта следующего содержания в момент подключения (openconnect --script):

    #!/bin/bash
    unset INTERNAL_IP4_DNS
    exec /usr/share/vpnc-scripts/vpnc-script "$@"


    1. martin_wanderer
      25.05.2016 14:20

      Вот как раз в openconnect 5.0.1 и была ошибка. А 5.0.2 предлагалось собирать из исходников, что меня на тот момент не впечатлило.


      1. guestinger
        25.05.2016 14:46

        В сети я нашёл описание похожей проблемы, где советовали скачать старую версию 5.01-1. На ней всё заработало.
        Очень возможно, что скачал отсюда https://launchpad.net/ubuntu/+source/openconnect/5.01-1
        После этого пробовал ставить 6-ю, но увы не взлетело.


  1. AlexGluck
    25.05.2016 15:15

    У меня на федоре 22-23 без скриптов всё в cinnamon работает. Уже 80% всего через GUI настраиваю. Не думали взять убунту на гном или cinnamon?


    1. guestinger
      25.05.2016 15:41

      Сколько ни пытался, не смог настроить работу с CiscoVPN через eToken в NetworkManager.
      Буду очень признателен, если поделитесь рецептом.


      1. martin_wanderer
        25.05.2016 15:45

        Поддерживаю: у меня даже при установленном network-manager-gnome не появляется соответствующий пункт в настройках VPN. Впрочем, в настройке скриптами есть своя прелесть: о чем бы я писал, если бы все можно было просто мышкой «натыкать».


      1. AlexGluck
        25.05.2016 17:13

        Устанавливаем пакеты
        dnf install -y gnome-networkmanager-openconnect networkmanager-openconnect openssl gnutls

        Потом в апплете НМ — сетевые соединения — добавить — openconnect — заполняем шлюз, путь к СА файлу и в поле сертификат пользователя (или личный ключ) указываем как в скрипте pkcs11:model=eToken;id=%XX%XX

        Возможно придётся через CLI networkmanager добавить этот параметр, но зато всё в гуи.


    1. martin_wanderer
      25.05.2016 15:43

      Вот как раз про UbuntuGNOME сейчас размышляю — Unity вызывает противоречивые чувства. И, кстати, когда решал, какой дистрибутив ставить, выбирал как раз между федорой и убунтой. А в гноме network-manager понимает смарт-карты? Если нет, openconnect-у все-равно придется указывать путь к сертификату через аргументы.


      1. AlexGluck
        25.05.2016 17:19

        Увы, смарт-карты не понимает. Но настроив как написано в инструкции 1 раз только для работы в ГУИ. Всё будет работать. На любой ОС бывают задачи которые надо выполнять через системный/сервисный функционал(консоль).