Токены PKCS#11: генерация ключевой пары и неизвлекаемость приватного ключа (Продолжение) / Хабр

Токены PKCS#11: генерация ключевой пары и неизвлекаемость приватного ключа (Продолжение) / Хабр Электронная цифровая подпись
Содержание
  1. Почему это важно?
  2. Получается, что рутокен эцп и jacarta гост не являются токенами с неизвлекаемым ключом?
  3. Итак, что такое ключевая пара?
  4. Как сделать, чтобы все было хорошо?
  5. А откуда берется закрытый ключ?
  6. Еще немного безопасности
  7. Запись ключа на рутокен
  8. Как можно сохранить свой ssh-ключ на аппаратном токене fido2
  9. Конвертация в формат для openssl
  10. Конфигурация сервера
  11. Конфигурация тестового стенда
  12. Копирование на файловую систему
  13. Матчасть
  14. Методика тестирования
  15. Монтируем созданный том
  16. Нас интересуют атрибуты извлекаемости закрытого ключа.
  17. Настройки клиентской машины
  18. Подключаем рутокен к usb порту
  19. Подключение к серверу
  20. По-новому взглянем на наш тестовый стенд
  21. При успешном добавлении он появится в списке с именем, которое вы указали.
  22. Проведение тестирования
  23. Снятие запрета на экспорт
  24. Создаем зашифрованный том
  25. Создаем ключевой файл
  26. Тест на практике
  27. Устанавливаем truecrypt и драйвер для рутокен

Почему это важно?

Аппаратные ключи заметно повышают уровень безопасности любого решения. Вообще говоря, и до релиза OpenSSH 8.2 существовали методы использования аппаратных ключей совместно с SSH. Например, можно использовать сервер PrivacyIdea, хранить приватные SSH-ключи на аппаратном токене, используя PIV или же OpenPGP. Неплохая сводка таких решений доступна на сайте Yubico.

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

Новый подход выглядит многообещающе: он поддерживается стандартно самим пакетом OpenSSH и очень напоминает обычную схему работы с SSH-ключами. Никакого дополнительного ПО, сложных конфигураций, преднастройки аппаратных ключей и прочего. Вы берете аппаратный ключ, генерируете SSH-ключ специального типа, добавляете публичный ключ на ваш сервер, как и обычно — и готово! Давайте посмотрим, как это работает в реальной жизни.

Получается, что рутокен эцп и jacarta гост не являются токенами с неизвлекаемым ключом?

Опять нет. Данные устройства могут реализовывать функционал ФКН (но, возможно, в меньшем объеме, чем при использовании их совместно с СКЗИ КриптоПРО), но для этого нужен софт, который умеет работать с апплетами размещенными на токенах. Таким софтом может быть КриптоАРМ Стандарт 5 Плюс.

Итак, что такое ключевая пара?

Ключевая пара включает в себя два ключа:

Следует помнить, что закрытый и открытый ключи это не только их значения (для открытого ключа ГОСТ Р 34.10-2001 это 512 бит), но и параметры схемы цифровой подписи (п. 5.2

). В дальнейшем параметры схемы цифровой подписи для простоты будем называть параметрами (криптопараметрами) ключевой пары.

Открытый ключ подписи вычисляется, как значение некоторой функции от закрытого ключа, но знание открытого ключа не дает возможности определить закрытый ключ.

Для ключевых пар ГОСТ Р 34.10-2001 и ГОСТ Р 34.10-2022 с длиной закрытого ключа 256 бит (соответственно, публичный ключ – 512 бит) определены следующие криптопараметры:id-GostR3410-2001-CryptoPro-A-ParamSet;id-GostR3410-2001-CryptoPro-B-ParamSet;

