Работа с СКЗИ и аппаратными ключевыми носителями в Linux

  • Tutorial

Хранение ключей на токенах и смарт-картах обеспечивает дополнительную защиту от внешних и внутренних нарушителей, в том числе имеющих определенный уровень доступа к информационной системе и оборудованию.

Сегодня я расскажу, как мы защищаем ключи шифрования и электронной подписи в наших информационных системах, и сделаю это в подробном, хорошо проиллюстрированном руководстве по настройке SUSE Linux Enterprise Server 12 SP3 для работы с токеном Aladdin JaCarta PKI и КриптоПро CSP KC2 4.0.9944.

Опубликовать данное руководство побудило несколько причин:

Причина 1


Официальная документация на Aladdin-RD JaCarta больше адаптирована под операционные системы Astra Linux и ALT Linux, сертифицированные в Минобороны, ФСТЭК и ФСБ как средства защиты информации.

Причина 2


Лучшая инструкция по настройке взаимодействия с аппаратными носителями в Linux, которую удалось найти, была также от wiki.astralinux.ru — Работа с КриптоПро CSP

Причина 3


UPD 16.04.2019: В процессе настройки среды и оборудования выяснилось, что носитель, первым оказавшийся в распоряжении, был вовсе не JaCarta PKI Nano, как ожидалось, а устройство работающее в режиме SafeNet Authentication Client eToken PRO.

UPD 16.04.2019: Некогда Банку требовалось устройство, которое могло бы работать в той же инфраструктуре, что и eToken PRO (Java). В качестве такого устройства компания “ЗАО Аладдин Р.Д.” предложила токен JaCarta PRO, который был выбран банком. Однако на этапе формирования артикула и отгрузочных документов сотрудником компании была допущена ошибка. Вместо модели JaCarta PRO в артикул и отгрузочные документы случайно вписали JaCarta PKI.

UPD 16.04.2019: Благодарю компанию Аладдин Р.Д., за то что помогли разобраться и установить истину.

В этой ошибке нет никаких политических и скрытых смыслов, а только техническая ошибка сотрудника при подготовке документов. Токен JaCarta PRO является продуктом компании ЗАО “Аладдин Р.Д.”. Апплет, выполняющий функциональную часть, разработан компанией “ЗАО Аладдин Р.Д”.


Этот eToken PRO относился к партии, выпущенной до 1 декабря 2017 года.
После этой даты компания «Аладдин Р.Д.» прекратила продажу устройств eToken PRO (Java).

Забегая немного вперед, нужно сказать, что работа с ним настраивалась через соответствующие драйверы — SafenetAuthenticationClient-10.0.32-0.x86_64, которые можно получить только в поддержке Аладдин Р.Д. по отдельной online заявке.

В КриптоПро CSP для работы с этим токеном требовалось установить пакет cprocsp-rdr-emv-64 | EMV/Gemalto support module.

Данный токен определялся и откликался. При помощи утилиты SACTools из пакета SafenetAuthenticationClient можно было выполнить его инициализацию. Но при работе с СКЗИ он вел себя крайне странно и непредсказуемо.

Проявлялось это следующим образом, на команду:

csptest -keyset -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] (205D325E5842) 00 00\alfa_shark' -check 

Выдавался ответ, что все хорошо:

[ErrorCode: 0x00000000]

Но сразу после попытки зачитать ключи программно эта же проверка начинала выдавать ошибку:

[ErrorCode: 0x8009001a]

Согласно перечню кодов ошибок объектной модели компонентов Microsoft COM Error Codes (Security and Setup)

NTE_KEYSET_ENTRY_BAD
0x8009001A
Keyset as registered is invalid.

«Невалидный набор ключей» — причина такого сообщения, возможно, кроется либо в старом чипе, прошивке и апплете Gemalto, либо в их драйверах для ОС, которые не поддерживают новые стандарты формирования ЭП и функции хэширования ГОСТ Р 34.10-2012 и ГОСТ Р 34.11-2012.

