Поддержка электронных USB ключей в Thinstation
Озадачился вопросом использования двухфакторной
аутентификации для терминального доступа на тонких клиентах на базе Thinstation
и немного удивился. Оказывается, что на текущий момент ни одна сборка или
конструктор Thinstation не поддерживает электронные USB ключи, такие как eToken,
RuToken, iKey. Несмотря на то, что дистрибутив Thinstation настолько популярен,
что его используют вместо стандартного ПО на тонких клиентах HP, да и средства
аутентификации eToken получили больше распространения на постсоветском
пространстве, чем решения от других компаний, но факт остается фактом — в
Thinstation нет поддержки электронных USB ключей.
И чтобы восполнить данный пробел, пришлось потратить немало времени на поиск рабочего решения. Собственно говоря, его и привожу.
Чтобы использовать двухфакторную аутентификацию для терминального доступа по RDP в Thinstation необходимо три компоненты: RDP клиент, приложение, обеспечивающее работу cо смарт-картами (электронными ключами), и драйвер смарт-карты. Первые две компоненты (rdesktop и pcsc) изначально присутствуют в конструкторе Thinstation, и на них не будем заострять внимание, разве что убедимся, что rdesktop имеет поддержку смарт-карт, а pcsc версии не ниже 1.5.5. Третьим компонентом, драйвером, а так же связующим звеном для pcsc является пакет OpenCT. OpenCT поддерживает сравнительно большое количество USB ридеров и токенов и, главное, корректно работает с rdesktop. Вот ему и уделим больше внимания.
Порядок сборки дистрибутива Thinstation с поддержкой электронных USB ключей следующий: собираем из исходников OpenCT, создаем package для Thinstation, правим конфигурационные файлы, собираем образ Thinstation.
Сборка будет происходить на Ubuntu, соответственно команды приведены для этого дистрибутива Linux, для других версий Linux команды будут другими
Для начала устанавливаем необходимые для сборки пакеты:
$ sudo apt-get install libhal1 libltdl7 dpkg-dev build-essential fakeroot
Создаем в домашнем каталоге папку, в которой будем собирать OpenCT из исходников:
$ mkdir ~/openct
$ mkdir ~/openct/build
$ cd ~/openct/build
Скачиваем исходники и устанавливаем зависимости для компиляции пакета
$ sudo apt-get source openct
$ sudo apt-get build-dep openct
Распаковываем:
$ sudo dpkg-source -x openct_0.6.20-1.1.dsc
Собираем пакет OpenCT с необходимыми опциями — enable-pcsc и enable-usb:
$ cd openct-0.6.20
$ sudo DEB_BUILD_OPTIONS="--enable-pcsc --enable-usb" fakeroot debian/rules binary
$ cd…
Openct готов, создаем структуру пакета для Thinstation
$ mkdir ~/openct/packages
$ mkdir ~/openct/packages/openct
$ mkdir ~/openct/packages/openct/bin
$ mkdir ~/openct/packages/openct/etc
$ mkdir ~/openct/packages/openct/etc/udev/
$ mkdir ~/openct/packages/openct/etc/udev/scripts
$ mkdir ~/openct/packages/openct/lib
$ mkdir ~/openct/packages/openct/usr
$ mkdir ~/openct/packages/openct/usr/sbin
$ mkdir ~/openct/packages/openct/var
$ mkdir ~/openct/packages/openct/var/run
$ mkdir ~/openct/packages/openct/var/run/openct
Копируем необходимые файлы
$ cp ~/openct/build/openct-0.6.20/debian/openct/usr/bin/openct-tool ~/openct/packages/openct/bin/openct-tool
$ cp ~/openct/build/openct-0.6.20/debian/openct/usr/sbin/openct-control ~/openct/packages/openct/bin/openct-control
$ cp ~/openct/build/openct-0.6.20/debian/openct/usr/sbin/if* ~/openct/packages/openct/usr/sbin/
$ cp -r ~/openct/build/openct-0.6.20/debian/openct/usr/lib/ ~/openct/packages/openct/
$ cp -r ~/openct/build/openct-0.6.20/debian/openct/lib/udev/rules.d ~/openct/packages/openct/etc/udev
$ cp ~/openct/build/openct-0.6.20/debian/openct/lib/udev/openct* ~/openct/packages/openct/etc/udev/scripts
$ cp ~/openct/build/openct-0.6.20/debian/openct/etc/openct.conf ~/openct/packages/openct/etc/openct.conf
$ cp -r ~/openct/build/openct-0.6.20/debian/libopenct1/usr/lib/* ~/openct/packages/openct/lib
$ cp -r /lib/libdbus* ~/openct/packages/openct/lib
$ cp -r /usr/lib/libhal.so* ~/openct/packages/openct/lib
$ cp -r /usr/lib/libltdl.so* ~/openct/packages/openct/lib
Хотя правило udev уже присутствует, его необходимо подкорректировать
$ nano ~/openct/packages/openct/etc/udev/rules.d/60-openct.rules
После строки
ACTION!=«add», GOTO=«openct_usb_rules_end» необходимо добавить:
SUBSYSTEM==«usb», ACTION==«add», ENV{DEVTYPE}==«usb_device», \
NAME=«bus/usb/$env{BUSNUM}/$env{DEVNUM}», MODE=«0644»
А так же убедиться, что правила, относящиеся к нужным электронным ключам, не закомментированы, и пути до исполняемых скрипов корректны. В Thinstation они располагаются /etc/udev/scripts
Файл openct_usb подвергается более «серьезной» модификации
$ nano ~/openct/packages/openct/etc/udev/scripts/openct_usb
Выносим все и прописываем только:
#!/bin/sh
/bin/openct-control shutdown
/bin/openct-control init
exit 0
Не будет лишним заглянуть в openct.conf, убедиться, что нужный драйвер электронного ключа будет загружен.
$ nano ~/openct/packages/openct/etc/openct.conf
Создаем зависимость пакета openct в Thinstation от pcscd:
$ echo 'pcscd ' | cat > ~/openct/packages/openct/dependencies
Cозданный пакет openct в папку с packages:
$ cp -r ~/openct/packages/openct ~/Thinstation-2.2.2/packages
Сообщаем конструктору о необходимости включить пакет openct в сборку дистрибутива Thinstation:
$ nano ~/Thinstation-2.2.2/build.conf
packages openct
Собираем образ тонкого клиента
$ cd ~/Thinstation-2.2.2
$ sudo ./build
Образ готов. Загружаемся, подключаем token и в консоли проверяем командами pcscd_scan и/или opensc-tool –l
Если все хорошо, то подключаемся к терминальному серверу, не забыв в опциях соединения к серверу указать –r scard.
И чтобы восполнить данный пробел, пришлось потратить немало времени на поиск рабочего решения. Собственно говоря, его и привожу.
Чтобы использовать двухфакторную аутентификацию для терминального доступа по RDP в Thinstation необходимо три компоненты: RDP клиент, приложение, обеспечивающее работу cо смарт-картами (электронными ключами), и драйвер смарт-карты. Первые две компоненты (rdesktop и pcsc) изначально присутствуют в конструкторе Thinstation, и на них не будем заострять внимание, разве что убедимся, что rdesktop имеет поддержку смарт-карт, а pcsc версии не ниже 1.5.5. Третьим компонентом, драйвером, а так же связующим звеном для pcsc является пакет OpenCT. OpenCT поддерживает сравнительно большое количество USB ридеров и токенов и, главное, корректно работает с rdesktop. Вот ему и уделим больше внимания.
Порядок сборки дистрибутива Thinstation с поддержкой электронных USB ключей следующий: собираем из исходников OpenCT, создаем package для Thinstation, правим конфигурационные файлы, собираем образ Thinstation.
Собираем OpenCT
Сборка будет происходить на Ubuntu, соответственно команды приведены для этого дистрибутива Linux, для других версий Linux команды будут другими
Для начала устанавливаем необходимые для сборки пакеты:
$ sudo apt-get install libhal1 libltdl7 dpkg-dev build-essential fakeroot
Создаем в домашнем каталоге папку, в которой будем собирать OpenCT из исходников:
$ mkdir ~/openct
$ mkdir ~/openct/build
$ cd ~/openct/build
Скачиваем исходники и устанавливаем зависимости для компиляции пакета
$ sudo apt-get source openct
$ sudo apt-get build-dep openct
Распаковываем:
$ sudo dpkg-source -x openct_0.6.20-1.1.dsc
Собираем пакет OpenCT с необходимыми опциями — enable-pcsc и enable-usb:
$ cd openct-0.6.20
$ sudo DEB_BUILD_OPTIONS="--enable-pcsc --enable-usb" fakeroot debian/rules binary
$ cd…
Собираем package для Thinstation
Openct готов, создаем структуру пакета для Thinstation
$ mkdir ~/openct/packages
$ mkdir ~/openct/packages/openct
$ mkdir ~/openct/packages/openct/bin
$ mkdir ~/openct/packages/openct/etc
$ mkdir ~/openct/packages/openct/etc/udev/
$ mkdir ~/openct/packages/openct/etc/udev/scripts
$ mkdir ~/openct/packages/openct/lib
$ mkdir ~/openct/packages/openct/usr
$ mkdir ~/openct/packages/openct/usr/sbin
$ mkdir ~/openct/packages/openct/var
$ mkdir ~/openct/packages/openct/var/run
$ mkdir ~/openct/packages/openct/var/run/openct
Копируем необходимые файлы
$ cp ~/openct/build/openct-0.6.20/debian/openct/usr/bin/openct-tool ~/openct/packages/openct/bin/openct-tool
$ cp ~/openct/build/openct-0.6.20/debian/openct/usr/sbin/openct-control ~/openct/packages/openct/bin/openct-control
$ cp ~/openct/build/openct-0.6.20/debian/openct/usr/sbin/if* ~/openct/packages/openct/usr/sbin/
$ cp -r ~/openct/build/openct-0.6.20/debian/openct/usr/lib/ ~/openct/packages/openct/
$ cp -r ~/openct/build/openct-0.6.20/debian/openct/lib/udev/rules.d ~/openct/packages/openct/etc/udev
$ cp ~/openct/build/openct-0.6.20/debian/openct/lib/udev/openct* ~/openct/packages/openct/etc/udev/scripts
$ cp ~/openct/build/openct-0.6.20/debian/openct/etc/openct.conf ~/openct/packages/openct/etc/openct.conf
$ cp -r ~/openct/build/openct-0.6.20/debian/libopenct1/usr/lib/* ~/openct/packages/openct/lib
$ cp -r /lib/libdbus* ~/openct/packages/openct/lib
$ cp -r /usr/lib/libhal.so* ~/openct/packages/openct/lib
$ cp -r /usr/lib/libltdl.so* ~/openct/packages/openct/lib
Правим конфигурационные файлы
Хотя правило udev уже присутствует, его необходимо подкорректировать
$ nano ~/openct/packages/openct/etc/udev/rules.d/60-openct.rules
После строки
ACTION!=«add», GOTO=«openct_usb_rules_end» необходимо добавить:
SUBSYSTEM==«usb», ACTION==«add», ENV{DEVTYPE}==«usb_device», \
NAME=«bus/usb/$env{BUSNUM}/$env{DEVNUM}», MODE=«0644»
А так же убедиться, что правила, относящиеся к нужным электронным ключам, не закомментированы, и пути до исполняемых скрипов корректны. В Thinstation они располагаются /etc/udev/scripts
Файл openct_usb подвергается более «серьезной» модификации
$ nano ~/openct/packages/openct/etc/udev/scripts/openct_usb
Выносим все и прописываем только:
#!/bin/sh
/bin/openct-control shutdown
/bin/openct-control init
exit 0
Не будет лишним заглянуть в openct.conf, убедиться, что нужный драйвер электронного ключа будет загружен.
$ nano ~/openct/packages/openct/etc/openct.conf
Создаем зависимость пакета openct в Thinstation от pcscd:
$ echo 'pcscd ' | cat > ~/openct/packages/openct/dependencies
Собираем образ Thinstation
Cозданный пакет openct в папку с packages:
$ cp -r ~/openct/packages/openct ~/Thinstation-2.2.2/packages
Сообщаем конструктору о необходимости включить пакет openct в сборку дистрибутива Thinstation:
$ nano ~/Thinstation-2.2.2/build.conf
packages openct
Собираем образ тонкого клиента
$ cd ~/Thinstation-2.2.2
$ sudo ./build
Образ готов. Загружаемся, подключаем token и в консоли проверяем командами pcscd_scan и/или opensc-tool –l
Если все хорошо, то подключаемся к терминальному серверу, не забыв в опциях соединения к серверу указать –r scard.