2FA
Содержание
Введение
Эта статья описывает настройку многофакторной (двухфакторной) аутентификация в операционных системах на базе платформ rosa2019.05 (Никель), rosa2021.1 и новее (ОС ROSA Fresh 12+, Chrome 12+).
Также описывается использование токена или смарткарты для однофакторного входа в систему с использованием PIN-кода вместо пароля, а не в дополнение к нему.
Разбирается отдельно настройка рабочей станции администратора — компьютера, на котором будет производиться настройка токена — и целевой рабочей станции — компьютера (ПК или сервера), в установленную на котором операционную систему будут входить с использованием второго фактора — токена.
Подготовка рабочих станций
Описаны действия, которые необходимо выполнить и на рабочей станции администратора, и на целевых рабочих станциях.
Установите необходимые пакеты: для дистрибутивов на базе платформы 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 на Никель, не имел запущенных сессий. Достаточно запустить ОС до экрана входа в систему.
Подготовка целевой станции
Настройка входа по SSH
В этом разделе описана настройка, при которой токен в качестве второго фактора будет использоваться только при входе по SSH. Токен при этом будет подключен к машине, с которой осуществляют вход, а на этой машине будет лишь публичный ключ в списке доверенных.
Содержимое открытого ключа должно быть добавлено в ~/.ssh/authorized_keys у нужного пользователя на целевой станции, что было описано в предыдущем пункте.
Необходимо запретить SSH-вход по паролю:
echo "AuthenticationMethods publickey,keyboard-interactive" | sudo tee -a /etc/ssh/sshd_config
И перезапустить sshd:
sudo systemctl restart sshd
Настройка входа в TTY
Описывается настройка, при которой токен будет использоваться только при входе в TTY (alt+ctrl+fN). Токен должен быть подключен к машине, на которой осуществляется вход.
В файл ~/.ssh/authorized_keys нужного пользователя добавьте публичный ключ, как описано выше.
Откройте файл /etc/pam.d/login на редактирование с правами root, например:
sudo nano /etc/pam.d/login
Перед началом строки "auth include system-auth" добавьте строку:
auth required pam_p11.so /usr/lib64/opensc-pkcs11.so
Откройте TTY и попробуйте войти под пользователем, для которого добавили ключ SSH.
При подобной настройке ("required") вход пользователей, для которых не настроен публичный ключ, или при отсутствии подключенного токена будет невозможен. Подробнее о настройке можно почитать в документации:
man pam.conf
Теперь при входе в TTY будет запрашиваться пин-код токена, затем пароль пользователя. Логи можно посмотреть так:
sudo journalctl -b | grep pam_p11
Вход по SSH
При входе по SSH токен должен быть подключен к машине, с которой производится вход. Эта машина должна быть подготовлена в соответствии с разделом «Подготовка рабочих станций».
Выполните:
ssh -I /usr/lib64/opensc-pkcs11.so -p port user@ip
где:
- port — числовое обозначение порта, на котором запущен sshd на целевой станции, обычно 22
- user — имя пользователя на целевой станции
- ip — адрес целевой станции
Сначала будет запрошен пин-код от токена, правильный ввод которого позволит произвести подпись с использованием хранимого на токене закрытого ключа, а затем пароль пользователя, под которым выполняется вход.
Однофакторная аутентификация
Если в строке
auth required pam_p11.so /usr/lib64/opensc-pkcs11.so
в /etc/pam.d/* заменить "required" на "sufficient", то есть получить такую строку:
auth sufficient /usr/lib64/opensc-pkcs11.so
то для входа в систему будет достаточно ввести пин-код от токена.
Подробнее о настройке написано в pam.conf(5):
man pam.conf
Программная методика испытаний на Никеле
Описан механизм тестирования данного функционала на ОС РОСА Никель.
- Установить ОС на первую машину (под машиной здесь и далее понимается физический или виртуальный компьютер). Выключить машину.
- Установить ОС на вторую машину. Выключить вторую машину.
- Выполнять пункт про подготовку рабочих станций не нужно: в ОС Никель имеются необходимые пакеты и включен pcscd.
- Включить первую машину, войти под созданным при установке пользователем под уровнем s0.
- Включить вторую машину, войти в систему, командой "/sbin/ip a" узнать IP-адрес, завершить сеанс.
- Выполнить раздел "Подготовка токена Рутокен" на первой машине.
- Выполнить раздел "Извлечение и перенос ключа для SSH" на первой машине, при выполнении ssh-copy-id произвести подключение ко второй машине.
- Войти под s0 на второй машине.
- Выполнить пункт "Настройка входа по SSH" на второй машине.