HowTo: Підключення до Cisco VPN з використанням Aladdin eToken в Linux (Ubuntu)

Порівняно нещодавно я вирішив перевести домашній комп'ютер з 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 Client Authentication — набір драйверів і додаткових утиліт, що забезпечує роботу з електронними ключами eToken
Оскільки для встановлення з'єднання OpenConnect-у вимагається URL сертифіката клієнта, який можна дізнатися за допомогою утиліти p11tool, і обох програмах потрібен драйвер для роботи зі смарт-картою — з установки драйвера і почнемо.

Установка клієнта eToken

Як слушно помічено статті про налаштування eToken в Ubuntu 12.04, посилання на SafeNet Client Authentication майже секретна. Але в той же час на теренах інтернету знайшлася більш свіжа примітка про аналогічні танці з бубном вже в 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: {ХХХХХХХХ-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

З допомогою 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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.