Настройка двухфакторной аутентификации

Настройка двухфакторной (многофакторной) аутентификации в ОС выполняется с использованием программного модуля pam_p11 и аппаратного криптографического устройства (токена) Рутокен ЭЦП PKI.

Рассматривается разделение на рабочую станцию администратора — устройство, с которого выполняется настройка токена, и целевую станцию — устройство, на котором осуществляется вход в ОС с использованием второго фактора. В некоторых случаях обе роли могут быть совмещены на одном устройстве.

Первым фактором аутентификации выступает наличие устройства с уникальным закрытым ключом, вторым фактором — знание PIN-кода, ассоциированного с данным устройством.

Подготовка рабочих станций

Подготовка рабочих станций осуществляется в несколько этапов:

  1. Для Систем на базе платформы ROSA2021.1 и новее требуется установка следующих пакетов:
sudo dnf install task-smartcards pam_p11

При установке пакета task-smartcards автоматически создаётся группа tokenlogin. Пользователи, входящие в данную группу, проходят аутентификацию с использованием второго фактора. Остальные пользователи проходят аутентификацию по паролю;

  1. После установки пакета task-smartcards необходимо выполнить активацию службы pcscd.socket:
sudo systemctl enable --now pcscd.socket

В версиях ОС, начиная с 12.3, данная служба активирована по умолчанию. Повторная активация не приведёт к негативным последствиям.

  1. Далее необходимо провести проверку и при необходимости настройку политики polkit. Пакет pcsc-lite содержит политику org.debian.pcsc-lite.policy, разрешающую доступ к токенам всем пользователям. При необходимости допускается создание пользовательской политики в каталоге /etc/polkit-1/. В большинстве случаев дополнительная настройка не требуется.

Подготовка токена Рутокен

Подготовка токена осуществляется в несколько этапов:

  1. Подключение устройства. Токен Рутокен ЭЦП PKI должен быть подключён к рабочей станции администратора. Устройство должно определяться в Системе, например:
Bus 001 Device 005: ID 0a89:0030 Aktiv Rutoken ECP
  1. Очистка данных с токена производится с помощью команды:
pkcs15-init --erase-card -p rutoken_ecp
  1. Создание нового контейнера PKCS#15 осуществляется командой:
pkcs15-init --create-pkcs15 --so-pin "87654321" --so-puk ""

где 87654321 — PIN администратора.

  1. Присвоение контейнеру пользовательского PIN (12345678) и PIN администратора (87654321):
pkcs15-init --store-pin --label "User PIN" --auth-id 02 –pin\ "12345678" --puk "" --so-pin "87654321" --finalize
  1. Генерация ключевой пары (RSA длиной 2048 бит) с помощью команды:
pkcs15-init -G rsa/2048 --auth-id 02 --id 42 --label "SSH\ User's Key" --public-key-label "SSH User's Public Key"
  1. При выполнении команды будет запрошен PIN пользователя:
User PIN [User PIN] required. Please enter User PIN [User\ PIN]:

Необходимо ввести заданный ранее пароль 12345678.

Извлечение и перенос публичного ключа

При необходимости можно использовать токен в качестве второго фактора аутентификации при входе по SSH. Описанные далее действия можно выполнить на любой из станций.

Для использования токена при входе по SSH необходимо извлечь публичный ключ:

ssh-keygen -D /usr/lib64/opensc-pkcs11.so -I 0:42 >> key.pub

Содержимое файла key.pub требуется добавить в файл ~/.ssh/authorized_keys соответствующего пользователя на целевой станции.

Файл ~/.ssh/authorized_keys используется PAM-модулем pam_p11 независимо от наличия и настроек сервера OpenSSH.

Подготовка целевой станции

Подготовка целевой станции осуществляется в несколько этапов.

На целевой станции требуется установка модуля pam_p11:

sudo dnf install pam_p11

Добавление пользователей в группу tokenlogin (группа автоматически создается при установке пакета task-smartcards) выполняется следующими действиями:

  1. Добавление локальных пользователей:
sudo usermod -a -G tokenlogin user

где вместо user используется имя целевого пользователя.

  1. Добавление доменных пользователей с использованием механизма сопоставления групп, который реализуется с помощью пакета libnss-role.

Данный механизм позволяет считать члена одной группы (например, из домена) одновременно членом другой — локальной.

Предполагается, что на контроллере домена (Microsoft Active Directory / Samba AD либо FreeIPA) имеется группа с именем "Token Login". В случае корректного включения станции с установленной ОС РОСА "ХРОМ" в домен, Система будет видеть принадлежность доменного пользователя к данной группе.

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

sudo dnf install libnss-role

В процессе установки модуль role будет автоматически добавлен в строку "group" конфигурационного файла /etc/nsswitch.conf.

Далее следует определить соответствие между доменной группой и локальной:

sudo roleadd 'Token Login' tokenlogin

В результате в файл /etc/role будет добавлена соответствующая запись. После этого при выполнении команды id доменного пользователя в выводе отразится его принадлежность как к группе "Token Login", так и к локальной группе tokenlogin.

Список ключей пользователя

Для обеспечения возможности входа в Систему с использованием второго фактора (токена) необходимо добавить открытый ключ, извлечённый из токена, в файл ~/.ssh/authorized_keys соответствующего пользователя.

При подключённом токене требуется выполнить следующую команду:

ssh-keygen -D /usr/lib64/opensc-pkcs11.so -I 0:42

Результат выполнения команды представляет собой строку, содержащую открытый ключ. Данный ключ необходимо внести в файл ~/.ssh/authorized_keys пользователя, которому предполагается разрешение входа с использованием токена.

Процедура выполняется от имени данного пользователя и включает следующие шаги:

  1. создание каталога .ssh (при отсутствии):
mkdir --mode=700 -p ~/.ssh
  1. открытие файла ~/.ssh/authorized_keys на редактирование:
nano ~/.ssh/authorized_keys

вставка строки с открытым ключом, полученным ранее, и сохранение файла.

Файл ~/.ssh/authorized_keys используется PAM-модулем pam_p11 как при удалённом входе по SSH, так и при локальном входе через терминал. Наличие соответствующего открытого ключа в этом файле является обязательным условием для успешной аутентификации с использованием токена.

Создание общего файла настроек PAM

Для организации централизованной конфигурации аутентификации с использованием токена рекомендуется создать отдельный файл /etc/pam.d/p11, содержащий настройки, специфичные для работы PAM-модуля pam_p11.

Создание и редактирование файла выполняется следующим образом:

sudo nano /etc/pam.d/p11

В файл необходимо внести следующую конфигурацию:

auth       required    pam_env.so
#auth      required    pam_faillock.so preauth silent deny=5\ unlock_time=900
auth       required    pam_p11.so /usr/lib64/opensc-pkcs11.so
#auth      required    pam_faillock.so authfail deny=5\ unlock_time=900
password   optional    pam_p11.so /usr/lib64/opensc-pkcs11.so

После внесения изменений файл следует сохранить (в редакторе nano для этого используется комбинация клавиш Ctrl+O), затем нажать Enter и выйти по Ctrl+X.

Если планируется использование модуля pam_faillock для защиты от подбора PIN-кода, необходимо удалить символ "#" в начале соответствующих строк, тем самым активировав их (раскомментировать).

В дальнейшем при необходимости следует указать подключение данного файла (стека p11) в других PAM-конфигурациях, например, в файлах login, sshd или gdm-password, посредством директивы substack p11.

Особенности работы pam_p11

Если ни один из ранее вызванных модулей PAM не запросил пароль, pam_p11 инициирует его запрос и использует введённый PIN-код для доступа к закрытому ключу на токене. Если же пароль уже получен предыдущим модулем, pam_p11 использует его как PIN-код. В конфигурациях, приведённых в данном разделе руководства, модуль pam_p11 всегда вызывается первым и самостоятельно инициирует ввод PIN-кода.

Расширенная настройка

Далее в разделе Настройка двухфакторной аутентификации — Расширенные настройки рассматриваются типовые примеры настройки PAM для использования второго фактора аутентификации. При необходимости допускается реализация более сложных и специфичных конфигураций PAM-модулей.

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

man pam.conf

Просмотр логов

После выполнения попытки входа в Систему возможно получение диагностической информации о работе PAM-модулей, в том числе pam_p11, посредством системного журнала:

sudo journalctl -b | grep pam_p11

Вывод ограничивается сообщениями текущего сеанса загрузки Системы. При необходимости фильтрация может быть адаптирована под другие модули или условия.

Настройка входа в TTY

Настройка, при которой токен используется исключительно при входе в Систему через терминал TTY (переключение с помощью сочетания клавиш Alt+Ctrl+FN), выполняется в конфигурационном файле /etc/pam.d/login.

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

sudo nano /etc/pam.d/login

Затем внести следующие изменения в файл:

  1. Замена строки "auth include system-auth" на блок:
auth [default=1 success=ignore] pam_succeed_if.so user\ ingroup\ tokenlogin
auth substack p11
auth [default=ignore success=1] pam_succeed_if.so user\ ingroup\ tokenlogin
auth substack system-auth
  1. Замена строки "password include system-auth" на блок:
password [default=1 success=ignore] pam_succeed_if.so user\ ingroup tokenlogin
password substack p11
password [default=ignore success=1] pam_succeed_if.so user\ ingroup tokenlogin
password substack system-auth

После сохранения изменений рекомендуется выполнить вход через терминал TTY под пользователем, для которого ранее был настроен ключ SSH. При возникновении проблем следует обратиться к журналу Системы, как описано в п. Просмотр логов.

Настройка входа через GDM

