Установка драйвера 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.

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

Добрый день.

Наш админ взял для примера докефайл, выложенный в этой теме ранее (https://forum.rutoken.ru/post/13531/#p13531)
Убрал его последнюю строку
RUN dpkg -i ./auth/for_csp/ifd-rutokens_1.0.4_amd64.deb
Сделал образ командой
sudo docker build -t example1 .
далее запустил установку ifd-rutokens_1.0.4_amd64.deb
sudo docker run -it -v /run/udev:/run/udev:ro example1 bash -c "dpkg -i ifd-rutokens_1.0.4_amd64.deb"
узнал ID последнего запущенного контейнера
sudo docker ps –a
и сделал commit
sudo docker commit container_id example2
В результате получаем образ example2, который можно запустить и в нем будет виден Рутокен S:
sudo docker run -it --net=host --privileged -v /run/udev:/run/udev:ro example2 bash

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

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

Странно. А каким образом вы понимаете, что "в нем будет виден Рутокен S"? Какой командой?

У меня например запуск утилиты pcsc_scan оканчивается ничем:
root@b6f1c3585d68:/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... |

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

Здравствуйте
Скажите, а какой командой вы запускаете контейнер?

Попробовали у себя сегодня еще раз, к своему предыдущему ответу доустановили пакеты из форума libccid libpcsclite1 pcscd pcsc-tools opensc (https://forum.rutoken.ru/post/11904/#p11904)
Запускаем контейнер командой
sudo docker run -it --net=host --privileged -v /dev/bus/usb:/dev/bus/usb:ro example2 bash
устанавливаем в нем пакеты
apt install –y libccid libpcsclite1 pcscd pcsc-tools opensc
отключаем рутокен от компьютера, запускаем сервис
/etc/init.d/pcscd start
Запускаем команду
pcsc_scan

Получаем вывод
root@ubuntu:/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...

Подключаю Рутокен, получаю далее вывод
0: Aktiv Co. Rutoken S 00 00
Tue Dec 17 09:23:37 2019
Reader 0: Aktiv Co. Rutoken S 00 00
  Card state: Card inserted,
  ATR: 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00

ATR: 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00
+ TS = 3B --> Direct Convention
+ T0 = 6F, Y(1): 0110, K: 15 (historical bytes)
  TB(1) = 00 --> VPP is not electrically connected
  TC(1) = FF --> Extra guard time: 255 (special value)
+ Historical bytes: 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00
  Category indicator byte: 00 (compact TLV data object)
    Tag: 5, len: 6 (card issuer's data)
      Card issuer data: 72 75 54 6F 6B 6E
    Tag: 7, len: 3 (card capabilities)
      Selection methods: 30
        - DF selection by path
        - DF selection by file identifier
      Data coding byte: 20
        - Behaviour of write functions: proprietary
        - Value 'FF' for the first byte of BER-TLV tag fields: invalid
        - Data unit in quartets: 1
      Command chaining, length fields and logical channels: 00
        - Logical channel number assignment: No logical channel
        - Maximum number of logical channels: 1
    Mandatory status indicator (3 last bytes)
      LCS (life card cycle): 00 (No information given)
      SW: 9000 (Normal processing.)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00
         ruToken-S (USB token)
         http://www.rutoken.ru/products/rutoken/rutoken-s/
- ^C
root@ubuntu:/auth# exit

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

(2019-12-18 11:58:57 отредактировано Алексей Черенцов)

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

Здравствуйте, Алексей. Становится чуть понятней. А именно - у меня запуск контейнера идёт с привязкой к сети с именем auth_app в которую включены rabbitmq, pgadmin4 и postgres:
sudo docker run -it --privileged --volume=/dev/bus/usb:/dev/bus/usb:ro --volume=/run/udev:/run/udev:ro -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --publish=8083:8081 --network=auth_app --rm=true example_auth
И с этой сетью токен не виден. А если заменяю в строке запуска контейнера свою сеть на --network=host, то токен утилитой pcsc_scan становится виден.
Возникает вопрос, почему при указании пользовательской сети вместо дефолтной не пробрасывается рутокен?
docker-compose.yml для моей сети выглядит так:

version: '3.6'
services:
  rabbitmq:
    container_name: rabbitmq
    image: 'rabbitmq:management'
    networks:
      static-network:
        ipv4_address: 172.20.128.7
    ports:
      - "5672:5672"
      - "15672:15672"
  mypostgres:
    image: postgres
    networks:
      static-network:
        ipv4_address: 172.20.128.14
    volumes:
      - ./db-data/:/var/lib/postgresql/data/
      - ./db/init/:/docker-entrypoint-initdb.d/       
    ports:
     - "5432:5432"
    environment:
     - POSTGRES_PASSWORD=password
     - POSTGRES_USER=postgres
     - POSTGRES_DB=authdb
     - PGDATA=/var/lib/postgresql/data/
  pgadmin4:
    image: dpage/pgadmin4
    networks:
      static-network:
        ipv4_address: 172.20.128.13
    ports:
      - "5959:80"
    environment:
     - PGADMIN_DEFAULT_EMAIL=postgres@localhost
     - PGADMIN_DEFAULT_PASSWORD=password     
    volumes:
     - ./pgadmin:/root/.pgadmin     
networks:
  static-network:
    name: auth_app
    ipam:
      config:
        - subnet: 172.20.0.0/16 

По-логике токену вообще сеть не должна быть нужна.

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

И ещё, в продолжение. Даже если запускаю контейнер с опцией --network=host вместо моей сети и утилита pcsc_scan наконец-то начинает корректно работать, команды доступа к токену продолжают вести себя странно:
1) На просьбу перечислить все контейнеры /opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifyc -fqcn идёт ответ:

CSP (Type:80) v4.0.9019 KC2 Release Ver:4.0.9963 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 17409331
OK.
Total: SYS: 0.000 sec USR: 0.000 sec UTC: 0.070 sec
[ErrorCode: 0x00000000]

вместо перечня ключей на токене

2) Команда /opt/cprocsp/bin/amd64/certmgr -list -cont '\\.\Aktiv Co. Rutoken S 00 00' вместо вывода сертификата выдаёт:

Certmgr 1.1 (c) "Crypto-Pro",  2007-2018.
program for managing certificates, CRLs and stores

Cannot open container

Keyset does not exist
[ErrorCode: 0x80090016]

3) на просьбу перечислить ключи на токене командой /usr/lib/jvm/zulu-8-amd64/jre/bin/keytool -list -keystore NONE -storetype rutokenstore (вместо запроса пин-кода и последовательного вывода всех ключей) идёт ответ:

keytool error: java.security.KeyStoreException: RUTOKENSTORE not found

4) в панели управления CSP RUTOKENSTORE отсутствует:
https://forum.rutoken.ru/uploads/images/2019/12/5d574ef4d98a6910a88f00ab4de402d2.png

Причём локально, не в контейнере, всё работает.

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

Здравствуйте,

Если Рутокен подключить к хосту, затем запустить контейнер и не отключать Рутокен на все время работы контейнера, то можно обойтись пробросом через опцию --device (https://docs.docker.com/engine/referenc … r---device)
Тогда исходная команда сократится до
sudo docker run -it --device=/dev/bus/usb/002/003 -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --publish=8083:8081  --rm=true example_auth
Но при отключении Рутокена от компьютера он может изменить свой путь (например станет /dev/bus/usb/002/004). Также при отключении-подключении устройства его файл устройства (/dev/bus/usb/002/004) удаляется и создается заново. Однако при пробросе конкретного файла (или файла устройства) внутрь контейнера если меняется его inode (например файл удаляется и создается новый по тому же пути, но с другим inode), внутри контейнера будет виден старый файл со старым содержимым (подробнее https://forums.docker.com/t/modify-a-fi … /2813/14).
Для того, чтобы при работающем контейнере можно было пробросить вновь подключенное устройство, необходимо добавить флаг --privileged (https://stackoverflow.com/questions/374 … v-symlinks) (добавляет доступ ко всем доступным в системе устройствам, подробнее https://docs.docker.com/engine/referenc … bilities). Также необходимо добавить --volume=/dev/bus/usb:/dev/bus/usb:ro для того, чтобы внутри запущенного контейнера было видно вновь подключенное  устройство, --volume=/run/udev:/run/udev:ro (https://stackoverflow.com/questions/417 … -container) и --network=host (https://stackoverflow.com/questions/496 … -container) для того, чтобы демон udev в контейнере увидел событие подключения нового устройства.
Таким образом если планирутеся при запущенном контейнере подключать и отключать Рутокен, то команда запуска контейнера будет выглядеть следующим образом:
sudo docker run -it --privileged --volume=/dev/bus/usb:/dev/bus/usb:ro --volume=/run/udev:/run/udev:ro -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --publish=8083:8081 --network=host --rm=true example_auth

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