В таком состоянии токен блокировался. СКЗИ начинало показывать неактуальное состояние считывателя и ключевого контейнера. Перезапуск службы криптографического провайдера cprocsp, службы работы с токенами и смарт-картами pcscd и всей операционной системы не помогали, только повторная инициализация.

Справедливости ради требуется отметить, что SafeNet eToken PRO корректно работал с ключами ГОСТ Р 34.10-2001 в ОС Windows 7 и 10.

Можно было бы попробовать установить СКЗИ КриптоПро CSP 4.0 ФКН (Gemalto), но целевая задача — защитить наши ключи ЭП и шифрования с помощью сертифицированных ФСБ и ФСТЭК изделий семейства JaCarta, в которых поддерживаются новые стандарты.

Проблему удалось решить, взяв настоящий токен JaCarta PKI в (XL) обычном корпусе.

Но на попытки заставить работать Safenet eToken PRO времени было потрачено немало. Хотелось обратить на это внимание и, возможно, кого-то оградить от подобного.

Причина 4


Иногда самому требуется вернуться к старым статьям и инструкциям. Это удобно, когда информация размещена во внешнем источнике. Так что спасибо Хабру за предоставленную возможность.

Руководство по настройке


После установки токена JaCarta PKI в USB порт сервера и запуска системы проверяем, что новое устройство обнаружено и появилось в списке:

lsusb



В нашем случае это Bus 004 Device 003: ID 24dc:0101

Для диагностики считывателей можно воспользоваться утилитой pcsc-tools из проекта security:chipcard (software.opensuse.org).

Запускается командой:

pcsc_scan



Пока не установлены все необходимые пакеты, информация о токене не отобразится.

Установка драйверов и ПО для работы с JaCarta PKI


На странице Поддержки сайта «Аладдин Р.Д.» загружаем Документацию и программное обеспечение для работы только с JaCarta PKI

Согласно Руководству по внедрению «JaCarta для Linux» пункт 4.2., первым делом требуется установить пакеты pcsc-lite, ccid и libusb.
Для работы утилиты управления JaCarta необходимо установить следующие компоненты:

  • PC/SC Lite — промежуточный слой для обеспечения доступа к смарт-картам по стандарту PC/SC, пакет pcsc-lite.
  • Библиотеки ccid и libusb для работы с USB-ключами, смарт-картами и считывателями смарт-карт.
Выполняем проверку наличия этих пакетов и установку:

zypper search pcsc-lite



zypper search libusb



zypper install pcsc-lite





zypper search CCID



zypper install pcsc-ccid



zypper search CCID



zypper install libusb



В итоге пакет pcsc-lite был обновлен, CCID установлен, libusb никаких действия не требовалось.

Следующими двумя командами выполняем установку пакета с драйверами и программным обеспечением непосредственно для работы с JaCarta PKI:

zypper install idprotectclientlib-637.03-0.x86_64.rpm



zypper install idprotectclient-637.03-0.x86_64.rpm



Проверяем, что драйверы и ПО для JaCarta PKI установились:

zypper search idprotectclient



При попытках заставить работать SafeNet eToken PRO я нашел информацию, что предустановленный в SLES пакет openct — Library for Smart Card Readers может конфликтовать с pcsc-lite — PCSC Smart Cards Library, установку которого требует руководство Аладдин Р.Д.

zypper search openct



Поэтому пакет openct удаляем:

rpm -e openct

Теперь все необходимые драйверы и ПО для работы с токеном установлены.

Выполняем диагностику с помощью утилиты pcsc-tools и убеждаемся, что JaCarta определяется в операционной системе:

pcsc_scan



Установка пакетов КриптоПро CSP


При установке КриптоПро CSP по умолчанию нужные пакеты для работы с токенами и смарт-картами отсутствуют.

zypper search cprocsp



Выполняем установку в CSP компонента поддержки JaCarta components for CryptoPro CSP

zypper install cprocsp-rdr-jacarta-64-3.6.408.683-4.x86_64.rpm