Для настройки входа через графический дисплей-менеджер GDM требуется изменение файла /etc/pam.d/gdm-password.

Необходимо открыть файл на редактирование с правами суперпользователя (например, с помощью редактора nano):

sudo nano /etc/pam.d/gdm-password

Далее внести в файл /etc/pam.d/gdm-password следующие изменения:

  1. закомментировать строки (добавить символ "#" в начало строки):
auth        substack      password-auth
auth        optional      pam_gnome_keyring.so
  1. добавить после закомментированных строк следующий блок:
auth [default=1 success=ignore] pam_succeed_if.so user\ ingroup tokenlogin
auth substack p11
auth [default=ignore success=1] pam_succeed_if.so user\ ingroup tokenlogin
auth substack password-auth
  1. аналогично закомментировать следующие строки:
password    substack       password-auth
-password   optional       pam_gnome_keyring.so use_authtok

Следует обратить внимание, что отключение модуля pam_gnome_keyring необходимо в данном случае, поскольку его назначение — автоматическая разблокировка пользовательского хранилища ключей при совпадении пароля от хранилища с системным паролем пользователя — теряет смысл при использовании PIN-кода и токена.

  1. добавить после них блок:
password [default=1 success=ignore] pam_succeed_if.so user\ ingroup tokenlogin
password substack p11
password [default=ignore success=1] pam_succeed_if.so user\ ingroup tokenlogin
password substack system-auth

сохранить изменения в файле и выполнить вход в Систему через GDM. При корректной настройке вместо стандартного пароля будет запрошен PIN-код от токена.

Настройка входа по SSH

При входе в Систему по SSH с использованием токена в качестве второго фактора аутентификации токен должен быть физически подключён к рабочей станции, с которой производится подключение, а на целевой станции должен быть зарегистрирован только открытый ключ.

Содержимое открытого ключа, извлечённого с токена, должно быть добавлено в файл ~/.ssh/authorized_keys соответствующего пользователя на целевой станции. Порядок извлечения ключа приведён в п. Извлечение и перенос публичного ключа.

Вход по SSH с вводом PIN-кода и пароля

Настройка целевой станции

Рассматривается конфигурация, при которой при входе по SSH пользователь сначала вводит PIN-код токена, а затем — свой пароль. В данном варианте PAM-модуль pam_p11 не требуется.

Для активации данного режима необходимо запретить вход по паролю, разрешив только комбинацию открытого ключа и интерактивной аутентификации, командой:

echo "AuthenticationMethods publickey,keyboard-interactive"\ | sudo tee -a /etc/ssh/sshd_config

Также необходимо убедиться, что параметр UsePAM в том же файле установлен в значение yes (данное значение задано по умолчанию в ОС):

UsePAM yes

При необходимости скорректировать значение и перезапустить службу SSH:

sudo systemctl restart sshd

Вход с рабочей станции

На рабочей станции, с которой выполняется подключение, должен быть установлен и подключён токен. Подключение осуществляется по следующей команде:

ssh -I /usr/lib64/opensc-pkcs11.so -p <порт>\ <пользователь>@<ip\
-адрес>

где параметры:

  • <порт> — номер порта, на котором запущен sshd на целевой станции (по умолчанию – 22);
  • <пользователь> — имя пользователя на целевой станции;
  • <ip-адрес> — IP-адрес целевой станции.

После выполнения команды будет последовательно запрошено:

  • PIN-код от токена;
  • пароль пользователя.

Вход по SSH только с вводом PIN-кода

Настройка целевой станции

В данной конфигурации используется модуль pam_p11, а пользователь выполняет вход исключительно по PIN-коду без ввода системного пароля:

  1. открыть на редактирование PAM-конфигурацию для sshd:
sudo nano /etc/pam.d/sshd
  1. закомментировать строку (добавить символа "#" в начало строки):
auth       include      system-auth
  1. вставить вместо неё блок:
auth [default=1 success=ignore] pam_succeed_if.so user ingroup\ tokenlogin
auth substack p11
auth [default=ignore success=1] pam_succeed_if.so user ingroup\ tokenlogin
auth substack system-auth
  1. аналогично закомментировать строку:
password   includesystem-auth
  1. вставить вместо неё блок:
password [default=1 success=ignore] pam_succeed_if.so user\ ingroup tokenlogin
password substack p11
password [default=ignore success=1] pam_succeed_if.so user\ ingroup tokenlogin
password substack system-auth
  1. убедиться, что параметр UsePAM в /etc/ssh/sshd_config установлен в значение "yes".

Вход с рабочей станции

Токен должен быть подключён к рабочей станции, с которой производится вход. Подключение выполняется командой:

ssh -I /usr/lib64/opensc-pkcs11.so -p <порт>\ <пользователь>@<ip\-адрес>

После этого будет запрошен только PIN-код. При корректной настройке вход будет выполнен без запроса системного пароля пользователя.