[Перевод] Смарт-карты для входа на 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:

  1. Введите логин.

  2. Введите PIN-код.

  3. Валидируйте сертификат.

  4. Сопоставьте сертификат с пользователем.

  5. Проверьте соответствие логина и пользователя.

Настройка в 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.Для выполнения 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.

image-loader.svg

Войдите со смарт-картой на Ubuntu Server.

image-loader.svg

Войдите со смарт-картой на 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 на сервер с помощью смарт-карты.

image-loader.svg

Итоги

Смарт-карты представляют собой защищенное хранилище идентификационной информации. Их можно использовать для проверки подлинности при входе в компьютерные системы или сети или для доступа к защищенной информации и привилегиям. Поддержку входа со смарт-картами на Ubuntu можно настроить с помощью доступных модулей PAM и утилит PKCS11.

Источник:

Документация по PAM PKC#

© Habrahabr.ru