[Перевод] Смарт-карты для входа на Ubuntu
Смарт-карты сегодня повсюду — платежные карты, паспорта, водительские удостоверения, школьные и рабочие пропуска. Эти небольшие карточки с защитой от несанкционированного доступа и чипами обычно содержат информацию, которая идентифицирует нас и предоставляет доступ к защищенным ресурсам.
Одно из самых популярных применений смарт-карт — контроль доступа в здания и к компьютерным системам. Таким образом они используются, например, в правительстве США. Государственные учреждения обязаны соблюдать строгие правила безопасности, которые требуют надежную аутентификацию для доступа к конфиденциальным или ценным данным, хранящимся в ИТ-системах. Компании, которые работают с такими учреждениями, тоже должны соблюдать эти требования. Смарт-карты могут содержать сертификаты, пары открытого и закрытого ключей, PIN-коды и биометрические данные, например отпечатки пальцев и фотографию. Они действуют как уникальные идентификаторы при входе в здания или на компьютеры. Чипы на некоторых смарт-картах даже обеспечивают шифрование по стандарту FIPS 140–2.
Смарт-карты предлагают следующие преимущества:
Аутентификация | Подтверждение личности с помощью секретных или уникальных данных, известных только уполномоченным сторонам |
Целостность | Проверка отсутствия изменений в данных. |
Конфиденциальность | Запрет несанкционированного доступа к данным. Обычно осуществляется с помощью шифрования |
Неотказуемость | Гарантия авторства. Обычно реализуется с помощью цифровой подписи. |
Владелец должен предъявить смарт-карту и ввести PIN-код. Вместе смарт-карта и PIN-код обеспечивают многофакторную аутентификацию, которая гарантирует более высокую степень защиты по сравнению с однофакторной аутентификацией (где используется, например, только пароль).
В этой статье содержится информация о конфигурировании Ubuntu 18.04 LTS для настройки многофакторной аутентификации на смарт-картах для локального и удаленного входа в систему. В качестве примера мы возьмем смарт-карту PIVKey, поскольку она легко доступна и содержит несколько базовых учетных данных.
Предварительные требования
Программное обеспечение на клиенте смарт-карты
Установите следующие пакеты, чтобы получить доступ к конфигурации смарт-карты на Ubuntu:
libccid обеспечивает взаимодействие с ридерами смарт-карт CCID через менеджер ресурсов PC/SC Lite (pcscd);
csc-tools содержит полезные инструменты для смарт-карт;
opensc содержит утилиты для доступа к смарт-картам;
opensc-pkcs11 содержит библиотеки для доступа к смарт-картам;
libpam-pkcs11 предоставляет поддержку модуля PAM для входа с сертификатами X.509 с помощью PKCS 11.
Оборудование для клиента
Смарт-карта персональной идентификации PIV поддерживает FIPS 201 — стандарт для смарт-карт PIV в США. На сайте службы GSA опубликован список одобренных смарт-карт, которые можно использовать как PIV-карты. Карты приобретаются пустыми, а поставщики услуг по PIV добавляют на них учетные данные.
В этой статье мы рассматриваем в качестве примера смарт-карту PIVKey C910. PIVKey совместима со стандартом FIPS 201 и реализует спецификацию командного интерфейса NIST SP 800–73 Part 3.
Смарт-карта PIVKey содержит сертификат, пару открытого и закрытого ключей и PIN-коды для пользователя и администратора. В системах Linux карта доступна только для чтения. Вам потребуется инструмент администрирования PIVKey в Windows, чтобы загрузить на карту дополнительные сертификаты или изменить PIN-коды пользователя и администратора.
Для чтения содержимого и учетных данных смарт-карты PIVKey использовался ридер смарт-карт Identiv SCR3310v2.0 USB.
Настройка ридера смарт-карт
Указание ридера смарт-карт
После подключения ридера убедитесь, что операционная система распознает его, указав его с помощью opensc-tool.
$ opensc-tool --list-readers
# Detected readers (pcsc)
Nr. Card Features Name
0 No SCM Microsystems Inc. SCR 3310 [CCID Interface] (53311646706297) 00 00
Вставьте смарт-карту в ридер и убедитесь, что она распознана.
$ opensc-tool --reader 0 --name
PIV-II card
Конфигурация PAM
Модуль pam_pkcs11 позволяет системам, поддерживаемым PAM, использовать сертификаты X.509 для проверки подлинности. Модуль использует библиотеку PKCS 11, например openscpkcs11, чтобы получать доступ к смарт-картам для извлечения нужных учетных данных.
Процесс настройки pam_pkcs11:
Введите логин.
Введите PIN-код.
Валидируйте сертификат.
Сопоставьте сертификат с пользователем.
Проверьте соответствие логина и пользователя.
Настройка в PAM:
Настройка модуля pam_pkcs11.
Добавление центров сертификации (ЦС) и списков отзыва сертификатов (CRL).
Настройка PAM для использования модуля pam_pkcs11.
Добавление общего имени (CN) для логина.
Настройка модуля pam_pkcs11
Создайте файл конфигурации pam_pkcs11.
$ cd /etc/pam_pkcs11
$ sudo cp /usr/share/doc/libpam-pkcs11/examples/pam_pkcs11.conf.example.gz .
$ sudo gunzip pam_pkcs11.conf.example.gz
$ sudo cp pam_pkcs11.conf.example pam_pkcs11.conf
Проверьте параметры модуля, cert_policy и use_pkcs11_module, определенные в записи pkcs11_module opensc {} в файле pam_pkcs11.conf. Параметр модуля должен содержать абсолютный путь к open-pkcs11.so в системе. Параметр cert_policy должен включать oscp в качестве одной из политик проверки сертификата.
Например:
use_pkcs11_module = opensc;
module = /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so;
cert_policy = ca,signature,oscp_on;
Сопоставители в модуле pam_pkcs11
Модуль PAM позволяет использовать сертификаты для входа. В большинстве систем на базе Linux определены пользователи, и для входа используется имя пользователя. Поэтому нужен способ сопоставить сертификат с определенным пользователем в системе. Модуль pam_pkcs11 предоставляет различные сопоставители сертификатов для выполнения этой задачи. Каждый сопоставитель использует определенную информацию из сертификата для сопоставления с пользователем в системе. Можно даже использовать сразу несколько сопоставителей. В таком случае, если первый определенный сопоставитель не находит пользователя в системе, вступает следующий и так далее, пока пользователь не будет найден.
В нашем примере мы используем сопоставитель pwent. Этот сопоставитель использует системный вызов getpwent (), чтобы изучить поля pw_name и pw_gecos каждого пользователя и найти соответствие имени CN. Если соответствие найдено, в качестве имени для входа возвращается pw_name. Затем этот результат сопоставляется с именем для входа PAM, чтобы определить, найдено ли соответствие.
Задайте pwent в качестве сопоставителя в файле pam_pkcs11.conf, изменив существующую запись.
use_mappers = pwent;
Списки отзыва сертификатов и сертификаты ЦС
Модуль pam_pkcs11 должен знать центры сертификации (ЦС) для валидации сертификатов. Списки отзыва сертификатов (CRL) необязательны, но их тоже можно использовать для валидации сертификатов. Для этого выполните следующие действия:
Добавьте необходимые ЦС и списки CRL в каталоги, указанные в параметрах ca_dir и crl_dir в файле pam_pkcs11.conf.
Создайте хеш-ссылки на ЦС и списки CRL.
Примечание: В этой статье ЦС и списки CRL для PIVKey были экспортированы с сайта http://ca.pivkey.com/.
Добавьте ЦС и списки CRL в соответствующие каталоги.
$ ls /etc/pam_pkcs11/cacerts
PIVKeyDeviceCertificateAuthority.crt TaglioLLCRootCA.crt
$ ls /etc/pam_pkcs11/crls
pivkeydeviceca.crl tagliorootca.crl
Создайте хеш-ссылки с помощью утилиты pkcs11_make_hash_link.
$ cd /etc/pam_pkcs11/cacerts
$ sudo pkcs11_make_hash_link
$ ls
c90bef04.0 PIVKeyDeviceCertificateAuthority.crt
e7d4c577.0 TaglioLLCRootCA.crt
$ cd /etc/pam_pkcs11/crls
$ sudo pkcs11_make_hash_link
$ ls
c90bef04.r0 e7d4c577.r0 pivkeydeviceca.crl tagliorootca.crl
Настройка PAM
Следующий шаг — интеграция модуля pam_pkcs11 в стек PAM. Это можно сделать несколькими способами. Желаемая конфигурация зависит от политики безопасности. Следующие примеры интеграции демонстрируют нестрогие и строгие политики.
Ubuntu Desktop с gdm3
Модуль pam_pkcs11 можно интегрировать в стек PAM, чтобы использовать аутентификацию с помощью смарт-карт для входа через gdm3. Измените файл /etc/pam.d/gdm-password и включите модуль.
auth requisite pam_nologin.so
auth required pam_succeed_if.so user != root quiet_success
auth sufficient pam_pkcs11.so
@include common-auth
auth optional pam_gnome_keyring.so
@include common-account
…
...
Ubuntu Server только для входа
# use pkcs11 support
auth sufficient pam_pkcs11.so
# Enforce a minimal delay in case of failure (in microseconds).
# (Replaces the `FAIL_DELAY’ setting from login.defs)
# Note that other modules may require another minimal delay. (for example,
# to disable any delay, you should add the nodelay option to pam_unix)
auth optional pam_faildelay.so delay=3000000
# Outputs an issue file prior to each login prompt (Replaces the
# ISSUE_FILE option from login.defs). Uncomment for use
# auth required pam_issue.so issue=/etc/issue
...
...
Если указать sufficient в поле управления, будет использоваться следующий модуль PAM в стеке, если у пользователя нет смарт-карты для входа или вход с помощью смарт-карты не удался.
Ubuntu Server для универсальной аутентификации
При более строгом подходе может потребоваться аутентификация с помощью смарт-карты для всех сервисов входа или сервисов с поддержкой PAM. Многие сервисы PAM в каталоге /etc/ pam.d включают файл common-auth. Модуль pam_pkcs11 тоже можно разместить в этом файле, чтобы включить аутентификацию с помощью смарт-карты для всех сервисов, которые его содержат.
Измените файл /etc/pam.d/common-auth, чтобы включить в него модуль pam_pkcs11:
# require pkcs11 smart card login
auth [success=1 default=ignore] pam_pkcs11.so
# here’s the fallback if no module succeeds
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn’t one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth required pam_permit.so
# and here are more per-package modules (the "Additional” block)
auth optional pam_cap.so
# end of pam-auth-update config
При такой конфигурации система будет выполнять аутентификацию только с помощью смарт-карт. Если пользователь не сможет пройти аутентификацию со смарт-картой, вход будет запрещен. Все сервисы PAM в каталоге /etc/pam.d, которые включают commonauth, будут требовать аутентификацию с помощью смарт-карты. Предупреждение. Подобная глобальная конфигурацию потребует аутентификацию с помощью смарт-карты для su и sudo.
Для выполнения sudo в командной строке требуется вход со смарт-картой с указанной выше конфигурацией PAM.
Добавление имени CN
После настройки pam_pkcs11 и PAM для входов с сертификатами остается выполнить еще одно действие. Сопоставитель pwent требует, чтобы имя CN в сертификате находилось в поле /etc/passwd gecos пользователя. Имя CN должно извлекаться из сертификата на смарт-карте.
Извлеките сертификат с карты, выполнив следующие действия:
Получите ID сертификата на смарт-карте:
$ pkcs15-tool --list-certificates
Using reader with a card: SCM Microsystems Inc. SCR 3310 [CCID Interface]
(53311646706297) 00 00
X.509 Certificate [Certificate for Card Authentication]
Object Flags : [0x0]
Authority: no
Path:
ID: 04
Encoded serial : 02 0A 5877782D0001000013BF
ID — 04.
Используйте этот ID, чтобы считать информацию о сертификате с карты и сохранить ее в локальный файл.
$ pkcs15-tool --read-certificate 04 > /tmp/sc-cert.crt
Using reader with a card: SCM Microsystems Inc. SCR 3310 [CCID Interface]
(53311646706297) 00 00
$ cat /tmp/sc-cert.crt
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIKWHd4LQABAAATvzANBgkqhkiG9w0BAQsFADBbMRMwEQYK CZImiZPyLGQBGRYDY29tMRYwFAYKCZImiZPyLGQBGRYGcGl2a2V5MSwwKgYDVQQD EyNQSVZLZXkgRGV2aWNlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0xNjEyMDYw MDE4MTJaFw0yODEyMDMwMDE4MTJaMDIxMDAuBgNVBAMTJ1BJVktleSBCQTM2NkRGRTM3MjJDNzQ0OU- VDOTA2QjkyNzRDOEJBQzCCASIwDQYJKoZIhvcNAQEBBQADggE
…
…
-----END CERTIFICATE-----
Используйте openssl, чтобы извлечь имя CN из сохраненного файла.
CN это «PIVKey BA366DFE3722C7449EC906B9274C8BAC».
Измените файл /etc/passwd и добавьте это имя CN в поле gecos пользователя, которому принадлежит сертификат.
Этот сертификат принадлежит имени пользователя foo в файле /etc/passwd. Измените запись /etc/ passwd для имени пользователя foo.
foo:x:1001:1001:PIVKey BA366DFE3722C7449EC906B9274C8BAC:/home/foo:/bin/bash
Теперь операционная система может принимать смарт-карту для входа пользователя foo.
Войдите со смарт-картой на Ubuntu Server.
Войдите со смарт-картой на Ubuntu Desktop.
Вход по SSH с помощью смарт-карты
Один из методов аутентификации, которые поддерживает протокол SSH, — аутентификация с открытым ключом. Открытый ключ копируется на сервер SSH и хранится там с пометкой authorized. Владелец соответствующего закрытого ключа может войти на сервер по SSH.
Учетные данные PIV включают сертификат и пару ключей, которые можно использовать для входа по SSH. Нужно извлечь открытый ключ со смарт-карты и скопировать его на SSH-сервер. Ридер смарт-карт подключается к SSH-клиенту. SSH-клиент использует библиотеку opensc-pkcs11 для доступа к смарт-карте и выполнения необходимых операций. Закрытый ключ не раскрывается.
Настройка входа по SSH с помощью смарт-карты
Необходимо настроить SSH-сервер и клиент, чтобы разрешить аутентификацию с помощью смарт-карты.
Настройка SSH-сервера
SSH-сервер должен разрешать настройку аутентификации с открытым ключом в файле конфигурации и требует открытый ключ пользователя.
Разрешение аутентификации с открытым ключом
Убедитесь, что для параметра PubkeyAuthentication задано значение «yes» в файле /etc/ ssh/sshd_config сервера. По умолчанию в файле /etc/ssh/sshd_config в Ubuntu 18.04 параметр PubkeyAuthentication раскомментирован. Но его значение по умолчанию — «yes». Чтобы убедиться, что значение задано верно, отредактируйте файл sshd_config file.
PubkeyAuthentication yes
Перезапустите SSH-сервер.
$ sudo systemctl restart sshd
Установка открытого ключа на сервере
Извлеките открытый ключ пользователя со смарт-карты на SSH-клиенте. Используйте sshkeygen, чтобы прочитать открытый ключ со смарт-карты в формате, пригодном для SSH.
$ ssh-keygen -D /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so > smartcard.pub > $ cat smartcard.pub
$ cat smartcard.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuFupFpsXwFPz2INdEgr64tn6yQKT7Osj cXoAzgJ7JW/qykPxIZxELpJkoHe45s/fiIhkWjgHWhxCWRNSM76wyc2j47egfRdkzl0Kj7U1k- kpOmGIFU8GA9nx6V2kLr4mrI+3zsfRdbmXhPaVqnXUcOJVQh4fe1H5S1mtzV5VzJxKg/61IrBSM- I5JnWDKNr1dGLIqMqw7A55YMvesKurOUrRe3BBIWYhN9XHIrWVFtMBHmQtW8iphmXUqQLHeH- Q7LKpvCvE4i5QttlRSITD1Tqefwdeflh6I1P7LAsnMDp42zHZ23O4Ewd7aqNogikox6aNcCGYkU- PavMBWcge5ykgR
Скопируйте этот ключ на SSH-сервер.
ssh-copy-id -f -i smartcard.pub ubuntu@bionic-server-2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "smartcard.pub”
ubuntu@bionic-server-2’s password:
Number of key(s) added: 1
Теперь попробуйте выполнить вход на компьютер с помощью: "ssh ‘ubuntu@bionic-server-2’”. Убедитесь, что добавлены только нужные ключи.
Настройка SSH-клиента
SSH-клиент должен идентифицировать своего провайдера PKCS 11. Это можно сделать несколькими способами:
Командная строка
При каждом запуске SSH-сеанса из командной строки указывайте параметр -I.
$ ssh -I /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so ubuntu@bionic-server-2
Этот метод позволяет использовать вход со смарт-картой только при необходимости.
По всей системе
Настройте параметр PKCS11Provider в файле /etc/ssh/ssh_config.
PKCS11Provider /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
Используйте этот метод, чтобы требовать вход по SSH со смарт-картой для всех пользователей в системе.
По пользователям
Настройте параметр PKCS11Provider в файле ~/.ssh/config каждого пользователя, который хочет использовать смарт-карту для входа по SSH.
PKCS11Provider /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
Используйте этот метод, чтобы требовать вход по SSH со смарт-картой для отдельных пользователей.
Войдите по SSH на сервер с помощью смарт-карты.
Итоги
Смарт-карты представляют собой защищенное хранилище идентификационной информации. Их можно использовать для проверки подлинности при входе в компьютерные системы или сети или для доступа к защищенной информации и привилегиям. Поддержку входа со смарт-картами на Ubuntu можно настроить с помощью доступных модулей PAM и утилит PKCS11.
Источник:
Документация по PAM PKC#