id-GostR3410-2001-CryptoPro-C-ParamSet;id-GostR3410-2001-CryptoPro-XchA-ParamSet;id-GostR3410-2001-CryptoPro-XchB-ParamSet.Для ключевых пар ГОСТ Р 34.10-2022 с длиной закрытого ключа 512 бит (соответственно, публичный ключ – 1024 бита) определены следующие криптопараметры («Информационная технология. Криптографическая защита информации. Параметры эллиптических кривых для криптографических алгоритмов и протоколов»):

  1. id-tc26-gost-3410-2022-512-paramSetA;
  2. id-tc26-gost-3410-2022-512-paramSetB.


Состав криптопараметров определен в

. В этот состав входит простое число

q

— порядок подгруппы группы точек эллиптической кривой:


И именно оно определяет длину закрытого/открытого ключей и корректность закрытого ключа:

imageimage
И так, открытый ключ получается из закрытого ключа.

Как сделать, чтобы все было хорошо?

Чтобы с помощью продуктов ООО “КРИПТО-ПРО” реализовать технологию ФКН, необходимо:

1. Купить специальную версию библиотеки СКЗИ: — для Рутокен ЭЦП — СКЗИ КриптоПРО Рутокен CSP. — для JaCarta ГОСТ – СКЗИ КриптоПро ФКН CSP.

2. Одновременно с библиотекой СКЗИ необходимо приобрести специально подготовленные токены, содержащие в себе программные части (апплеты), с которыми умеет работать КриптоПРО Рутокен CSP или КриптоПро ФКН CSP соответственно.

А откуда берется закрытый ключ?

Для получения закрытого ключа сначала необходимо решить какой длины будет закрытый ключ (256 или 512 бит), затем определиться с криптопараметрами ключевой пары. Теперь берем датчик случайных чисел и получаем случайное число соответствующей длины. Собственно это случайное число и должно стать значением

d

закрытого ключа (ключом подписи d). Это значение должно удовлетворять следующему правилу:

0 < d < q, где q– простое число из криптопараметров.

Что делать, если это условие не выполняется? Если d == 0, то просто сгенерировать новое случайное число. В противном случае достаточно бывает взять остаток от деления на цело значения d, которое превышает q, на q (d % q). Остаток и станет значением закрытого ключа.

Именно поэтому регулятор (ФСБ России) предъявляет особые требования к датчику случайных чисел.

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

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

Таким образом, чтобы токен/смарткарта PKCS#11 могли генерировать внутри себя ключевую пару, необходимо наличие токен/смарткарта встроенного аппаратного датчика случайных чисел, соответствующего требованиям регулятора. И только тогда можно говорить о неизвлекаемости закрытого ключа.

Для генерации ключевой пары используется фунция C_GenerateKeyPair. В зависимости от того, какую ключевую пару (с какой длиной закрытого ключа 256 или 512 бит) мы генерируем, в ней будет использоваться соответствующий механизм:

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

Читайте также:  Установка сертификата ЭЦП на компьютер: с флешки в реестр, с чего начать

Еще немного безопасности

Вы можете разрешить подключение по SSH только с ключами, которые работают в паре с аппаратными токенами. Это вполне возможно и довольно легко настраивается — нужно лишь в явном виде указать, какие типы ключей мы разрешаем.

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

Итак, подключаемся к серверу, используем sudo для получения привилегий root и открываем файл /etc/ssh/sshd_config в удобном вам текстовом редакторе.

Нам нужно добавить следующую строчку:

Запись ключа на рутокен

Все готово, чтобы ключ записать на рутокен —

СервисКлючевые файлы токена безопасности

. Должен появится запрос пароля Рутокена(если его не появилось, видимо библиотека не была указана), вводим пароль пользователя рутокен (по умолчанию 12345678). В открывшемся окне нажимаем «

Импорт кл. файла в токен

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

Как можно сохранить свой ssh-ключ на аппаратном токене fido2

Процитируем официальную документацию OpenSSH (в нашем переводе):

FIDO/U2F OpenSSH ключи состоят из двух частей: key handle, которая хранится в файле на диске, и приватный ключ, уникальный для каждого FIDO/U2F аппаратного токена, неизвлекаемый из него. Токен соединяет эти две части в момент аутентификации для получения реального ключа, который затем используется (для подписи запроса аутентификации).

