Дерево страниц

Архитектура системы

PAM-модуль pam_pkcs11.so, предоставляемый пакетом libpam_pkcs11, имеет широкий набор настроек и может быть использован для работы в мультивендорной конфигурации. 
Актуальная на момент написания статьи реализация имеет ограничение: поиск сертификатов путем перебора не производится. Используется первый доступный сертификат либо на первом найденном ключевом носителе, либо на ключевом носителе, находящемся в указанном в конфигурации заданном слоте. Так как очередность размещения ключевых носителей в слотах зависит от порядка их подключения, это ограничение затрудняет использование модуля при работе с несколькими носителями.

PAM-модуль pam_pkcs11.so может быть настроен на аутентификацию с использованием доменной службы LDAP, но при работе в домене FreeIPA pam_pkcs11.so дублирует функциональность штатной для FreeIPA службы sssd (см. Двухфакторная аутентификация в доменах).

Подготовка ключевых носителей для передачи пользователям

Процедура подготовки ключевых носителей не отличается от процедуры для пакета libpam-p11.

Использование ключевых носителей для двухфакторной аутентификации

Установка и настройка пакетов

Пакет libpam-pkcs11 доступен в основном репозитории Astra Linux и может быть установлен с помощью графического менеджера пакетов или командой:

sudo apt install libpam-pkcs11

Конфигурационные файлы находятся в каталоге /etc/pam_pkcs11. Этот каталог с подкаталогами создается при установке пакета, но по умолчанию не содержит файлов. Стандартные конфигурационные файлы могут быть скопированы из каталога /usr/share/doc/libpam-pkcs11/examples.
Далее используется файл, скопированный из файла /usr/share/doc/libpam-pkcs11/examples/pkcs11_eventmgr.conf.example. 

В стандартных конфигурационных файлах:

  1. Используется библиотека opensc-pkcs11.so. Для работы с этой библиотекой:
    1. Установить пакеты opensc-pkcs11 и libengine-pkcs11-openssl:

      sudo apt install opensc-pkcs11 libengine-pkcs11-openssl

    2. В используемых конфигурационных файлах исправить путь к этой библиотеке (параметр pkcs11_module), указав следующее значение:

      pkcs11_module = /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so;
  2. Используются недоступные в Astra Linux сущности:
    1. Звуковые файлы в каталоге /usr/share/sounds. Эти файлы следует заменить на любые существующие в указанном каталоге файлы (или на любые другие).
    2. Команда xscreensaver-command для блокировки экрана по извлечению ключевого носителя и разблокировки экрана по подключению ключевого носителя. В Astra Linux эта команда недоступна. Возможные варианты замены для Astra Linux:
      1. Использовать  fly-wmfunc FLYWM_LOCK:
        1. Блокировка:

          fly-wmfunc FLYWM_LOCK

        2. Разблокировка экрана командой в Astra Linux не поддерживается. Для разблокировки экрана требуется ввод пароля.
      2. Использовать loginctl (блокируются/разблокируются все пользовательские сессии, требуются права суперпользователя):
        1. Блокировка:

          loginctl lock-sessions

        2. Разблокировка:

          loginctl unlock-sessions

Если используется интерфейсный модуль производителя токенов, то в качестве значения параметра pkcs11_module нужно указать путь к такому модулю. При этом установка пакета opensc-pkcs11 не обязательна.

Подробная документация по применению и настройке конфигурации доступна по ссылке https://opensc.github.io/pam_pkcs11/doc/pam_pkcs11.html.

