Локальная аутентификация пользователя с использованием смарт-карты в Linux (несколько фаз карты p11_child)

Вопрос или проблема

У меня есть широко распространенная смарт-карта (над которой у меня нет никакого контроля) для аутентификации, которую я пытаюсь использовать для аутентификации обычного локального пользователя. Без LDAP/AD/Kerberos/и т.д., даже без центра сертификации — просто одна смарт-карта, аутентифицирующая одну учетную запись. С некоторыми трудностями я, видимо, заставил систему признать смарт-карту как принадлежащую пользователю, и она даже запрашивает PIN-код для аутентификации карты. Исследование показывает какое-то странное состояние переключения, когда p11_child возвращает два набора информации. Однако пользователь не аутентифицирован, так как метка захватывается на одном этапе и применяется на другом этапе. /usr/libexec/sssd/p11_child --dumpable=1 --debug-microseconds=0 --debug-timestamps=1 --logger=stderr --backtrace=1 --debug-level=0x2f7f0 --pre --verify partial_chain,no_ocsp --ca_db /etc/sssd/pki/sssd_auth_ca_db.pem --chain-id 1 |& grep "found cert" вернет либо:

Набор вывода A

(2024-12-30 18:00:31): [p11_child[179092]] [read_certs] (0x4000): [CID#1] found cert[Certificate for PIV Authentication][/C=UK/O=FAKE/OU=MoD/OU=PKI/CN=KUREGI.JEFFREY.M.65312238]
(2024-12-30 18:00:31): [p11_child[179092]] [read_certs] (0x4000): [CID#1] found cert[Certificate for Digital Signature][/C=UK/O=FAKE/OU=MoD/OU=PKI/CN=KUREGI.JEFFREY.M.65312238]
(2024-12-30 18:00:31): [p11_child[179092]] [read_certs] (0x4000): [CID#1] found cert[Certificate for Key Management][/C=UK/O=FAKE/OU=MoD/OU=PKI/CN=KUREGI.JEFFREY.M.65312238]
(2024-12-30 18:00:31): [p11_child[179092]] [read_certs] (0x4000): [CID#1] found cert[Certificate for Card Authentication][/C=UK/O=FAKE/OU=MoD/OU=PKI/serialNumber=5AAAE936-08C9-4CEF-8AE0-996BF87F08ED]

Набор вывода B:

(2024-12-30 18:00:28): [p11_child[179077]] [read_certs] (0x4000): [CID#1] found cert[CAC Email Signature Certificate][/C=UK/O=FAKE/OU=MoD/OU=PKI/CN=KUREGI.JEFFREY.M.65312238]
(2024-12-30 18:00:28): [p11_child[179077]] [read_certs] (0x4000): [CID#1] found cert[CAC Email Encryption Certificate][/C=UK/O=FAKE/OU=MoD/OU=PKI/CN=KUREGI.JEFFREY.M.65312238]
(2024-12-30 18:00:28): [p11_child[179077]] [read_certs] (0x4000): [CID#1] found cert[CAC Cert 4][/C=UK/O=FAKE/OU=MoD/OU=PKI/serialNumber=5AAAE936-08C9-4CEF-8AE0-996BF87F08ED]
(2024-12-30 18:00:28): [p11_child[179077]] [read_certs] (0x4000): [CID#1] found cert[CAC Cert 5][/C=UK/O=FAKE/OU=MoD/OU=PKI/CN=KUREGI.JEFFREY.M.65312238]

Однако и “CAC Cert 5”, и “Certificate for PIV Authentication”, похоже, содержат одинаковый сертификат. Но проблема в том, что если система захватывает “CAC Cert 5” во время PREAUTH, она не может его использовать во время AUTHENTICATE, поскольку он переключается на другую сторону. Иными словами, я могу использовать одну из следующих двух команд, и они будут работать 50% времени. Только если я чередую две команды (на правильном этапе), я добьюсь постоянного успеха. (Вы не поверите, сколько времени у меня ушло, чтобы понять, что происходит, так как иногда все работало, а иногда нет во время отладки!) Предполагается, что если бы вызов AUTHENTICATE p11_client выполнялся дважды и выбирал тот, который сработал, жизнь была бы хороша. Есть ли какой-то лучше способ, кроме как изменения исходного кода?

Команда для фазы A: "/usr/libexec/sssd/p11_child" "--dumpable=1" "--debug-microseconds=0" "--debug-timestamps=1" "--logger=stderr" "--backtrace=1" "--debug-level=0x2f7f0" "--pin" "--auth" "--label" "Certificate for PIV Authentication" "--key_id" "01" "--token_name" "KUREGI.JEFFREY.M.65312238" "--module_name" "/usr/lib64/pkcs11/opensc-pkcs11.so" "--verify" "partial_chain,no_ocsp" "--ca_db" "/etc/sssd/pki/sssd_auth_ca_db.pem" "--chain-id" "1"

Команда для фазы B: /usr/libexec/sssd/p11_child --dumpable=1 --debug-microseconds=0 --debug-timestamps=1 --logger=stderr --backtrace=1 --debug-level=0x2f7f0 --pin --auth --label CAC Cert 5 --key_id 0005 --token_name KUREGI.JEFFREY.M.65312238 --module_name /usr/lib64/pkcs11/opensc-pkcs11.so --verify partial_chain,no_ocsp --ca_db /etc/sssd/pki/sssd_auth_ca_db.pem --chain-id 1

Конфигурация pam auth sufficient pam_sss.so allow_missing_name try_cert_auth

Конфигурация sssd:

[sssd]
services = pam
enable_files_domain = True
domains = thetest.uk
default_domain_suffix = thetest.uk
certificate_verification = partial_chain,no_ocsp

[domain/thetest.uk]
id_provider = proxy
proxy_lib_name = files
auth_provider = none
local_auth_policy = only

[certmap/thetest.uk/jeff]
matchrule = <SUBJECT>CN=KUREGI\.JEFFREY\.M\.65312238,OU=PKI,OU=MoD,O=DSTL,C=UK

[pam]
pam_cert_auth = True

Ах да, и случайный совет для случайных людей, имеющих проблемы в будущем: запись matchrule для SUBJECT в моей системе была в обратном порядке (в порядке LDAP, думаю), по сравнению с тем, что было в сертификате. sssctl cert-show <base64encodedstring> покажет вам, что используется на самом деле, где base64 закодированная строка может быть найдена в логах sssd (поиск по слову Found cert)

Ответ или решение

Когда вы сталкиваетесь с задачей настройки аутентификации локального пользователя с использованием смарт-карты на Linux, вы можете встретить различные сложности, особенно если ваша среда работы не поддерживает LDAP, AD, Kerberos и другие аналогичные решения. Ключевая проблема заключается в том, что p11_child возвращает два набора информации, и система не может корректно обработать аутентификацию из-за так называемого «флип-флоп» состояния.

Проблема с фазами аутентификации смарт-карт

Ваша текущая ситуация описывает проблему, где система Linux неправильно идентифицирует сертификаты на разных этапах аутентификационного процесса. Вы сталкиваетесь с двумя наборами данных, которые содержат различные сертификаты («Certificate for PIV Authentication» и «CAC Cert 5»), и задача в том, чтобы обеспечить их последовательную и правильную интеграцию в процессе аутентификации.

Детальный анализ текущей конфигурации

  1. Конфигурация pam_sss и sssd:
    Вы используете pam_sss.so с параметрами allow_missing_name и try_cert_auth, что позволяет ограничить использование сертификатов без сопоставления локальным учетным записям и пробует аутентификацию по сертификатам.

  2. SSSD конфигурация:

    • Заданы параметры для идентификационной и прокси-библиотек, специализированной политики локальной аутентификации.
    • Конфигурация для маппинга сертификатов, которая использует правило сопоставления matchrule для субъекта сертификата.

Потенциальные решения

  1. Анализ и обход проблемы «флип-флоп»:

    • Вам необходимо обеспечить, чтобы аутентификация работала последовательно в различных фазах, без необходимости ручного вмешательства. Это может быть достигнуто путем создания сценариев автоматизации, которые динамически определяют нужный сертификат в зависимости от фазы аутентификации.
  2. Использование sssctl:

    • Ранее упомянутый инструмент sssctl может быть полезен для анализа сертификатов, предоставляемых картой. Это поможет уточнить этапы аутентификации и устранить несоответствия в правилах сопоставления.
  3. Настройка детальной отладки:

    • Использование отладочных уровней p11_child и других инструментов поможет лучше понять, на каком этапе происходит сбой. Запуск отладки с максимальным уровнем поможет выявить детали взаимодействия процессов.
  4. Перепроверка конфигурации:

    • Убедитесь, что конфигурация SSSD и PAM соответствует использованным сертификатам. Правильное маппирование и верификация цепочки сертификатов критически важны для успеха аутентификации.

Конечные рекомендации

Ваша ситуация, несмотря на свои сложности, решаема с помощью внимательной настройки и проверки конфигурации. Вы также можете рассмотреть возможность внедрения системных патчей или улучшений в p11_child, однако это потребует тщательного тестирования. Для долговременного решения возможно потребуется консультация с разработчиком Linux-решения или экспертом в области смарт-карт и SSSD систем.

Эта информация должна быть полезной для понимания и успешного решения задач аутентификации с использованием смарт-карт. Удачи в настройке вашей системы!

Оцените материал
Добавить комментарий

Капча загружается...