Установка драйвера ifd-rutokens в docker

Здравствуйте. Пытаюсь установить в докер драйвер ifd-rutokens. Вываливается ошибка:

root@18927547c887:/auth# chmod +x ./auth/for_csp/ifd-rutokens_1.0.4_amd64.deb
root@18927547c887:/auth# dpkg -i ./auth/for_csp/ifd-rutokens_1.0.4_amd64.deb
Selecting previously unselected package ifd-rutokens.
(Reading database ... 14924 files and directories currently installed.)
Preparing to unpack .../ifd-rutokens_1.0.4_amd64.deb ...
Unpacking ifd-rutokens (1.0.4) ...
Setting up ifd-rutokens (1.0.4) ...
dpkg: error processing package ifd-rutokens (--install):
installed ifd-rutokens package post-installation script subprocess returned error exit status 2
Errors were encountered while processing:
ifd-rutokens

Если пытаюсь установить через apt-get, то суть ошибки чуть проясняется:
root@107ac2783f47:/auth# apt-get install -y ./auth/for_csp/ifd-rutokens_1.0.4_amd64.deb
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'ifd-rutokens' instead of './auth/for_csp/ifd-rutokens_1.0.4_amd64.deb'
The following NEW packages will be installed:
  ifd-rutokens
0 upgraded, 1 newly installed, 0 to remove and 9 not upgraded.
Need to get 0 B/60.0 kB of archives.
After this operation, 246 kB of additional disk space will be used.
Get:1 /auth/auth/for_csp/ifd-rutokens_1.0.4_amd64.deb ifd-rutokens amd64 1.0.4 [60.0 kB]
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76, <> line 1.)
debconf: falling back to frontend: Readline
Selecting previously unselected package ifd-rutokens.
(Reading database ... 15011 files and directories currently installed.)
Preparing to unpack .../ifd-rutokens_1.0.4_amd64.deb ...
Unpacking ifd-rutokens (1.0.4) ...
Setting up ifd-rutokens (1.0.4) ...
dpkg: error processing package ifd-rutokens (--configure):
installed ifd-rutokens package post-installation script subprocess returned error exit status 2
Errors were encountered while processing:
ifd-rutokens
E: Sub-process /usr/bin/dpkg returned an error code (1)

При этом если устанавливать драйвер на локальную машину, то всё отлично ставится без ошибок.
Описание контейнера: Ubuntu 18.04.3 LTS, ifd-rutokens_1.0.4_amd64.deb, libccid 1.4.29-1, libpcsclite1 1.8.23-1, pcscd 1.8.23-1.
Не подскажите как избежать эту ошибку и всё таки установить драйвер?

Re: Установка драйвера ifd-rutokens в docker

Добрый день,
попробуйте перед установкой драйверов выполнить 

> apt-get install dialog

С уважением, Алексей Лазарев, Компания "Актив"

Re: Установка драйвера ifd-rutokens в docker

root@ff33a9cfdd9a:/auth# apt-get install dialog
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  dialog
0 upgraded, 1 newly installed, 0 to remove and 9 not upgraded.
Need to get 217 kB of archives.
After this operation, 1,149 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic/universe amd64 dialog amd64 1.3-20171209-1 [217 kB]
Fetched 217 kB in 1s (368 kB/s)
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76, <> line 1.)
debconf: falling back to frontend: Readline
Selecting previously unselected package dialog.
(Reading database ... 15011 files and directories currently installed.)
Preparing to unpack .../dialog_1.3-20171209-1_amd64.deb ...
Unpacking dialog (1.3-20171209-1) ...
Setting up dialog (1.3-20171209-1) ...
root@ff33a9cfdd9a:/auth# apt-get -y install ./auth/for_csp/ifd-rutokens_1.0.4_amd64.deb
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'ifd-rutokens' instead of './auth/for_csp/ifd-rutokens_1.0.4_amd64.deb'
The following NEW packages will be installed:
  ifd-rutokens