Для ключей, которые нужно переносить между машинами, может стать проблемой то, что нужно копировать файл с приватным ключом. Чтобы избежать этого, токены, реализующие более новый стандарт FIDO2, поддерживают так называемые резидентные ключи. Это позволяет извлечь key handle из аппаратного ключа.

Итак, если у вас есть FIDO2-совместимый токен (в нашем случае это Yubikey 5), вы можете использовать ssh-keygen с параметром -O resident при генерации пары ключей SSH. В дальнейшем вы сможете извлечь ваши SSH-ключи из токена и записать на диск в виде файлов.

Команда целиком может выглядеть примерно так:

ssh-keygen -t ecdsa-sk -O resident -C “yubi-8945”

Этот подход позволяет вам быть уверенным что ваши SSH-ключи у вас с собой всегда, когда с собой ваш Yubikey или другой аппаратный токен. Вам не нужно беспокоиться о копировании приватных и публичных SSH-ключей (в виде файлов) между разными машинами. Это довольно удобно, но нужно учитывать и связанные с этим риски.

Итак, если вам нужно начать работу в новом окружении (на новой машине), достаточно подключить ваш Yubikey и запустить команду

ssh-keygen -K

Эта команда извлечет все записанные SSH-ключи (как приватные, так и публичные!) и сохранит в виде файлов на диске.

Во-первых, если вы решите хранить свои SSH-ключи на токене, необходимо защитить его с помощью PIN-кода. Иначе любой, кто получит доступ к токену, сможет использовать и ваши SSH-ключи.

Для ключей Yubikey можно использовать официальное приложение Yubikey Manager.

Если FIDO2 PIN установлен, любой, кто попытается извлечь SSH-ключи из вашего токена, должен будет ввести код. Мы настоятельно рекомендуем установить PIN, если вы планируете воспользоваться функцией резидентных SSH-ключей.

Во-вторых, обратите внимание, что когда вы извлекаете SSH-ключи из вашего токена с помощью команды ssh-keygen -K, файлы приватных ключей на диске не будут защищены парольной фразой! Даже если вы устанавливали пароль при генерации ключа, при извлечении из аппаратного токена файлы будут в открытом виде.

Конвертация в формат для openssl

Для взимодействия с API обычно используют openssl.

К сожалению, в сертификатах РФ используется свой стандарт шифрования (ГОСТ), поэтому обычный openssl не подходит, нужен патченный.

Конфигурация сервера

Как вы помните, в качестве сервера у нас виртуальный сервер от ATLEX с предустановленной Ubuntu 20.04 LTS. Мы предполагаем, что наш сервер доступен по SSH и некоторая его предварительная настройка уже произведена (например, добавлен пользователь с правами sudo, запрещен доступ рутом по SSH, запрещен доступ через SSH по паролям и разрешен только по публичным ключам). Хотя такая настройка и необязательно для этой статьи, мы рекомендуем произвести ее в целях безопасности.

Ок, теперь давайте зайдем на сервер по SSH и для начала проверим версию ОС и пакета SSH.

$ cat /etc/issue

Ubuntu 20.04 LTS n l

(все верно, у нас установлена Ubuntu 20.04 LTS)

~$ ssh -V

OpenSSH_8.2p1 Ubuntu-4, OpenSSL 1.1.1f 31 Mar 2020

(и у нас нужная версия SSH, ничего дополнительно устанавливать или апгрейдить не нужно).

Как и в случае с обычными SSH-ключами, нам нужно добавить публичный ключ на сервер. Это можно сделать разными способами, выберем самый простой. На клиентской машине нужно открыть файл <your-new-SSH-key-name>.pub, который мы сгенерировали в предыдущем разделе, в текстовом редакторе и скопировать его содержимое. В нашем случае оно выглядит примерно так:

Конфигурация тестового стенда


