HowTo: Подключение к Cisco VPN с использованием Aladdin eToken в Linux (Ubuntu)
Сравнительно недавно я решил перевести домашний компьютер с Windows на Linux. То есть идея такая бродила уже некоторое время, подогреваемая новостями с фронтов борьбы с добровольно-принудительной установкой Windows 10 и размышлениями о неизбежном устаревании «семерки» следом за XP, а вот поводом взяться за дело стал выход очередного LTS-релиза Ubuntu. При этом основным мотивом такого перехода я назову простое любопытство: домашний компьютер используется в основном для развлечений, ну а знакомство с новой ОС — развлечение не хуже прочих. Причем развлечение, как мне кажется, полезное в плане расширения кругозора. Дистрибутив же от Canonical был выбран просто как наиболее популярный: считаю при первом знакомстве с системой это немаловажным подспорьем.
Довольно быстро я на собственном опыте убедился, что для котиков и кино Ubuntu вполне подходит. Но, поскольку компьютер используется еще и для удаленной работы, для отказа от Windows не хватало настроенного подключения к Cisco VPN c авторизацией по eToken.
Набор программ
Было ясно, что для подключения понадобятся по меньшей мере драйвер токена и некий VPN-клиент. В результате поисков в сети получился такой список:
- OpenConnect — VPN-клиент, «совершенно случайно» совместимый с серверами Cisco «AnyConnect»
- GnuTLS — свободная реализация протоколов TLS и SSL. Что важно, в состав этой библиотеки входит утилита p11tool для работы со смарт-картами
- SafeNet Authentication Client — набор драйверов и дополнительных утилит, обеспечивающий работу с электронными ключами eToken
Установка клиента 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
Первая из упомянутых статей была мне весьма полезна в целом, но за одну строчку я особенно благодарен автору. Вот она:
Дело в том, что в определенный момент я совершенно застрял, не понимая, почему токен из родного клиента виден, а через 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:
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. Но это несколько… небезопасно.
Останавливать фоновый процесс правильно следующей командой:
По сообщению SIGINT OpenConnect корректно завершает соединение, а если разорвать соединение «жестко», могут быть проблемы при следующем подключении. Хотя у меня не было.
Послесловие
Задача решена, и я радостно пользуюсь для удаленного доступа приложением Remmina, которое запускаю сразу при подключении к vpn, добавив в скрипт запуска OpenConnect команду:
cd ~ remmina --connect=./.remmina/myconnection.remmina
Правда, пришлось отключить синхронизацию буфера обмена: иначе на удаленной машине он в некоторых приложениях не работает; и включить настройку «Disable tray icon»: в противном случае при каждом подключении в трей добавляется новая иконка. Опять же, переход в домашнюю директорию перед вызовом Remmina неспроста: приложение почету-то не видит путь , а задавать полный путь с именем пользователя мне кажется неправильным.
Выводов относительно применимости Linux дома делать не буду — мне пока хватает, а статья задумана именно как HowTo.
P.S.: На окончательный выбор версии Ubuntu повлияло именно решение данной задачи: в пятой, включенной в Ubuntu 14.04, версии OpenConnect обнаружилась ошибка, мешавшая установке соединения. Вот ради лишенной той ошибки седьмой версии OpenConnect я и поставил возможно еще сырую 16.04.
EDIT: в Ubuntu 19.04 обновилась версия libcrypto и даже драйвер, поставляемый с 10 версией SafeNet, не находит данную библиотеку. Спасаемся симлинком
sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /usr/lib/libcrypto.so
Еще раз ссылки на использованные материалы:
SafeNet Authentication Client
Для того, чтобы прикладные приложения могли работать с токенами (зашифровать и расшифровывать данные, вычислять хэши и цифровые подписи, генерировать и хранить ключи и цифровые сертификаты) необходимо промежуточное программное обеспечение, включающее в себя криптопровайдеры, драйверы оборудования, а также интерфейс пользователя для обслуживания токенов (например, смены PIN-кода). В качестве промежуточного ПО для аппаратных токенов Thales можно использовать либо базовый минидрайвер для встроенного в Windows криптопровайдера, либо полнофункциональный клиент SafeNet Authentication Client.
Программный пакет SafeNet Authentication Client (SAC) – это набор драйверов и дополнительных утилит для работы с USB-ключами и смарт-картами производства компании Thales. Он предоставляет приложениям интерфейсы Microsoft CAPI и PKCS#11, тем самым обеспечивая прозрачный доступ любых стандартных приложений безопасности на основе сертификатов к ключам eToken и смарт-картам. Собственный криптопровайдер SafeNet Authentication Client позволяет генерировать и хранить закрытые ключи непосредственно в аппаратных токенах, что снижает риск компрометации секретов. Поддержка виртуальной клавиатуры позволяет отказаться от ввода PIN-кода на физической клавиатуре, обеспечивая защиту от кейлоггеров.
SafeNet Authentication Client сохраняет полную обратную совместимость и функциональность своих предыдущих версий, поддерживает все актуальные и недавно снятые с производства модели USB-ключей eToken и смарт-карт IDPrime, а также ряда сторонних устройств. С его помощью можно обеспечить одновременную поддержу различных механизмов информационной безопасности, включая создание и проверку цифровых подписей, доверенную загрузку компьютера, шифрование дисков и электронной почты. На базе SAC можно построить систему строгой двухфакторной аутентификации на основе цифровых сертификатов и использовать аппаратные токены для защиты входа на локальные компьютеры, удаленного доступа в корпоративную сеть, доступа к прикладным программам и веб-ресурсам.
SafeNet Authentication Client поддерживает платформы Windows, Linux и macOS в едином пользовательском интерфейсе, что позволяет реализовать единую непрерывную среду для приложений на основе инфраструктуры открытых ключей. SAC включает в себя необходимый набор инструментов для локального администрирования, благодаря которому пользователи могут сами управлять своими токенами и цифровыми сертификатами, снижая тем самым нагрузку на администраторов.
Ключевые преимущества
- Стандартные API для совместимости с приложениями безопасности на базе PKI
- Собственный криптопровайдер с выполнением операций внутри токена
- Поддержка виртуальных клавиатур для ввода PIN-кода
- Совместимость с широким спектром токенов
- Единый пользовательский интерфейс на Windows, Linux и macOS
- Полный набор инструментов для локального администрирования