2FA

Материал из Rosalab Wiki
Версия от 15:34, 22 апреля 2022; Mikhailnov (обсуждение | вклад) (Программная методика испытаний на Никеле)

Перейти к: навигация, поиск

Введение

О статье

Эта статья описывает настройку многофакторной (двухфакторной) проверки подлинности (аутентификации) в операционных системах на базе платформ rosa2019.05 (Никель), rosa2021.1 и новее (ОС ROSA Fresh 12+, Chrome 12+).

Разбирается отдельно настройка рабочей станции администратора — компьютера, на котором будет производиться настройка токена — и целевой рабочей станции — компьютера (ПК или сервера), в установленную на котором операционную систему будут входить с использованием второго фактора — токена.

Что считаем факторами проверки подлинности

Пользователю и только пользователю известен пароль (PIN-код) — уникальная последовательность символов.

У пользователя имеется устройство со встроенными криптографическими функциями — токен — или устройство с уникальной меткой радиочастотного распознавания (RFID) — смарткарта — и устройство для распознавания метки.

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

При входе в систему пользователь PAM-модуль pam_p11 создает случайную последовательность символов, запрашивает у пользователя PIN-код как пароль от хранящегося на токене закрытого ключа, просит токен подписать созданную случайную последовательность и проверяет полученную от токена подпись по открытому ключу, хранящемуся в файле с разрешенными для пользователя ОС открытыми ключами. Если проверка проходит успешно, то pam_p11 дает добро на вход пользователя в систему, если нет, то не дает.

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

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

Описаны действия, которые необходимо выполнить и на рабочей станции администратора, и на целевых рабочих станциях.

Установите необходимые пакеты: для дистрибутивов на базе платформы rosa2021.1 и новее (Fresh/Chrome 12+):

sudo dnf install task-smartcards

(в большинстве десктопных дистрибутивов необходимые пакеты имеются из коробки)

Включите pcscd.socket:

sudo systemctl enable --now pcscd.socket

В дистрибутивах платформы rosa2021.1 версии 12.3 и новее он включен из коробки, однако выполнение команды выше не выключит его (не навредит).

В состав пакета pcsc-lite есть политика polkit (/usr/share/polkit-1/actions/org.debian.pcsc-lite.policy). Она разрешает демону pcscd давать всем пользователям доступ к любым токенам. При необходимости можно в /etc/polkit-1/ создать соответствующие файлы для переопределения таковой политики. В большинстве случаев этого не требуется.

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

Используется устройство Рутокен ЭЦП PKI, в выводе lsusb оно видно так:

Bus 001 Device 005: ID 0a89:0030 Aktiv Rutoken ECP

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

Стираем информацию с токена:

pkcs15-init --erase-card -p rutoken_ecp

Создаем контейнер PKCS#15:

pkcs15-init --create-pkcs15 --so-pin "87654321" --so-puk ""

где 87654321 — пин-код администратора.

Присваиваем контейнеру пользовательский PIN (12345678) и PIN администратора (87654321):

pkcs15-init --store-pin --label "User PIN" --auth-id 02 --pin "12345678" --puk "" --so-pin "87654321" --finalize