Соберем тестовый стенд с конфигурацией, типовой для машин, участвующих в электронном документообороте (ЭДО):

  1. ОС MS Windows 7 SP1
  2. СКЗИ КриптоПРО CSP 3.9.8423
  3. Драйверы Рутокен для Windows (x86 и x64). Версия: v.4.1.0.0 от 20.06.2022, WHQL-certified
  4. Единый Клиент JaCarta и JaCarta SecurLogon. Версия 2.9.0 сборка 1531
  5. КриптоАРМ Стандарт Плюс 5. Версия 5.2.0.8847.
Читайте также:  4.1.        Импульсные сигналы и электронный ключ | Электротехника

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

  1. Рутокен ЭЦП. Версия 19.02.14.00 (02)
  2. JaCarta ГОСТ. Номер модели JC001-2.F09 v2.1

Копирование на файловую систему

Вначале создадим копию контейнера с токена на файловую систему.

Матчасть

То, что на рынке принято называть токеном с неизвлекаемым ключом, правильно называется функциональным ключевым носителем (ФКН) (доп. инфо).

Главным отличием ФКН от обычных токенов (Рутокен S, JaCarta PKI, …) в том, что при выполнении криптографических преобразований (например, формирование электронной подписи) закрытый ключ не покидает устройство. В то время как при использовании обычных токенов закрытый ключ копируется с токена в память комптьютера.

Использование ФКН требует особой организации взаимодействия между прикладным криптографическим ПО и библиотекой СКЗИ (криптопровайдером или, по-другому, CSP).

Здесь важно увидеть, что программная часть библиотеки СКЗИ должна знать о существовании на токене апплета, реализующего криптографический функционал (например, генерация ключа, подпись данных и т.д.) и уметь с ним работать.

Методика тестирования


Смоделируем типовой процесс подготовки Администратором информационной безопасности ключевых документов для организации ЭДО:

  1. генерируется контейнер закрытого ключа и запрос на сертификат открытого ключа;
  2. после прохождения в удостоверяющем центре процедуры сертификации из запроса получается сертификат;
  3. сертификат в совокупности с контейнером закрытого ключа образует готовую для использования ключевую информацию. Данную ключевую информацию, записанную на носителе, будем называть исходным ключевым документом;
  4. с исходного ключевого документа изготавливаются копии, которые записываются на отчуждаемые носители (далее будем называть их рабочими ключевыми документами) и передаются уполномоченным пользователям;
  5. после изготовления необходимого количества рабочих ключевых документовисходный ключевой документ уничтожается или депонируется на хранение в орган криптографической защиты информации.

В нашем случае мы не будем пользоваться услугами центров сертификации, а сгенерируем ключевой контейнер с самоподписанным сертификатом и разместим его в реестре компьютера (АРМа генерации ключевой информации), это и будет исходный ключевой документ.

Затем скопируем ключевую информацию на Рутокен ЭЦП и JaCarta ГОСТ, изготовив рабочие ключевые документы. После этого уничтожим исходный ключевой документ, удалив из реестра ключевой контейнер. И, наконец, попробуем скопировать ключевую информацию с рабочих ключевых документов обратно в реестр.

Монтируем созданный том


В главном окне TrueCrypt нажимаем «

Файл

», выбираем файл тома и нажимаем «

Смонтировать

Если у Вас не подключен рутокен, то вы получите ошибку «

Ключевой файл токена безопасности не обнаружен

». Подключаете рутокен, если он не подключен. Нажимаем «Ключ.файлы» и выбираем рутокен ключ.

image

Если пароль был введен правильно, а рутокен был подключен и выбран необходимый ключ, то вы увидите смонтированный новый диск. Удачной работы!

Важно! Когда монтирование диска произошло, рутокен необходимо отключить от usb порта, так советуют сами разработчики, чтобы продлить ему жизнь. От себя еще советую настроить автоматическое размонтирование при не активности.

В следующей части расскажу как сделать тоже самое, но уже на операционной системе Linux.

Нас интересуют атрибуты извлекаемости закрытого ключа.

Это прежде атрибут CKA_SENSITIVE, отвечающий за возможность получения значения закрытого ключа. Если значение атрибута CKA_SENSITIVE установлено в CK_TRUE, то закрытый ключ не может быть извлечен из токена в открытом виде. Второй атрибут CKA_EXTRACTABLE позволяет получать закрытый ключ в зашифрованном виде. Для этого его необходимо установить CK_TRUE.

Установка атрибута CKA_SENSITIVE в CK_TRUE, а атрибута CKA_EXTRACTABLE в CK_FALSE при генерации ключевой пары делает закрытый ключ абсолютно неизвлекаемым. Возможность определять является ли ключ экспортабельным имеется в браузере Redfox:

Кто-то скажет, — а что если изменить значения этих атрибутов. Как правило этого сделать нельзя, защиту понизить нельзя, также как «нельзя понижать градус». Точно также можно сделать неизвлекаемым закрытый ключ после его импорта на токен (если конечно токен/смарткарта разрешают импорт).

В последнем случае (при импорте) следует иметь в виду, что хотя закрытый ключ и стал неизвлекаемым, он появился со стороны (например, из PKCS#12), и гарантии, что нет еще где-то его дубликата нету.

И вот здесь не мешало бы напомнить тебе, уважаемый читатель, что безопасность обеспечивается только КОМПЛЕКСОМ организационных и технических мероприятий. Поэтому не получится латать дыры в организационной безопасности за счет технических средств и наоборот — все должно быть органично согласовано. В том числе, и при доступе к значению закрытого ключа.

Убедиться, что на токен/смарткарте находятся полноценные объекты PKCS#11 (CKO_PRIVATE_KEY, CKO_PUBLIC_KEY, CKO_CERTIFICATE), которые участвуют в криптографических операциях на самом токене удобно с помощью доступной для свободного скачивания утилиты p11conf:

Настройки клиентской машины

Для начала проверим версию SSH, запустив ssh -V в терминале.

В нашем случае была установлена версия 8.1. Не проблема — 8.2 доступна для установки через Homebrew.

Итак, запускаем в своем терминале:

brew install openssh

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

ssh -V

Вывод должен быть примерно такой:

OpenSSH_8.2p1, OpenSSL 1.1.1f 31 Mar 2020

Далее можно переходить к генерированию новой пары SSH-ключей с использованием аппаратного токена U2F.

По информации с официального сайта, для поддержки FIDO-токенов в OpenSSH появились два новых типа публичных ключей: «ecdsa-sk» и «ed25519-sk» (-sk означает Security Key). Стоит отметить, что первый тип должен поддерживаться любыми U2F-токенами, а второй — не обязательно.

Читайте также:  Для чего нужна КриптоПро | Принцип работы эцп криптопро

Если вы используете несколько ключей (мы рекомендуем делать именно так, поскольку ключ можно потерять или сломать), возможно, имеет смысл найти серийный номер ключа перед тем как перейти к следующему шагу. Этот номер (или скажем 4 последних цифры) удобно использовать при создании SSH-ключей чтобы различать, какой SSH-ключ связан с каким аппаратным токеном.

Теперь вставим Yubikey в ноутбук и запустим следующую команду в терминале:

ssh-keygen -t ecdsa-sk -C “yubi-8945”

Подключаем рутокен к usb порту


После подключения в TrueCrypt запускаем «Настройки токена безопасности» —

СервиcТокены безопасности

, в открывшемся окне запускаем «

Автоопределение библиотеки

». При успешном поиске путь к библиотеке автоматически заполниться, далее ОК.

image

Подключение к серверу

Настало время попробовать подключиться к серверу с нашим новым ключом.

В терминале на клиентской машине запускаем следующую команду:

ssh -i <your_private_key_filename> <your_server /VPS_name_or_address>

Вывод должен быть примерно такой:

По-новому взглянем на наш тестовый стенд


В качестве одного из ключевых носителей использовался Рутокен ЭЦП. Через «Панель управления Рутокен» о нем можно получить следующую информацию:

В последней строке указана фраза «Поддержка КриптоПРО ФКН: Нет», а это значит, что на токене нет апплета, с которым умеет работать СКЗИ КриптоПРО CSP. Таким образом, реализация технологии ФКН с использованием СКЗИ и токенов, описанных в конфигурации тестового стенда, невозможна.

Аналогичная ситуация и с JaCarta ГОСТ. Более того, СКЗИ КриптоПРО CSP, по крайней мере та версия, которая использовалась в тестовом стенде, использует данные ключевые носители как «обычные токены», которые, в свою очередь, являются просто носителями ключа.

Это утверждение очень просто подтвердить. Для этого надо поставить СКЗИ КриптоПРО CSP на чистую машину без драйверов от токенов и подключить токен JaCarta ГОСТ. ОС Windows 7 обнаружит токен JaCarta ГОСТ как «Устройство чтения смарт-карт Microsoft Usbccid (WUDF)». теперь можно попробовать создать ключ на токене и скопировать его в реестр компьютера. Весь функционал СКЗИ успешно отработает.

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

imageЕсли Вы планируете пользоваться ключом только с рутокена, то необходимо удалить сохраненный на компьютере ключ.

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

Проведение тестирования

1. Создадим исходный ключевой документ.

2.Сформируем рабочие ключевые документы.

3.Уничтожим исходный ключевой документ

4. Скопируем ключевую информацию из рабочих ключевых документов

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

Снятие запрета на экспорт

В скопированном с токена контейнере все еще стоит флаг “экспорт запрещён”. Это естественно, ведь по сути директория-контейнер – это копия токена, с соответствующими флагами.

Создаем зашифрованный том

ВНИМАНИЕ! Все дальнейшие необдуманные действия с Вашей стороны со своим жестким диском на Ваш страх и риск! Я описываю самый безопасный способ создания скрытого раздела. Если не хотите потерять данные, придерживайтесь инструкции.Для создания нового тома используем мастер создания томов TrueCrypt – ТомаСоздать новый раздел.
Запускается «Мастер создания томов TrueCrypt». Выбираем «Создать зашифрованный файловый контейнер», т.е. виртуальный зашифрованный диск будет храниться в одной файле.
imageОбычный том».
image
image
image
imageТокен-файлы», вводим пароль рутокена и выбираем токен.
image
image

Создаем ключевой файл

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

СервисГенератор ключевых файлов

. Перед нами генерация ключа.

image


Чтобы сохранить ключевой файл нажимаем «

Создать и сохранить файл

», выбираем путь и сохраняем ключевой файл. Нас оповестят об успешном сохранении ключа.

Тест на практике

Прежде всего, нам нужен пакет OpenSSH версии 8.2 на клиентской и серверной машинах. И здесь кроется основная проблема с этим решением на момент написания этого материала (май 2020). Поскольку 8.2 — это новейшая версия, выпущенная в феврале 2020 года, во многих ОС пока еще используются предыдущие версии.

Хорошая новость в том, что эта ситуация естественным образом будет улучшаться с течением времени, и все больше ОС будут добавлять поддержку нужной нам версии. Однако мы очень хотели испытать этот функционал на практике и поэтому нашли сочетание клиентских и серверных ОС для нашего практического теста.

По состоянию на май 2020 только несколько популярных дистрибутивов Linux имеют версию OpenSSH 8.2 в своих репозиториях. Среди них Fedora 32, Ubuntu 20.04 LTS и Kali Linux.

Устанавливаем truecrypt и драйвер для рутокен

Как рекомендуют разработчики рутокен, нельзя его подключать, пока не установлены драйвера. Процедура установки не отличается от установки любого приложения. На все вопросы отвечаем положительно и принимаем условия лицензионного соглашения. Распаковываем файл перевода TrueCrypt в папку, куда он был установлен. Запускаем TrueCrypt и в настройках изменяем язык на русский –

SettingsLanguage

, выбираем Русский и ОК.

Оцените статью
ЭЦП Эксперт
Добавить комментарий

Adblock
detector