Некоторые компоненты имеют зависимости. Так, например, если попытаться выполнить установку пакета поддержки SafeNet eToken PRO cprocsp-rdr-emv-64-4.0.9944-5.x86_64.rpm — EMV/Gemalto support module, то получим сообщение о необходимости сначала установить базовый компонент CSP поддержки считывателей cprocsp-rdr-pcsc-64-4.0.9944-5.x86_64.rpm — PC/SC components for CryptoPro CSP readers:

zypper install cprocsp-rdr-emv-64-4.0.9944-5.x86_64.rpm
Loading repository data...
Reading installed packages...
Resolving package dependencies...

Problem: nothing provides cprocsp-rdr-pcsc-64 >= 4.0 needed by cprocsp-rdr-emv-64-4.0.9944-5.x86_64
 Solution 1: do not install cprocsp-rdr-emv-64-4.0.9944-5.x86_64
 Solution 2: break cprocsp-rdr-emv-64-4.0.9944-5.x86_64 by ignoring some of its dependencies

Choose from above solutions by number or cancel [1/2/c] (c): c

Устанавливаем базовые пакеты поддержки считывателей и ключевых носителей:

zypper install cprocsp-rdr-pcsc-64-4.0.9944-5.x86_64.rpm



zypper install lsb-cprocsp-pkcs11-64-4.0.9944-5.x86_64.rpm

Теперь можно установить модули для работы с остальными видами носителей и компонент GUI:

zypper install cprocsp-rdr-emv-64-4.0.9944-5.x86_64.rpm



zypper install cprocsp-rdr-novacard-64-4.0.9944-5.x86_64.rpm
zypper install cprocsp-rdr-mskey-64-4.0.9944-5.x86_64.rpm
zypper install cprocsp-rdr-gui-gtk-64-4.0.9944-5.x86_64.rpm



Проверяем итоговую конфигурацию КриптоПро CSP:

zypper search cprocsp
Loading repository data...
Reading installed packages...


S | Name | Summary | Type
---+-----------------------------+----------------------------------------------------+--------
i+ | cprocsp-curl-64 | CryptoPro Curl shared library and binaris. Build 9944. | package
i+ | cprocsp-rdr-emv-64 | EMV/Gemalto support module | package
i+ | cprocsp-rdr-gui-gtk-64 | GUI components for CryptoPro CSP readers. Build 9944. | package
i+ | cprocsp-rdr-jacarta-64 | JaCarta components for CryptoPro CSP. Build 683. | package
i+ | cprocsp-rdr-mskey-64 | Mskey support module | package
i+ | cprocsp-rdr-novacard-64 | Novacard support module | package
i+ | cprocsp-rdr-pcsc-64 | PC/SC components for CryptoPro CSP readers. Build 9944.| package
i+ | lsb-cprocsp-base | CryptoPro CSP directories and scripts. Build 9944. | package
i+ | lsb-cprocsp-ca-certs | CA certificates. Build 9944. | package
i+ | lsb-cprocsp-capilite-64 | CryptoAPI lite. Build 9944. | package
i+ | lsb-cprocsp-kc2-64 | CryptoPro CSP KC2. Build 9944. | package
i+ | lsb-cprocsp-pkcs11-64 | CryptoPro PKCS11. Build 9944. | package
i+ | lsb-cprocsp-rdr-64 | CryptoPro CSP readers. Build 9944. | package




Чтобы применить изменения, выполняем перезапуск службы криптографического провайдера и проверяем ее статус:

/etc/init.d/cprocsp restart
/etc/init.d/cprocsp status



Настройка и диагностика КриптоПро CSP


Проверим, видит ли криптографический провайдер наш токен и другие доступные типы носителей следующими командами:

/opt/cprocsp/bin/amd64/csptest -card -enum -v –v



/opt/cprocsp/bin/amd64/csptest -enum -info -type PP_ENUMREADERS | iconv -f cp1251



/opt/cprocsp/sbin/amd64/cpconfig -hardware reader -view -f cp1251



Aladdin R.D. JaCarta [SCR Interface] (000000000000) 00 00 — это наш носитель.

Следуя инструкции КриптоПро CSP для Linux. Настройка, выполняем его регистрацию в криптографическом провайдере:

/opt/cprocsp/sbin/amd64/cpconfig -hardware reader -add "Aladdin R.D. JaCarta [SCR Interface] (000000000000) 00 00"



В результате выполнения в конфигурационный файл /etc/opt/cprocsp/config64.ini
в раздел [KeyDevices\PCSC] будет добавлена запись:

[KeyDevices\PCSC\"Aladdin R.D. JaCarta [SCR Interface] (000000000000) 00 00"\Default]


Чтобы выполнить требования Формуляра, Правил пользования и Руководства администратора безопасности КриптоПро CSP:
Использование СКЗИ «КриптоПро CSP» версии 4.0 с выключенным режимом усиленного контроля использования ключей не допускается. Включение данного режима описано в документах ЖТЯИ.00087-01 91 02. Руководство администратора безопасности.
Необходимо включить режим усиленного контроля использования ключей:

/opt/cprocsp/sbin/amd64/cpconfig -ini '\config\parameters' -add long StrengthenedKeyUsageControl 1

Проверяем, что режим включен:

cat /etc/opt/cprocsp/config64.ini | grep StrengthenedKeyUsageControl



Выполняем перезапуск службы криптографического провайдера:

/etc/init.d/cprocsp restart
/etc/init.d/cprocsp status

После перезапуска проверяем, что ошибок в работе провайдера с ключевыми носителями нет:

/opt/cprocsp/bin/amd64/csptest -keyset –verifycontext



/opt/cprocsp/bin/amd64/csptest -keyset -verifycontext -enum –unique

CSP (Type:80) v4.0.9017 KC2 Release Ver:4.0.9944 OS:Linux CPU:AMD64 FastCode:REA
AcquireContext: OK. HCRYPTPROV: 16052291
alfa_shark1                        |SCARD\JACARTA_4E3900154029304C\CC00\E9F6
OK.
Total: SYS: 0.000 sec USR: 0.000 sec UTC: 4.560 sec
[ErrorCode: 0x00000000]

Работа с токеном JaCarta PKI


Запустим программу Xming (X11 forwarding) на своей станции, чтобы по SSH иметь возможность открывать и работать с графическими интерфейсами нужных утилит.



После установки IDProtectClient — программного обеспечения для работы с JaCarta PKI, на сервере в папке /usr/share/applications появились два файла:

Athena-IDProtectClient.desktop
Athena-IDProtectManager.desktop

Это ярлыки, в которых можно посмотреть параметры запуска утилит Exec=/usr/bin/SACTools

Запустим утилиту IDProtectPINTool.

С помощью нее задаются и меняются PIN-коды доступа к токену.

/usr/bin/IDProtectPINTool



При первой инициализации токена будет полезна ссылка, содержащая PIN-коды (пароли) ключевых носителей по умолчанию

Программа IDProtect_Manager позволяет просматривать информацию о токене и контейнере с ключами и сертификатом:

/usr/bin/IDProtect_Manager



Для доступа к контейнеру с ключами нужно ввести пароль:





Для работы с SafeNet Authentication Client eToken PRO существуют аналогичные программы — SafeNet Authentication Client Monitor и SafeNet Authentication Client Tools, которые запускаются так:

/usr/bin/SACMonitor
/usr/bin/SACTools



Выполнять операции непосредственно с ключевыми контейнерами удобнее в интерфейсе криптографического провайдера КриптоПро JavaCSP:

/jdk1.8.0_181/jre/bin/java ru.CryptoPro.JCP.ControlPane.MainControlPane




Для отображения информации о содержимом контейнера с ключами можно выполнить команду:

/opt/cprocsp/bin/amd64/csptest -keyset -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] (000000000000) 00 00\alfa_shark1' -info

Для диагностики контейнера используется эта же команда с ключом –check

/opt/cprocsp/bin/amd64/csptest -keyset -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] (000000000000) 00 00\alfa_shark' –check

Потребуется ввести пароль от контейнера:





Программное извлечение ключей


В общем виде пример извлечения закрытого ключа и сертификата открытого ключа из контейнера на токене с помощью КриптоПро Java CSP следующий:

import ru.CryptoPro.JCP.KeyStore.JCPPrivateKeyEntry;
import ru.CryptoPro.JCP.params.JCPProtectionParameter;


 KeyStore keyStore = KeyStore.getInstance("Aladdin R.D. JaCarta [SCR Interface] (000000000000) 00 00", "JCSP");
            keyStore.load(null, null);

        JCPPrivateKeyEntry entry = null;
        X509Certificate certificate = null;
        PrivateKey privateKey = null;

        try {
         
            entry = (JCPPrivateKeyEntry) keyStore.getEntry(keyAlias,
                    new JCPProtectionParameter(pwd));
            
            certificate = (X509Certificate) entry.getCertificate();
            privateKey = entry.getPrivateKey();
         
        } catch (UnrecoverableEntryException | NullPointerException e) {
            LOGGER.log(Level.WARNING, PRIVATE_KEY_NOT_FOUND + keyAlias + ExceptionUtils.getFullStackTrace(e));
        }


Если действовать так:

Key key = keyStore.getKey(keyAlias, pwd);

то криптографический провайдер будет пытаться в системе отобразить через консоль или GUI окно запрос на ввод пароля к контейнеру.

Результаты


Отторгаемый ключевой носитель-токен установлен во внутренний USB-порт сервера.

Само серверное оборудование опломбировано и размещается в помещении с ограниченным доступом.

Такие меры позволяют повысить уровень защиты наших информационных систем от кражи и компрометации ключей электронной подписи или шифрования, как удаленно по сети, так и физически.

Полезные ссылки


  1. Документация Aladdin-RD JaCarta
  2. wiki.astralinux.ru — Работа с КриптоПро CSP
  3. Перечень кодов ошибок объектной модели компонентов Microsoft COM Error Codes (Security and Setup)
  4. СКЗИ КриптоПро CSP 4.0 ФКН (Gemalto)
  5. Утилита диагностики считывателей pcsc-tools из проекта security:chipcard (software.opensuse.org)
  6. КриптоПро CSP для Linux. Настройка.
  7. Aladdin-RD PIN-коды (пароли) ключевых носителей по умолчанию
Альфа-Банк
298,00
Компания
Поделиться публикацией