Настройка PAM-аутентификации

  1. После установки пакета образцы конфигурации доступны в каталоге /usr/share/doc/libpam-pkcs11/examples. В зависимости от используемого обновления образцы могут быть представлены в виде архива (например, /usr/share/doc/libpam-pkcs11/examples/pam_pkcs11.conf.example.gz) или в виде текстового файла (например, /usr/share/doc/libpam-pkcs11/examples/pam_pkcs11.conf.example). Если образец представлен в виде архива, то распаковать его можно командой:
    sudo gunzip -k /usr/share/doc/libpam-pkcs11/examples/pam_pkcs11.conf.example.gz
    Архив будет распакован в файл /usr/share/doc/libpam-pkcs11/examples/pam_pkcs11.conf.example. Далее распакованный файл можно использовать как образец для создания собственных конфигурационных файлов.
  2. Добавить вызов PAM-модуля в PAM-стек. Порядок добавления и параметры вызова зависят от поставленных задач. Например:
    1. Создать в каталоге /usr/share/pam-configs/ файл с именем pkcs11 и следующим содержимым:
      Name: Pam_pkcs11
      Default: yes
      Priority: 800
      Auth-Type: Primary
      Auth: sufficient pam_pkcs11.so config_file=/etc/pam_pkcs11/pam_pkcs11.conf
      В примере задается вызов модуля на этапе PAM-cntrf auth с использованием конфигурационного файла /etc/pam_pkcs11/pam_pkcs11.conf. Модуль вызывается с высоким приоритетом (800), то есть до выполнения всех других модулей. Дополнительные параметры вызова модуля см. man pam_pkcs11.
    2. Выполнить команду:
      sudo pam-auth-update
    3. Активировать профиль Pam_pkcs11.
    4. Сохранить изменения нажав кнопку ОК.

Настройка мультивендорной конфигурации

Для работы в мультивендорной конфигурации созданы два конфигурационных файла:

  • /etc/pam_pkcs11/pam_pkcs11-rutoken.conf для ключевых носителей Рутокен;
  • /etc/pam_pkcs11/pam_pkcs11-aladdin.conf для ключевых носителей Аладдин;

В файлы внесены следующие дополнения:

  • в файл для ключевых носителей Рутокен /etc/pam_pkcs11/pam_pkcs11-rutoken.conf — добавлен интерфейсный модуль для токенов Рутокен:

    pkcs11_module rutokenecp {
        module = /usr/lib/librtpkcs11ecp.so;
        slot_num = 0;
        support_thread = true;
        ca_dir = /etc/pam_pkcs11/cacerts;
        crl_dir = /etc/pam_pkcs11/crls;
        cert_policy = signature;
    }
  • в файл для ключевых носителей Аладдин /etc/pam_pkcs11/pam_pkcs11-aladdin.conf —добавлен интерфейсный модуль для токенов Аладдин:

    pkcs11_module aladdin {
        module = /usr/lib/libjcPKCS11-2.so;
        description = "ARDS JaCarta pkcs#11 module";
        slot_num = 0;
        ca_dir = /etc/pam_pkcs11/cacerts;
        crl_dir = /etc/pam_pkcs11/crls;
        crl_policy = none;
        cert_policy = signature;
    }
  • В оба файла добавлен простейший модуль для анализа содержимого ключевых носителей. Проверяется соответствие имени аутентифицируемого пользователя имени, указанному в поле Common Name сертификата:

    mapper cn {
        debug = true;
        module = internal;
    	ignorecase = false;
    	mapfile = "none"
    }

В конфигурации PAM (файл /etc/pam.d/common-auth) добавляются два отдельных вызова PAM-модуля с разными конфигурационными файлами в качестве параметров:

auth	sufficient pam_pkcs11.so config_file=/etc/pam_pkcs11/pam_pkcs11-rutoken.conf
auth	sufficient pam_pkcs11.so config_file=/etc/pam_pkcs11/pam_pkcs11-aladdin.conf

Блокировка компьютера при извлечении ключевого носителя

В состав пакета libpam-pkcs11 входит инструмент pkcs11_eventmgr, позволяющий выполнять различные действия при возникновении событий PKCS#11.

Для настройки pkcs11_eventmgr служит файл конфигурации /etc/pam_pkcs11/pkcs11_eventmgr.conf.

Пример файла конфигурации представлен ниже:

pkcs11_eventmgr
{
    # Запуск в фоновом режиме
    daemon = true;
     
    # Настройка диагностических сообщений
    debug = false;
 
    # Время опроса в секундах
    polling_time = 1;
 
    # Установка задержки отложенной реакции на удаление ключевого носителя, секунды (по умолчанию — 0, не используется)
    expire_time = 0;
 
    # Указание pkcs11 интерфейсной библиотеки для работы с ключевыми носителями:
    pkcs11_module = /usr/lib/librtpkcs11ecp.so;
 
    # Обработка событий:
    # Ключевой носитель подключен – действия не требуются:
    event card_insert {
        on_error = ignore ;
        action = "/bin/false";
    }
 
    # Ключевой носитель извлечен — вызывается блокировщик экрана 
    event card_remove {
        on_error = ignore;
        action = "fly-wmfunc FLYWM_LOCK";
    }
 
    # После извлечения ключевого носителя истекло время задержки отложенной реакции:
    event expire_time {
        on_error = ignore;
        action = "/bin/false";
    }
}

Настройка автоматического запуска службы pkcs11_eventmgr и использования ключевых носителей разных производителей

Для автоматического запуска инструмента можно создать пользовательскую службу systemd (юнит службы systemd).  При этом для использования ключевых носителей разных производителей необходимо создать шаблоны службы, использующие разные интерфейсные библиотеки.

Важно отметить, что это не системная служба, а пользовательская:

  • юниты общих (доступных всем пользователям) пользовательских служб хранятся в каталогах /etc/systemd/user и /usr/lib/systemd/user и требуют для создания и управления привилегии суперпользователя;
  • юниты индивидуальных пользовательских служб хранятся в подкаталоге .config/systemd/user домашнего каталога пользователя и могут управляться (изменяться) пользователем без использования специальных привилегий.

Далее приведен упрощенный пример создания индивидуальной пользовательской службы с именем pkcs11_eventmgr, получающей в качестве параметра название интерфейсной библиотеки (упрощения предполагается, что все библиотеки доступны в каталоге /usr/lib). Создание такой службы не требует привилегий суперпользователя, но доступна она только создавшему её пользователю. Если службу требуется сделать глобальной (доступной для всех пользователей), юнит следует создать в каталоге /etc/systemd/user используя привилегии суперпользователя.

Для создания пользовательской службы:

  1. Выполнить команду:

    systemctl edit pkcs11_eventmgr@.service --user --full --force
    Важно: имя службы должно оканчиваться символом '@'.

  2. Ввести текст юнита и сохранить изменения:

    [Unit]
    Description=pkcs11 event manager
    
    [Service]
    Type=forking
    ExecStart=/usr/bin/pkcs11_eventmgr pkcs11_module=/usr/lib/%i.so
    StandardOutput=journal
    StandardError=journal
    
    [Install]
    WantedBy=default.target

    Как вариант можно также создать юнит, не требующий параметров и автоматически запускающий нужное количество экземпляров службы. Для этого можно использовать несколько параметров ExecStart:

    [Unit]
    Description=pkcs11 event manager
    
    [Service]
    Type=forking
    ExecStart=/usr/bin/pkcs11_eventmgr pkcs11_module=/usr/lib/<модуль-1>.so
    ExecStart=/usr/bin/pkcs11_eventmgr pkcs11_module=/usr/lib/<модуль-2>.so
    ExecStart=/usr/bin/pkcs11_eventmgr pkcs11_module=/usr/lib/<модуль-3>.so
    ...
    StandardOutput=journal
    StandardError=journal
    
    [Install]
    WantedBy=default.target
  3. После выполнения указанных действий будет создан юнит пользовательской службы pkcs11_eventmgr. Этот юнит может быть запущена в нескольких экземплярах, каждый из которых будет контролировать ключевые носители одного производителя. Все экземпляры службы при этом будут выполнять одинаковые действия, описанные в файле /etc/pam_pkcs11/pkcs11_eventmgr.conf.

  4. Далее созданная служба запускается и управляется от имени непривилегированного пользователя так же, как обычная пользовательская служба systemd:

    systemctl start pkcs11_eventmgr@libjcPKCS11-2 --user
    systemctl start pkcs11_eventmgr@librtpkcs11ecp --user
    systemctl enable pkcs11_eventmgr@libjcPKCS11-2 --user
    systemctl enable pkcs11_eventmgr@librtpkcs11ecp --user

  • Нет меток