0 upgraded, 1 newly installed, 0 to remove and 9 not upgraded.
Need to get 0 B/60.0 kB of archives.
After this operation, 246 kB of additional disk space will be used.
Get:1 /auth/auth/for_csp/ifd-rutokens_1.0.4_amd64.deb ifd-rutokens amd64 1.0.4 [60.0 kB]
Selecting previously unselected package ifd-rutokens.
(Reading database ... 15167 files and directories currently installed.)
Preparing to unpack .../ifd-rutokens_1.0.4_amd64.deb ...
Unpacking ifd-rutokens (1.0.4) ...
Setting up ifd-rutokens (1.0.4) ...
dpkg: error processing package ifd-rutokens (--configure):
installed ifd-rutokens package post-installation script subprocess returned error exit status 2
Errors were encountered while processing:
ifd-rutokens
E: Sub-process /usr/bin/dpkg returned an error code (1)

Та же ругачка с exit status 2

Re: Установка драйвера ifd-rutokens в docker

Попробовал упростить докер-файл до:

FROM azul/zulu-openjdk:8
ENV JAVA_HOME=/usr/lib/jvm/zulu-8-amd64/
ENV JAVA_JRE=/usr/lib/jvm/zulu-8-amd64/jre
WORKDIR /auth
ADD ./for_csp.tar.gz ./auth
    
RUN apt-get update
RUN apt-get -y install dialog
RUN apt-get -y install apt-utils
RUN apt-get -y install debconf
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
RUN chmod 777 /var/cache/debconf/
RUN chmod 777 /var/cache/debconf/passwords.dat
RUN apt-get -y install udev
RUN apt-get -y install libusb-0.1-4
RUN apt-get -y install libpcsclite1
RUN apt-get -y install libusb-1.0-0
RUN apt-get -y install libccid
RUN apt-get -y install pcscd
RUN dpkg -i ./auth/for_csp/ifd-rutokens_1.0.4_amd64.deb

При создании контейнера та же ошибка:
Step 19/26 : RUN dpkg -i ./auth/for_csp/ifd-rutokens_1.0.4_amd64.deb
---> Running in a6066adab8e6
Selecting previously unselected package ifd-rutokens.
(Reading database ... 6898 files and directories currently installed.)
Preparing to unpack .../ifd-rutokens_1.0.4_amd64.deb ...
Unpacking ifd-rutokens (1.0.4) ...
Setting up ifd-rutokens (1.0.4) ...
dpkg: error processing package ifd-rutokens (--install):
installed ifd-rutokens package post-installation script subprocess returned error exit status 2
Errors were encountered while processing:
ifd-rutokens
The command '/bin/sh -c dpkg -i ./auth/for_csp/ifd-rutokens_1.0.4_amd64.deb' returned a non-zero code: 1

Re: Установка драйвера ifd-rutokens в docker

И вообще, кто-нибудь пробовал работать с рутокеном из докера или эта технология не отработана?

Re: Установка драйвера ifd-rutokens в docker

Добрый день,
У нас в .deb пакете есть правило после установки - перезагрузить демона udev, чтобы применить новое правило. В докере демонами по умолчанию управлять нельзя. Поэтому без танцев с бубнами - не получится.

С уважением, Алексей Лазарев, Компания "Актив"

Re: Установка драйвера ifd-rutokens в docker

Спасибо. А что тогда посоветуете, вообще не рассчитывать на связку docker + rutoken? Или можете дать какие-либо рекомендации?

Re: Установка драйвера ifd-rutokens в docker

Добрый день, Алексей. Прошу прощения за задержку с ответом. Пришлось поэкспериментировать.
Вот что пишут наши техспецы:

Запускать образ для работы с рутокен S можно командой:
sudo docker run -it --net=host --privileged -v /dev/bus/usb:/dev/bus/usb:ro -v /run/udev:/run/udev:ro azul/zulu-openjdk:8 bash