Комментарии 22

    +1
    Работа с СКЗИ и аппаратными ключевыми носителями в Linux

    Т.е. речь не идет о токенах с поддержкой интерфейса PKCS#11 и российской криптографии на них? Словосочетание "ключевые носителм" фактически подразумевают хранение ключа на влешке, пусть даже с PIN-кодом?!

      +2
      Заголовок обобщенный. Речь идет о токенах с поддержкой интерфейса PKCS#11 и российской криптографии на них. Руководство так же косвенно может помочь настроить работу с флэшкой и поместить на нее HDIMAGE программный контейнер с ключами.
      +1
      Не могли бы вы дополнить «Программное извлечение ключей» сохранение приватного ключа в pem-файл.
        +1
        Так тут все просто. В общем виде сохранить Java сериализованный ключ можно так:

           FileOutputStream fos = new FileOutputStream(new File("key.pem"));
           fos.write(Base64.encodeToByte(privateKey.getEncoded(), false));
           fos.close();
        


        Только не советую это делать. Да и не вижу реальных пользовательских кейсов для такого в программном обеспечении.

        Если надо куда-то скопировать, экспортировать ключи, то лучше это сделать руками в СКЗИ.

        В ПО наоборот надо позаботиться о безопасности ключа и пароля от контейнера. Пароль разделяем, шифруем и прячем. Склеиваем, расшифровываем пароль в потоке для одноразового чтения, извлекаем ключ и храним в памяти доли секунды для непосредственного использования.
        0
        Этот eToken PRO относился к партии, выпущенной до 1 декабря 2017 года.
        После этой даты компания «Аладдин Р.Д.» прекратила продажу устройств eToken PRO (Java) в связи с завершением поддержки и поставок производителем — компанией Gemalto, к слову, чуть раньше поглотившей SafeNet, Inc.

        Это не совсем корректная информация. Ключи eToken Pro Java продаются и поддерживаются компанией Gemalto. Более того, линейка развивается и выходят новые версии ключей: habr.com/ru/post/281256

        Забегая немного вперед, нужно сказать, что работа с ним настраивалась через соответствующие драйверы — SafenetAuthenticationClient-10.0.32-0.x86_64, которые можно получить только в поддержке Аладдин Р.Д. по отдельной online заявке.

        Middleware, наверное, всё же лучше запрашивать у производителя или официального дистрибутора продуктов Gemalto.
          0
          Это не совсем корректная информация. Ключи eToken Pro Java продаются и поддерживаются компанией Gemalto. Более того, линейка развивается и выходят новые версии ключей: habr.com/ru/post/281256


          Токен, который у нас оказался SafeNet, был куплен в Аладдин Р.Д. Есть номер договора, дата и партия, в которой он состоял.
          Первоначально возникло недоразумение, все считали, в том числе поддержка Аладдин Р.Д., что он JaCarta PKI, а факты работы с ним через SAC Tools, а не IDProtect, доказали обратное. И на тот момент он был уже в опломбированном сервере в удаленном ВЦ.

          Middleware, наверное, всё же лучше запрашивать у производителя или официального дистрибутора продуктов Gemalto.


          Разумное утверждение.

          Мы и запросили там, где покупали — у официального дистрибьютора продуктов Gemalto, которым был Аладдин Р.Д вплоть до 1 декабря 2017 года, согласно информации на сайте Аладдин Р.Д
          +1
          Добрый день.
          Хотелось бы некоторые вещи уточнить.
          1) Для работы с таким токеном не нужен ни пакет pkcs11, ни emv. Пакет emv предназначен для банковских карт Gemalto (в основном это семейство Optelio), а не токенов.
          2) Для работы с JaCarta достаточно поставить пакет cprocsp-rdr-jacarta из состава провайдера.
          3) Действительно, существуют некоторые токены компании Аладдин, которые бинарно повторяют токены компании SafeNet и отличить их невозможно. Иногда они работают через софт SafeNet, иногда нет.
          4) Официальной поддержки токенов SafeNet на Linux в КриптоПро CSP нет и пока не планируется.
            0
            Здравствуйте!

            По пункту 2, да, для JaCarta достаточно — cprocsp-rdr-jacarta.
            Другие пакеты оставил исключительно для иллюстрации:
            cprocsp-rdr-novacard-64-4.0.9944-5.x86_64.rpm
            cprocsp-rdr-mskey-64-4.0.9944-5.x86_64.rpm

            Спасибо за уточнения!
            0
            Официальным дистрибьютором ключей Gemalto/SafeNet является компания TESSIS, по запросу они предоставляют SAC для различных платформ — Windows, Linux, MacOS.
            Фраза «В процессе настройки среды и оборудования выяснилось, что носитель, первым оказавшийся в распоряжении, был вовсе не JaCarta PKI Nano, как ожидалось, а SafeNet Authentication Client eToken PRO с микроконтроллером Gemalto на борту в корпусе JaCarta PKI Nano.» очень интересная :-)
            У Gemalto есть своя линейка ключей — eToken Pro, eToken 5100, и актуальные на сегодняшний день eToken 5110. Чипы у Gemalto и JaCarta абсолютно разные, но функциональность ключа определяется не только чипом, но и апплетом, залитым на ключ. И тут есть интересная история… Если ключ JaCarta PKI открыть в приложении SafeNet Authentication Client и посмотреть версию апплета, то, скорее всего, там будет прописано eToken 1.0.37. Это апплет, разработанный компанией aladdin knowledge system (та самая израильская компания, которая является разработчиком eToken, которую купила SafeNet, а затем Gemalto). Это очень старый апплет, который глобально в мире не использовался, но в Россию как-то попал (причем в корпус JaCarta). Историческую справку по данному факту можно посмотреть здесь — zlonov.ru/2017/02/private-opinion
              0
              Вот так и собираем информацию по крупицам из разных не всегда даже полуофициальных источников. Все так запутано с правами и авторством, что простому пользователю крайне сложно разобраться.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое