Рутокен с биометрией — не миф

В этой статье мы покажем, что биометрию уже пора внедрять; расскажем, почему это просто и относительно дёшево, а также поделимся техническими деталями для разработчиков.
Будет интересно менеджерам, которым не хватает традиционных 2FA, и разработчикам, которым предстоит с этим работать.
P.S. При написании данной статьи не использовались генеративные модели! 100% ручной труд разработчика Георгия. Я просто люблю смайлики 😇
Актуальность
Классически существует три типа факторов:
Знание: пароли, ПИН-коды, последовательности точек на сетке.
Владение: смарт-карты, смартфоны, счетчики OTP.
Свойство: биометрия человека, геолокация, типичные часы активности.
Основным плюсом однофакторной аутентификации с паролями является простота, а вот минусов куда больше:
Пароли легко подобрать. Зачастую пользователи выбирают простые пароли: имя собачки, дату рождения, 12345678 (наш дефолтный ПИН-код 😅 ).
Пароли легко украсть и переиспользовать.
Чтобы закрыть недостатки паролей обычно вводится второй фактор. Например, в Рутокен Логон мы предлагаем разместить на токене сложный пароль (строку 128 символов, содержащую буквы, цифры, знаки препинания, без повторяющихся последовательностей и т.п.), если у клиента нет инфраструктуры PKI. Его уже не удастся так просто подобрать, да и украсть без токена не выйдет, т.к. он хранится в защищенном сегменте памяти. Но теперь пользователю нужно помнить ПИН-код (первый фактор) и иметь на руках устройство (второй фактор).
Какие минусы у данного решения? С недавнего времени все больше сотрудников уходят в удаленную работу (от слова «даль», а не «удалить» 😉 ).
На месте ли человек в момент подписи? Тот ли человек подписывает – может, он отдал кому-то токен. А ведь пользователи часто приклеивают пин-код прямо на устройство! Если токен утерян или его украли – то все, капут.
Дополнительная актуальность именно рутокенов с биометрией связана с тем, что современные схемы все чаще строятся вокруг локальной проверки пользователя и криптографических учетных данных, привязанных к устройству, что повышает устойчивость к целому классу атак и упрощает управление рисками.
Итого, после внедрения третьего фактора пользователь должен непосредственно присутствовать в момент подписи. Ну и, конечно, человека украсть намного сложнее 🌚
Важно отметить, что у биометрического фактора также присутствуют недостатки. Самый главный на данный момент – вероятностный механизм сравнения отпечатков пальцев. Всегда есть вероятность пустить «чужого» (False Acceptance Rate, FAR) или не пустить «своего» (False Rejection Rate, FRR). Конечно, на практике мы сводим их почти что к нулю, однако использовать биометрию как единственный фактор мы не рекомендуем.
Именно в рамках многофакторной аутентификации недостатки каждого фактора по отдельности закрываются другими. Аппаратная поддержка делает такую схему объективно надежной.
Что такое Рутокен БИО
Итак, как вы уже могли догадаться, Рутокен БИО – это комплексный продукт, направленный на аппаратную поддержку биометрии по отпечатку пальца. В него входят:
Новые токены 🤤
Middleware для работы со сканерами и биометрическим материалом.
Доработанная версия rtpkcs11ecp.
Набор разработчика BioSDK.
Приложение «Рутокен БИО. Администратор».

Традиционно, новые токены!
Рутокен ЭЦП 3.0 3250 БИО с аппаратной поддержкой биометрии – это привычный Рутокен ЭЦП 3.0, который можно использовать во всех уже внедренных сценариях.
Важно, что биометрический материал нельзя экспортировать с устройства. Утечек не будет, и это хорошо, ведь свойства человека изменить невозможно – придется менять уже самого человека 😨
На данный момент на токене можно хранить до 3 отпечатков пальцев, и аутентифицироваться по любому из них. Аппаратные ускорители на борту устройства позволяют делать это достаточно быстро в условиях ограниченных ресурсов. Заявляется среднее время биометрической верификации: < 1 с.
Библиотека FSSM (Fingerprint Scanner Support Module)
Библиотека FSSM реализует унифицированную поддержку сканеров. Вся работа с вводом-выводом ведется именно через нее. Мы постараемся поддержать все популярные линейки сканеров, однако при необходимости вы сможете сами написать небольшой модуль-адаптер по инструкции из SDK.

Библиотека FAPI (Fingerprint API)
FAPI это библиотека для работы с биометрическим материалом. Преобразование отпечатка пальца в шаблон по стандарту ISO/IEC 19794-1-2013.
Специально для FAPI разработаны две нейросети:
Антифейк. Модуль ответственный за контроль подлинности отпечатков. Благодаря ему злоумышленнику не удастся внедрить фейковые слепки из эпоксида или пластилина.
Контроль качества. Как ни странно, модуль ответственный за контроль качества. Если пользователь неудачно или неплотно приложит палец, мы не пропустим такой отпечаток. Звучит смешно, но это улучшает пользовательский опыт 😅. Таким образом в долгосрочной перспективе мы сокращаем издержки на повторные сканирования при ошибках аутентификации (FAR и FRR).
Наша реализация стандарта PKCS#11
Далее мы обновили нашу библиотеку rtpkcs11ecp. Давайте пройдемся по основным моментам, с которыми придется столкнуться разработчику.
Первый шаг – создать биометрический аутентификатор, в котором хранятся эталонные шаблоны для сравнения, полученные из FAPI.
// Тип объекта – Authentication Object
const auto authObjectClass = CKO_VENDOR_AUTHENTICATION_FACTOR;
// Описание типа аутентификации создаваемого объекта – аутентификация по отпечатку пальца
const auto factorType = CKVAF_BIO_FP_CONVOLUTION;
// Максимальное количество шаблонов в наборе. Максимально разрешенное количество - 3 шаблона.
CK_ULONG fingerprintsCount = 2;
// Шаблоны отпечатков пальцев, полученные из FAPI
CK_VENDOR_BUFFER fingerprints[] = {
{ fingerprintByteArray1, sizeof(fingerprintByteArray1) },
{ fingerprintByteArray2, sizeof(fingerprintByteArray2) },
};
// Максимальное количество неуспешных аутентификаций подряд. Допустимые значения: от 1 до 10.
CK_ULONG maxRetryCount = 10;
CK_ATTRIBUTE authenticatorTemplate[] = {
{ CKA_CLASS, &authObjectClass, sizeof(authObjectClass) },
{ CKA_VENDOR_AUTHENTICATION_FACTOR_TYPE, &factorType, sizeof(factorType) },
{ CKA_VENDOR_FP_CONVOLUTIONS_COUNT, &fingerprintsCount, sizeof(fingerprintsCount) },
{ CKA_VENDOR_FP_CONVOLUTIONS, &fingerprints, sizeof(fingerprints) },
{ CKA_VENDOR_MAX_RETRY_COUNT, &maxRetryCount, sizeof(maxRetryCount) }
};
CK_RV rv = fList->C_CreateObject(...,
authenticatorTemplate, arraysize(authenticatorTemplate),
&fingerprintsHandle);Второй шаг – получить ID только что созданного аутентификатора, используя те же шаблоны отпечатков пальцев.
CK_ATTRIBUTE authenticatorObjectClassTemplate[] = {
{ CKA_CLASS, &authObjectClass, sizeof(authObjectClass) },
{ CKA_VENDOR_AUTHENTICATION_FACTOR_TYPE, &authFactor, sizeof(authFactor) }
};
// Используем свертки для поиска
rv = findObjects(..., authenticatorObjectClassTemplate, arraysize(authenticatorObjectClassTemplate, &fingerprints, &fingerprintsCount);
CK_ULONG fpConvolutionId;
CK_ATTRIBUTE attributeValueTemplate[] = {
{ CKA_VENDOR_FINGERPRINT_CONVOLUTIONS_ID, &fpConvolutionId, sizeof(fpConvolutionId) }
};
rv = functionList->C_GetAttributeValue(..., fingerprints[0],
attributeValueTemplate, arraysize(attributeValueTemplate));
Третий шаг – создать ключевую пару, защищенную с помощью биометрического аутентификатора. Для этого достаточно указать в шаблоне ранее найденный ID аутентификатора.
CK_ATTRIBUTE privateKeyTemplate[] = {
...
{ CKA_VENDOR_FINGERPRINT_CONVOLUTIONS_ID, &fpConvolutionId, sizeof(fpConvolutionId) }
...
};
rv = functionList->C_GenerateKeyPair(..., privateKeyTemplate, arraysize(privateKeyTemplate), ..., &privateKey);Таким образом, ваш существующий код почти что не меняется, нужно только дополнить шаблон ключевой пары для использования биометрического аутентификатора.
Теперь, чтобы воспользоваться ключом, необходимо вызвать новую функцию биометрической аутентификации C_EX_Authenticate.
/**
* \brief Аутентификация пользователя с использованием биометрического аутентификатора.
*
* \param[in] hSession Дескриптор сессии, в рамках которой выполняется аутентификация.
* \param[in] hAuthObject Дескриптор объекта, который будет использоваться для аутентификации.
* \param[in] pData Указатель на буфер с данными аутентификации (например, биометрическими данными).
* \param[in] ulDataSize Размер данных аутентификации в байтах.
*
* \returns CKR_OK, если операция выполнена успешно.
* \returns CKR_FUNCTION_NOT_SUPPORTED, если биометрия не поддерживается.
* \returns CKR_OBJECT_HANDLE_INVALID, если hAuthObject не является допустимым дескриптором объекта.
* \returns CKR_INCORRECT_PIN, если предоставленные данные аутентификации не подходят.
* \returns CKR_PIN_LOCKED, если аутентификатор заблокирован (максимальное число попыток аутентификации было превышено).
* \returns CKR_USER_ALREADY_LOGGED_IN, если пользователь ранее был аутентифицирован в сессии с указанным аутентификатором.
* \returns CKR_FUNCTION_FAILED, если аутентификация не удалась по внутренней причине.
*/
CK_RV C_EX_Authenticate(CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hAuthObject,
CK_BYTE_PTR pData, CK_ULONG ulDataSize);Для деаутентификации используйте новую функцию C_EX_Deauthenticate.
/**
* \brief Деаутентификация пользователя с использованием биометрического аутентификатора.
*
* \param[in] hSession Дескриптор сессии, в рамках которой выполняется деаутентификация.
* \param[in] hAuthObject Дескриптор объекта, который будет использоваться для деаутентификации.
*
* \returns CKR_OK, если операция выполнена успешно.
* \returns CKR_FUNCTION_NOT_SUPPORTED, если биометрия не поддерживается.
* \returns CKR_OBJECT_HANDLE_INVALID, если hAuthObject не является допустимым дескриптором объекта.
* \returns CKR_USER_NOT_LOGGED_IN, если пользователь ранее не был аутентифицирован в сессии с указанным аутентификатором.
* \returns CKR_FUNCTION_FAILED, если деаутентификация не удалась по внутренней причине.
*/
CK_RV C_EX_Deauthenticate(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hAuthObject);Предусмотрено ограничение числа неуспешных попыток, по умолчанию стоит 10. Если пользователь превышает максимальное число – аутентификатор блокируется. Администратор может разблокировать их с помощью новой функции C_EX_UnblockAuthenticator.
/**
* \brief Разблокирование аутентификатора с использованием объекта аутентификации.
*
* \param[in] hSession Дескриптор сессии, в рамках которой выполняется аутентификация.
* \param[in] hAuthObject Дескриптор объекта, который будет использоваться для разблокирования.
*
* \returns CKR_OK, если операция выполнена успешно.
* \returns CKR_FUNCTION_NOT_SUPPORTED, если биометрия не поддерживается.
* \returns CKR_OBJECT_HANDLE_INVALID, если hAuthObject не является допустимым дескриптором объекта.
* \returns CKR_FUNCTION_FAILED, если разблокировка не удалась по внутренней причине.
*/
CK_RV C_EX_UnblockAuthenticator(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hAuthObject);BioSDK
Мы не пускаем вас в открытое плавание, и предлагаем воспользоваться новым BioSDK – набором инструментов разработчика для интеграции биометрической аутентификации. Там есть мануалы для FSSM, FAPI; инструкции по настройке сканеров Futronic, ZKTeco, Papilon, Anviz; примеры кода на C и тестовые утилиты.

Рутокен БИО. Программа администратора
Графического приложение администратора, с помощью которого можно настроить биометрию. Позже вся функциональность появится в Центр управления Рутокен.

Развитие экосистемы Рутокен
Лично мне, как непосредственному разработчику, хочется рассказать вам про Рутокен Логон для Linux 🤩

Рутокен Логон – это программный комплекс для многофакторной аутентификации в отечественных линуксах. Для пользователей реализован красивый экран входа (гритер) и экран блокировки (локскрин), а для администраторов – служба логирования и утилита конфигурации, которую удобно вызывать из скриптов. Пример widespread deploy скрипта прилагается 😉
Кстати, именно благодаря работе над Рутокен Логон я смог написать статью про коммуникацию между PAM-модулями. Ссылка в описании вот тут 😜
С версии 1.1.0 станет доступна трехфакторная аутентификация по отпечатку пальца локально и в домене, а в гритере появятся функции разблокировки биометрического аутентификатора.
А для удобного учета биометрических токенов мы уже дополнили функциональность Рутокен Keybox – приложения для управление жизненным циклом ключевых носителей и сертификатов.

Для ручной настройки и пользовательского менеджмента вы сможете использовать Центр управления Рутокен.

Начиная с версии 4.12.0 в Рутокен Плагин появились функции генерации ключевых пар с привязкой к биометрии и аутентификации по отпечаткам пальцев.

Рутокен БИО 2.0
НО И ЭТО ЕЩЕ НЕ ВСЕ! 💥 В заключение расскажу немного инсайдерской информации из отдела разработки 😏
В настоящий момент мы работаем над прототипом нашей новой линейки Рутокен БИО 2 со встроенным сканером отпечатков пальцев. Такой форм-фактор точно придется по вкусу некоторым нашим клиентам.
Тем более, что процесс станет еще более надежным, ведь получение изображения и формирование шаблона будут выполняться исключительно на устройстве, что соответствует ценностям нашей компании.

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

Заключение
Подведем итоги:
Будущее наступило – биометрия уже не за горами 🔥
Мы делаем все, что в наших силах, чтобы вы пользовались биометрией – чтобы это было просто и дешево. Ну или хотя бы весело 😅
У нас есть серьезные планы по активному развитию биометрии в нашей экосистеме. С нами вы не пропадете 💪
На этом все! Надеемся, эта статья была полезной. Пишите свои вопросы и пожелания в комментарии, будем рады ответить!
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.