Тут без --net=host корректно подключение-отключение рутокена не работало. Причину пока не выяснили, хотя опция должна влиять только на сеть.
--privileged необходим для проброса usb устройства внутрь контейнера. Дополнительно потребовалось сделать проброс -v /dev/bus/usb:/dev/bus/usb:ro для того, чтобы usb устройства виделись внутри контейнера.
-v /run/udev:/run/udev:ro этот проброс нужен, чтобы база данных подключенных устройств udev была видна в контейнере и при установке dpkg -i ifd-rutokens_1.0.4_amd64.deb не появлялась ошибка
installed ifd-rutokens package post-installation script subprocess returned error exit status 2
azul/zulu-openjdk:8 образ взял его, но должно работать и на обычной убунте.

далее устанавливались необходимые пакеты:
apt update ; apt install wget libccid libpcsclite1 pcscd udev opensc pcsc-tools libusb-0.1-4 -y ; wget https://download.rutoken.ru/Rutoken/Dri … _amd64.deb

и далее:
dpkg -i ifd-rutokens_1.0.4_amd64.deb

Работу рутокена проверяли командой:
pcscd –afddddd

При подключении и отключении были сообщения об успешном подключении и отключении:

root@ubuntu:/# pcscd -afddddd
00000000 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000027 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000012 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000010 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000010 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000283 configfile.l:285:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000047 configfile.l:322:DBGetReaderListDir() Skipping non regular file: .
00000013 configfile.l:322:DBGetReaderListDir() Skipping non regular file: ..
00000008 configfile.l:361:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000088 pcscdaemon.c:662:main() pcsc-lite 1.8.23 daemon ready.
00007530 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000311 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000348 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x8087, PID: 0x0020, path: /dev/bus/usb/001/002
00000229 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/002/001
00000138 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/002/001
00000143 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x8087, PID: 0x0020, path: /dev/bus/usb/002/002
00000155 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x062A, PID: 0x4101, path: /dev/bus/usb/002/005
00000152 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x062A, PID: 0x4101, path: /dev/bus/usb/002/005
00000143 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x8087, PID: 0x0020, path: /dev/bus/usb/002/002
00000156 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x0A89, PID: 0x0020, path: /dev/bus/usb/002/025
00000009 hotplug_libudev.c:436:HPAddDevice() Adding USB device: Aktiv Co. Rutoken S
00000040 readerfactory.c:1075:RFInitializeReader() Attempting startup of Aktiv Co. Rutoken S 00 00 using /usr/lib/pcsc/drivers/ifd-rutokens.bundle/Contents/Linux/librutokens.so
00000140 readerfactory.c:950:RFBindFunctions() Loading IFD Handler 3.0
00265490 readerfactory.c:396:RFAddReader() Using the reader polling thread
00000631 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x8087, PID: 0x0020, path: /dev/bus/usb/002/002
00000086 readerfactory.c:1410:RFWaitForReaderInit() Waiting init for reader: Aktiv Co. Rutoken S 00 00
00000380 eventhandler.c:287:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00000023 Card ATR: 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00


13666619 hotplug_libudev.c:645:HPEstablishUSBNotifications() USB Device removed
00000554 hotplug_libudev.c:363:HPRemoveDevice() Removing USB device[0]: Aktiv Co. Rutoken S at /dev/bus/usb/002/025
00000197 readerfactory.c:610:RFRemoveReader() UnrefReader() count was: 1
00000355 eventhandler.c:173:EHDestroyEventHandler() Stomping thread.
00000030 eventhandler.c:183:EHDestroyEventHandler() Killing polling thread
00000547 eventhandler.c:213:EHDestroyEventHandler() Thread stomped.
00000017 readerfactory.c:1126:RFUnInitializeReader() Attempting shutdown of Aktiv Co. Rutoken S 00 00.
00000054 readerfactory.c:987:RFUnloadReader() Unloading reader driver.


