Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

Прості паролі не захищають, а складні неможливо запам'ятати. Тому вони часто виявляються на стікері під клавіатурою чи моніторі. Щоб паролі залишалися в головах "забудькуватих" користувачів і надійність захисту не губилася - є двофакторна автентифікація (2ФА).

Завдяки поєднанню факторів володіння пристроєм та знання його PIN-коду, сам PIN-код може бути простіше та легше для запам'ятовування. Недоліки у довжині або випадковості PIN-коду компенсуються вимогою фізичного володіння та обмеженнями на перебір PIN-коду.

Крім того, в держустановах буває, що хочуть, щоби все працювало за ГОСТом. Про такий варіант 2ФА для входу в Лінукс і йтиметься. Почну здалеку.

PAM-модулі

Модулі аутентифікації (PLUggable Authentication Modules, PAM) — це модулі зі стандартним API і реалізаціями різних механізмів аутентифікації в додатках.
Всі утиліти та програми, які вміють працювати з PAM, підхоплюють їх і можуть використовувати для автентифікації користувача.
На практиці це працює приблизно так: команда login звертається до PAM, який виконує всі необхідні перевірки за допомогою зазначених у конфігураційному файлі модулів та повертає результат назад команді login.

librtpam

Розроблений компанією «Актив» модуль додає двофакторну аутентифікацію користувачів за смарт-картами або USB-токенами за допомогою асиметричних ключів за останніми стандартами вітчизняної криптографії.

Розглянемо принцип його роботи:

  • на токені зберігається сертифікат користувача та його закритий ключ;
  • сертифікат збережений у домашньому каталозі користувача як довірений.

Процес аутентифікації відбувається так:

  1. На Рутокені виконується пошук особистого сертифіката користувача.
  2. Запрошується PIN-код токена.
  3. Відбувається підпис випадкових даних на закритому ключі у чіпі Рутокена.
  4. Отриманий підпис перевіряється за допомогою відкритого ключа із сертифіката користувача.
  5. Модуль повертає результат перевірки підпису, що викликав додатку.

Можна автентифікуватися за ключами ДЕРЖСТАНДАРТ Р 34.10-2012 (довжини 256 або 512 біт) або застарілому ГОСТ Р 34.10-2001.

За безпеку ключів можна не турбуватися - вони генеруються безпосередньо в Рутокені і ніколи не залишають його пам'ять під час криптографічних операцій.

Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

Рутокен ЕЦП 2.0 сертифікований ФСБ і ФСТЕК з ПДВ 4, тому може застосовуватися в інформаційних системах, що обробляють конфіденційну інформацію.

практичне використання

Підійде практично будь-який сучасний Лінукс, наприклад ми будемо використовувати xUbuntu 18.10.

1) Встановлюємо необхідні пакети

sudo apt-get install libccid pcscd opensc
Якщо хочете додати блокування робочого столу скрінсейвером - додатково встановіть пакет libpam-pkcs11.

2) Додаємо PAM-модуль з підтримкою ГОСТів

Завантажуємо бібліотеку з https://download.rutoken.ru/Rutoken/PAM/
Копіюємо вміст папки PAM librtpam.so.1.0.0 до системної папки
/usr/lib/ або /usr/lib/x86_64-linux-gnu/або /usr/lib64

3) Встановлюємо пакет із librtpkcs11ecp.so

Завантажуємо та встановлюємо DEB- або RPM-пакет за посиланням: https://www.rutoken.ru/support/download/pkcs/

4) Перевіряємо, що Рутокен ЕЦП 2.0 працює у системі

У терміналі виконуємо
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
Якщо побачите рядок Rutoken ECP <no label> - значить все добре.

5) Зчитуємо сертифікат

Перевіряємо, що на пристрої є сертифікат
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O
Якщо після рядка:
Using slot 0 with a present token (0x0)

  • виводиться інформація про ключі та сертифікати, необхідно вважати сертифікат і зберегти на диск. Для цього виконайте наступну команду, де замість {id} потрібно підставити ID-сертифікат, який ви побачили у виведенні попередньої команди:
    $ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -r -y cert --id {id} --output-file cert.crt
    Якщо файл cert.crt створений переходимо до пункту 6).
  • нема нічого, означає пристрій порожній. Зверніться до адміністратора або створіть ключі та сертифікат самостійно, дотримуючись наступного пункту.

5.1) Створюємо тестовий сертифікат

Увага! Описані способи створення ключів та сертифікатів підходять для тестування та не призначені для застосування у бойовому режимі. Для цього потрібно використовувати ключі та сертифікати, видані довіреним центром сертифікації вашої організації або акредитованим центром, що посвідчує.
PAM-модуль створений для захисту локальних комп'ютерів і передбачає роботу в невеликих організаціях. Оскільки користувачів небагато, адміністратор може сам стежити за відкликанням сертифікатів і вручну блокувати облікові записи, як і за терміном дії сертифікатів. PAM-модуль поки не вміє перевіряти сертифікати CRL і будувати ланцюжки довіри.

Простий шлях (через браузер)

Для отримання тестового сертифіката використовуйте веб-сервіс «Центр реєстрації Рутокен». Процес займе трохи більше 5 хвилин.

Шлях гіка (через консоль та, можливо, компілятор)

Перевірте версію OpenSC
$ opensc-tool --version
Якщо версія менша ніж 0.20, то оновіться або зберіть гілку pkcs11-tool з підтримкою ГОСТ-2012 з нашого GitHub-а (на момент виходу цієї статті реліз 0.20 ще не випущений) або з гілки master основного проекту OpenSC не пізніше комміту 8cf1e6f

Генеруємо ключову пару з параметрами:
--key-type: GOSTR3410-2012-512:А (ГОСТ-2012 512 бит c парамсетом А), GOSTR3410-2012-256:A (ГОСТ-2012 256 бит с парамсетом A)

--id: ідентифікатор об'єкта (CKA_ID) у вигляді двозначних номерів символів hex з таблиці ASCII. Використовуйте лише ASCII-коди друкованих символів, тому що використовується друк. id потрібно буде передати OpenSSL у вигляді рядка. Наприклад, ASCII-кодам "3132" відповідає рядок "12". Для зручності можна скористатися онлайн-сервісом конвертації рядка в ASCII-коди.

$ ./pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-512:A -l --id 3132

Далі створюватимемо сертифікат. Нижче буде описано два шляхи: перший через УЦ (ми використовуватимемо тестові УЦ), другий – самопідписаний. Для цього спочатку потрібно встановити та налаштувати OpenSSL версії 1.1 або новіше для роботи з Рутокен через спеціальний модуль rtengine використовуючи посібник Встановлення та налаштування OpenSSL.
Наприклад: для '--id 3132' в OpenSSL треба вказувати «pkcs11:id=12".

Можна скористатися послугами тестового УЦ, яких багато, наприклад, ось, ось и ось, для цього створимо запит на сертифікат

Інший варіант - можна піддатися лінощі і створити самопідписаний
$ openssl req -utf8 -new -keyform engine -key "pkcs11:id=12" -engine rtengine -out req.csr

Завантажуємо сертифікат на пристрій
$ openssl req -utf8 -x509 -keyform engine -key "pkcs11:id=12" -engine rtengine -out cert.cer

6) Реєструємо сертифікат у системі

Переконайтеся, що ваш сертифікат виглядає як файл base64:

Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

Якщо ваш сертифікат виглядає так:

Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

то потрібно конвертувати сертифікат з формату DER у PEM-формат(base64)

$ openssl x509 -in cert.crt -out cert.pem -inform DER -outform PEM
Знову перевіряємо, що тепер усе гаразд.

Додаємо сертифікат до списку довірених сертифікатів
$ mkdir ~/.eid
$ chmod 0755 ~/.eid
$ cat cert.pem >> ~/.eid/authorized_certificates
$ chmod 0644 ~/.eid/authorized_certificates

Останній рядок захищає список довірених сертифікатів від випадкової чи навмисної зміни іншими користувачами. Це виключає ситуацію, коли хтось додасть сюди свій сертифікат та зможе входити до системи від вашого імені.

7) Налаштовуємо автентифікацію

Налаштування нашого модуля PAM абсолютно стандартне і робиться так само, як і налаштування інших модулів. Створюємо у файл /usr/share/pam-configs/rutoken-gost-pam містить повне ім'я модуля, чи включений він за умовчанням, пріоритет модуля та параметри автентифікації.
У параметрах аутентифікації є вимоги щодо успішності операції:

  • required (потрібний): такі модулі повинні повернути позитивну відповідь. Якщо результат виклику модуля містить негативну відповідь, це призведе до помилки автентифікації. Запит буде скинутий, але інші модулі будуть викликані.
  • requisite (необхідний): схожий на required, але відразу ж призводить до збою аутентифікації та ігнорує інші модулі.
  • sufficient (достатній): якщо перед таким модулем жоден із модулів required або sufficient не повернув негативного результату, то модуль поверне позитивну відповідь. Модулі, що залишилися, будуть проігноровані.
  • optional (додатковий): якщо в стеку немає модулів required і жоден із модулів sufficient не повернув позитивного результату, то хоча б один із модулів optional повинен повернути позитивну відповідь.

Повний зміст файлу /usr/share/pam-configs/rutoken-gost-pam:
Name: Rutoken PAM GOST
Default: yes
Priority: 800
Auth-Type: Primary
Auth: sufficient /usr/lib/librtpam.so.1.0.0 /usr/lib/librtpkcs11ecp.so

Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

зберігаємо файл, після цього виконуємо
$ sudo pam-auth-update
у вікні ставимо зірочку біля Rutoken PAM GOST і натискаємо OK

Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

8) Перевіряємо налаштування

Щоб зрозуміти, що все налаштовано, але при цьому не втратити можливість входу в систему, введіть команду
$ sudo login
Введіть ім'я користувача. Все налаштовано правильно, якщо система потребує PIN-код пристрою.

Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

9) Налаштовуємо блокування комп'ютера при вийманні токена

До складу пакету libpam-pkcs11 входить утиліта pkcs11_eventmgr, яка дозволяє виконувати різні дії у разі виникнення подій PKCS#11.
Для налаштування pkcs11_eventmgr служить файл конфігурації: /etc/pam_pkcs11/pkcs11_eventmgr.conf
Для різних дистрибутивів Лінукс, команда, яка викликає блокування облікового запису при вилученні смарт-карт або токена буде відрізнятися. Див. event card_remove.
Приклад файлу конфігурації наведено нижче:

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;
         
        # Вызываем функцию блокировки экрана
        
        # Для GNOME 
        action = "dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock";
        
        # Для XFCE
        # action = "xflock4";
        
        # Для Astra Linux (FLY)
        # action = "fly-wmfunc FLYWM_LOCK";
    }
 
    # Карта долгое время извлечена
    event expire_time {
        # Оставляем значения по умолчанию (ничего не происходит)
        on_error = ignore;
 
        action = "/bin/false";
    }
}

Після цього додайте програму pkcs11_eventmgr в автозавантаження. Для цього редагуйте файл .bash_profile:
$ nano /home/<имя_пользователя>/.bash_profile
Додайте рядок pkcs11_eventmgr в кінець файлу і перезавантажтеся.

Описані кроки з налаштування операційної системи можна використовувати як інструкцію в будь-якому сучасному Linux-дистрибутиві, включаючи вітчизняні.

Як використовувати PAM-модулі для локальної аутентифікації в Linux за ключами ГОСТ-2012 на Рутокені

Висновок

ПК з Linux у російських держструктурах стають все популярнішими, а налаштувати надійну двофакторну автентифікацію в цій ОС не завжди просто. Будемо раді цим посібникам допомогти вирішити “проблему паролів” та надійно захистити доступ до ПК, не витративши на це багато часу.

Джерело: habr.com

Додати коментар або відгук