Генерируем пару ключей (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"

Будет запрошен пин-код:
User PIN [User PIN] required.
Please enter User PIN [User PIN]:
Вводим: «12345678».

Извлечение и перенос ключа для SSH

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

Копируем открытый ключ с токена в файл key.pub (файл появится в текущей директории):

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

Теперь содержимое файла key.pub нужно добавить отдельной строкой в ~/.ssh/authorized_keys на целевой рабочей станции любым способом, например:

ssh-copy-id -p port user@ip

где:

  • port — числовое обозначение порта, на котором запущен sshd на целевой станции, обычно 22
  • user ­— имя пользователя на целевой станции
  • ip — адрес целевой станции

Обратите внимание, что на ОС Никель в файле /etc/security/limits.d/10-maxlogins.conf задано, что у одного пользователя может быть только одна активная сессия, поэтому нужно, чтобы пользователь, под которым входим по SSH на Никель, не имел запущенных сессий. Достаточно запустить ОС до экрана входа в систему.

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

Настройка механизмов авторизации

Установка пакета

На целевой станции установите необходимый PAM-модуль:

sudo dnf install pam_p11

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

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

при подключенном токене выполните:

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

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

Общий файл настроек PAM

Создаем и открываем на редактирование файл /etc/pam.d/p11:

sudo nano /etc/pam.d/p11

Вставляем в него следующий текст:

auth required pam_p11.so /usr/lib64/opensc-pkcs11.so
password optional pam_p11.so /usr/lib64/opensc-pkcs11.so

и сохраняем (в редакторе nano для этого нужно последовательно нажать: Ctrl+O, Enter, Ctrl+X).

Далее в другие файлы в каталоге /etc/pam.d/ при необходимости пропишем подключение этого файла.

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

Расширенная документация

В этой инструкции приводятся типовые примеры написания файлов настроек PAM, однако можно сделать иные, в т.ч. более сложные конструкции. С документацией по форматы файлов с настройками PAM можно ознакомиться в pam.conf(5):

man pam.conf

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

После попытки входа под пользователем можно ознакомиться с логами так:

sudo journalctl -b | grep pam_p11

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

Описывается настройка, при которой токен будет использоваться только при входе в TTY (alt+ctrl+fN). Токен должен быть подключен к машине, на которой осуществляется вход.

Откройте файл /etc/pam.d/login на редактирование с правами root, например:

sudo nano /etc/pam.d/login

Замените строку:

auth include system-auth

на:

auth include p11

Замените строку:

password include system-auth

на:

password include p11

Сохраните изменения в файле.

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

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

Описывается настройка GDM (менеджера входа по умолчанию в ROSA Fresh/Chrome 12+) для входа с использованием PIN-кода вместо пароля.

Откройте файл /etc/pam.d/login на редактирование с правами root, например:

sudo nano /etc/pam.d/login

Здесь и далее под закомментированием строки понимается добавление символа решетки (#) в начало строки.

Закомментируйте следующие строки:

auth        substack      password-auth
auth        optional      pam_gnome_keyring.so

После них добавьте строку:

auth include p11

Закомментируйте следующие строки:

password    substack       password-auth
-password   optional       pam_gnome_keyring.so use_authtok

После них добавьте строку:

password include p11

Сохраните изменения в файле.

Мы отключаем pam_gnome_keyring, поскольку он не имеет смысл в такой конфигурации: его смысл в том, чтоб автоматически разблокировать хранилище ключей пользователя, если пароль пользователя совпадает с паролем от хранилища.

Попробуйте войти через GDM. Вместо пароля будет запрошен PIN-код.

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

Описывается настройка KDM в ОС «РОСА Никель» (rosa2019.05) для входа с использованием PIN-кода вместо пароля.

Пакет kdm должен быть версии 4.11.22-63 или новее.

Откройте файл /etc/pam.d/kde на редактирование с правами root, например:

sudo nano /etc/pam.d/kde

Здесь и далее под закомментированием строки понимается добавление символа решетки (#) в начало строки.

Закомментируйте следующую строку:

auth include system-auth

После нее добавьте строку:

auth required pam_p11.so /usr/lib64/opensc-pkcs11.so

Закомментируйте следующую строку:

password include system-auth

После нее добавьте строку:

password optional pam_p11.so /usr/lib64/opensc-pkcs11.so

Сохраните изменения в файле. Обратите внимание, что не используется директива "include", т.к. KDM в Никеле проверяет, включена ли двухфакторная авторизация, поиском строк "auth ... pam_p11.so" или "auth ... pam_pkcs11.so" в /etc/pam.d/kde.

Попробуйте войти через KDM. Вместо пароля введите PIN-код.

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

В этом разделе описана настройка, при которой токен в качестве второго фактора будет использоваться только при входе по SSH. Токен при этом будет подключен к машине, с которой осуществляют вход, а на этой машине будет лишь публичный ключ в списке доверенных.

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

Вход по SSH по PIN-коду и паролю
Настройка целевой станции

Рассмотрим такую настройку SSHD, когда для входа нужно ввести сначала PIN-код, а затем пароль пользователя. pam_p11 не требуется.

Необходимо запретить SSH-вход по паролю:

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

При этом директива "UsePAM" в файле /etc/ssh/sshd_config должна иметь значение "Yes" (по умолчанию в Росе). При необходимости исправьте ее значение. Если поставите "No", то будет запрашиваться только PIN-код, а пароль не будет.

Перезапустите sshd:

sudo systemctl restart sshd
Вход с рабочей станции

При входе по SSH токен должен быть подключен к машине, с которой производится вход (к рабочей станции). Эта машина должна быть подготовлена в соответствии с разделом «Подготовка рабочих станций».

Выполните:

ssh -I /usr/lib64/opensc-pkcs11.so -p port user@ip

где:

  • port — числовое обозначение порта, на котором запущен sshd на целевой станции, обычно 22
  • user ­— имя пользователя на целевой станции
  • ip — адрес целевой станции

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

2022-04-19 15-11 cut.png

Вход по SSH по PIN-коду
Настройка целевой станции

Рассмотрим такую настройку SSHD, когда для входа нужно ввести только PIN-код, а пароль вводить не нужно.

Откройте на редактирование файл /etc/pam.d/sshd, например:

sudo nano /etc/pam.d/sshd

Закомментируйте строку:

auth       include      system-auth

После нее добавьте строку:

auth include p11

Закомментируйте строку:

password   include	system-auth

После нее добавьте строку:

password include p11

И сохраните изменения в файле.

Директива "UsePAM" в файле /etc/ssh/sshd_config должна иметь значение "Yes" (по умолчанию в Росе), при необходимости исправьте.

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

При входе по SSH токен должен быть подключен к машине, с которой производится вход (к рабочей станции). Эта машина должна быть подготовлена в соответствии с разделом «Подготовка рабочих станций».

Выполните:

ssh -I /usr/lib64/opensc-pkcs11.so -p port user@ip

где:

  • port — числовое обозначение порта, на котором запущен sshd на целевой станции, обычно 22
  • user ­— имя пользователя на целевой станции
  • ip — адрес целевой станции

Будет запрошен PIN-код.

2022-04-22 12-16.png

Программная методика испытаний на Никеле

Описан механизм тестирования данного функционала на ОС РОСА Никель.

  1. Установить ОС на первую машину (под машиной здесь и далее понимается физический или виртуальный компьютер). Выключить машину.
  2. Установить ОС на вторую машину. Выключить вторую машину.
  3. Выполнять пункт про подготовку рабочих станций (п. 2) не нужно: в ОС Никель имеются необходимые пакеты и включен pcscd.
  4. Включить первую машину, войти под созданным при установке пользователем под уровнем s0.
  5. Включить вторую машину, войти в систему, командой "/sbin/ip a" узнать IP-адрес, завершить сеанс.
  6. Выполнить раздел "Подготовка токена Рутокен" (п. 3) на первой машине.
  7. Выполнить раздел "Извлечение и перенос ключа для SSH" (п. 4) на первой машине, при выполнении ssh-copy-id произвести подключение ко второй машине.
  8. Войти под s0 на второй машине.
  9. Выполнить пункт 5.1.9.1.1 на второй машине.
  10. Выполнить пункт 5.1.9.1.2 на первой машине, войдя по SSH на вторую машину.
  11. При необходимости установить обновление kdm и пакет pam_p11 (это временная мера, см. доп. инструкцию)
  12. В ~/.ssh/authorized_keys уже будет добавлен ключ после выполнения раздела "Извлечение и перенос ключа для SSH" (п. 4), при необходимости добавить ключ согласно п. 5.1.2 (для локальной авторизации список ключей хранится тоже в ~/.ssh/authorized_keys)
  13. Выполнить п. 5.1.8 "Настройка входа через KDM", проверить вход через графический менеджер входа (KDM)
  14. Выполнить п. 5.1.3 "Общий файл настроек PAM"
  15. Выполнить п. 5.1.6 "Настройка входа в TTY", проверить вход в TTY