Вопрос или проблема
У меня есть широко распространенная смарт-карта (над которой у меня нет никакого контроля) для аутентификации, которую я пытаюсь использовать для аутентификации обычного локального пользователя. Без 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»), и задача в том, чтобы обеспечить их последовательную и правильную интеграцию в процессе аутентификации.
Детальный анализ текущей конфигурации
-
Конфигурация pam_sss и sssd:
Вы используетеpam_sss.so
с параметрамиallow_missing_name
иtry_cert_auth
, что позволяет ограничить использование сертификатов без сопоставления локальным учетным записям и пробует аутентификацию по сертификатам. -
SSSD конфигурация:
- Заданы параметры для идентификационной и прокси-библиотек, специализированной политики локальной аутентификации.
- Конфигурация для маппинга сертификатов, которая использует правило сопоставления
matchrule
для субъекта сертификата.
Потенциальные решения
-
Анализ и обход проблемы «флип-флоп»:
- Вам необходимо обеспечить, чтобы аутентификация работала последовательно в различных фазах, без необходимости ручного вмешательства. Это может быть достигнуто путем создания сценариев автоматизации, которые динамически определяют нужный сертификат в зависимости от фазы аутентификации.
-
Использование sssctl:
- Ранее упомянутый инструмент
sssctl
может быть полезен для анализа сертификатов, предоставляемых картой. Это поможет уточнить этапы аутентификации и устранить несоответствия в правилах сопоставления.
- Ранее упомянутый инструмент
-
Настройка детальной отладки:
- Использование отладочных уровней
p11_child
и других инструментов поможет лучше понять, на каком этапе происходит сбой. Запуск отладки с максимальным уровнем поможет выявить детали взаимодействия процессов.
- Использование отладочных уровней
-
Перепроверка конфигурации:
- Убедитесь, что конфигурация SSSD и PAM соответствует использованным сертификатам. Правильное маппирование и верификация цепочки сертификатов критически важны для успеха аутентификации.
Конечные рекомендации
Ваша ситуация, несмотря на свои сложности, решаема с помощью внимательной настройки и проверки конфигурации. Вы также можете рассмотреть возможность внедрения системных патчей или улучшений в p11_child
, однако это потребует тщательного тестирования. Для долговременного решения возможно потребуется консультация с разработчиком Linux-решения или экспертом в области смарт-карт и SSSD систем.
Эта информация должна быть полезной для понимания и успешного решения задач аутентификации с использованием смарт-карт. Удачи в настройке вашей системы!