05985593 hotplug_libudev.c:651:HPEstablishUSBNotifications() USB Device add
00000210 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x0A89, PID: 0x0020, path: /dev/bus/usb/002/026
00000011 hotplug_libudev.c:436:HPAddDevice() Adding USB device: Aktiv Co. Rutoken S
00000062 readerfactory.c:1075:RFInitializeReader() Attempting startup of Aktiv Co. Rutoken S 00 00 using /usr/lib/pcsc/drivers/ifd-rutokens.bundle/Contents/Linux/librutokens.so
00000206 readerfactory.c:950:RFBindFunctions() Loading IFD Handler 3.0
00071963 readerfactory.c:396:RFAddReader() Using the reader polling thread
00001238 eventhandler.c:287:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00000024 Card ATR: 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00


04435364 hotplug_libudev.c:645:HPEstablishUSBNotifications() USB Device removed
00000274 hotplug_libudev.c:363:HPRemoveDevice() Removing USB device[0]: Aktiv Co. Rutoken S at /dev/bus/usb/002/026
00000013 readerfactory.c:610:RFRemoveReader() UnrefReader() count was: 1
00000010 eventhandler.c:173:EHDestroyEventHandler() Stomping thread.
00000008 eventhandler.c:183:EHDestroyEventHandler() Killing polling thread
00000118 eventhandler.c:213:EHDestroyEventHandler() Thread stomped.
00000015 readerfactory.c:1126:RFUnInitializeReader() Attempting shutdown of Aktiv Co. Rutoken S 00 00.
00000051 readerfactory.c:987:RFUnloadReader() Unloading reader driver.


02658029 hotplug_libudev.c:651:HPEstablishUSBNotifications() USB Device add
00000174 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x0A89, PID: 0x0020, path: /dev/bus/usb/002/027
00000013 hotplug_libudev.c:436:HPAddDevice() Adding USB device: Aktiv Co. Rutoken S
00000055 readerfactory.c:1075:RFInitializeReader() Attempting startup of Aktiv Co. Rutoken S 00 00 using /usr/lib/pcsc/drivers/ifd-rutokens.bundle/Contents/Linux/librutokens.so
00000179 readerfactory.c:950:RFBindFunctions() Loading IFD Handler 3.0
00068460 readerfactory.c:396:RFAddReader() Using the reader polling thread
00001556 eventhandler.c:287:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00000027 Card ATR: 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00


^C01580473 pcscdaemon.c:193:signal_thread() Received signal: 2
00000021 pcscdaemon.c:226:signal_thread() Preparing for suicide
00001358 hotplug_libudev.c:713:HPStopHotPluggables() Hotplug stopped
01000094 readerfactory.c:1353:RFCleanupReaders() entering cleaning function
00000019 readerfactory.c:1362:RFCleanupReaders() Stopping reader: Aktiv Co. Rutoken S 00 00
00000011 readerfactory.c:610:RFRemoveReader() UnrefReader() count was: 1
00000009 eventhandler.c:173:EHDestroyEventHandler() Stomping thread.
00000008 eventhandler.c:183:EHDestroyEventHandler() Killing polling thread
00000234 eventhandler.c:213:EHDestroyEventHandler() Thread stomped.
00000032 readerfactory.c:1126:RFUnInitializeReader() Attempting shutdown of Aktiv Co. Rutoken S 00 00.
00000262 readerfactory.c:987:RFUnloadReader() Unloading reader driver.
00000079 winscard_svc.c:155:ContextsDeinitialize() remaining threads: 0
00000011 pcscdaemon.c:785:at_exit() cleaning /var/run/pcscd

С уважением, Алексей Лазарев, Компания "Актив"

Re: Установка драйвера ifd-rutokens в docker

Спасибо за ответ, Алексей! Извините, что долго не отвечал, на другую ветку проекта переключили. Сейчас вернулся и стал проверять:
1) Действительно, если пробросить в контейнер при старте локальную папку /run/udev, то драйвер ifd-rutokens_1.0.4_amd64.deb корректно ставится без ошибки.

2) Попытка посканировать rutoken-s из контейнера не получается:

root@590fe9d781f3:/auth# service pcscd start
root@590fe9d781f3:/auth# pcsc_scan
PC/SC device scanner
V 1.5.2 (c) 2001-2017, Ludovic Rousseau <ludovic.rousseau@free.fr>
SCardEstablishContext: Service not available.
root@590fe9d781f3:/auth# service pcscd start
root@590fe9d781f3:/auth# pcsc_scan
PC/SC device scanner
V 1.5.2 (c) 2001-2017, Ludovic Rousseau <ludovic.rousseau@free.fr>
Using reader plug'n play mechanism
Scanning present readers...
Waiting for the first reader... - 

3) Запуск сервиса pcscd в отладочном режиме:

root@590fe9d781f3:/auth# service pcscd stop 
root@590fe9d781f3:/auth# pcscd -afddddd     
00000000 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000024 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000010 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000006 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000009 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000212 configfile.l:285:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000034 configfile.l:361:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000071 configfile.l:322:DBGetReaderListDir() Skipping non regular file: ..
00000012 configfile.l:322:DBGetReaderListDir() Skipping non regular file: .
00000017 pcscdaemon.c:662:main() pcsc-lite 1.8.23 daemon ready.
00003193 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000103 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000110 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x0A89, PID: 0x0020, path: /dev/bus/usb/001/006
00000006 hotplug_libudev.c:436:HPAddDevice() Adding USB device: Aktiv Co. Rutoken S
00000030 readerfactory.c:1075:RFInitializeReader() Attempting startup of Aktiv Co. Rutoken S 00 00 using /usr/lib/pcsc/drivers/ifd-rutokens.bundle/Contents/Linux/librutokens.so
00000109 readerfactory.c:950:RFBindFunctions() Loading IFD Handler 3.0
00015487 readerfactory.c:1106:RFInitializeReader() Open Port 0x200000 Failed (usb:0a89)
00000011 readerfactory.c:376:RFAddReader() [b]Aktiv Co. Rutoken S init failed.[/b]
00000005 readerfactory.c:610:RFRemoveReader() UnrefReader() count was: 1
00000004 readerfactory.c:1126:RFUnInitializeReader() Attempting shutdown of Aktiv Co. Rutoken S 00 00.
00000003 readerfactory.c:987:RFUnloadReader() Unloading reader driver.
00000037 hotplug_libudev.c:523:HPAddDevice() Failed adding USB device: Aktiv Co. Rutoken S
00000192 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000155 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x03F0, PID: 0x354A, path: /dev/bus/usb/001/002
00000148 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x03F0, PID: 0x354A, path: /dev/bus/usb/001/002
00000135 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000149 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x03F0, PID: 0x134A, path: /dev/bus/usb/001/003
00000234 hotplug_libudev.c:297:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0003, path: /dev/bus/usb/002/001

4) Попытка посмотреть, что находится на токене

root@590fe9d781f3:/auth# /usr/lib/jvm/zulu-8-amd64/jre/bin/keytool -list -keystore NONE -storetype rutokenstore
Dec 04, 2019 6:11:07 AM ru.CryptoPro.JCSP.MSCAPI.cl_6 enumInstalledProviders
INFO: Provider with type 24 not found.
Dec 04, 2019 6:11:07 AM ru.CryptoPro.JCSP.MSCAPI.cl_6 enumInstalledProviders
INFO: Provider with type 24 not found.
keytool error: java.security.KeyStoreException: RUTOKENSTORE not found

5) При попытки чтения ключа програмно из JAVA:

KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);

тоже ругается java.security.KeyStoreException: RutokenStore not found

Я смутно припоминаю, что вроде была такая же проблема и при локальной работе с рутокеном - сразу после установки драйвера, контейнер не виделся в системе. А после перезагрузки компьютера всё заработало. Хотя возможно это и ложные восспоминания. Другое дело проверить это предположение на контейнере я не могу, так как драйвер ifd-rutokens_1.0.4_amd64.deb из-за необходимости проброски папки /run/udev ставится не в момент создания контейнера, а уже после запуска оного, изнутри самого контейнера. И перезапуск контенера приведёт к обнулению драйвера ifd-rutokens_1.0.4_amd64.deb.