Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux
В однієї з наших попередніх статей ми розповідали про важливість двофакторної автентифікації на корпоративних порталах компаній. Минулого разу ми продемонстрували, як налаштувати безпечну автентифікацію у web-сервері IIS.

У коментарях нас просили написати інструкцію для найпоширеніших web-серверів під Linux – nginx та Apache.

Ви просили – ми написали.

Що треба, щоби почати?

  • Будь-який сучасний дистрибутив Linux. Я виконував тестове налаштування у MX Linux 18.2_x64. Це, звичайно, не серверний дистрибутив, але для Debian навряд чи будуть якісь відмінності. Для інших дистрибутивів можуть трохи відрізнятися шляхи до бібліотек-конфігів.
  • Токен. Ми продовжуємо використовувати модель Рутокен ЕЦП PKIяка ідеально підходить за швидкісними характеристиками для корпоративного застосування.
  • Для роботи з токеном у Linux необхідно встановити такі пакети:
    libccid libpcsclite1 pcscd pcsc-tools opensc

Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

Виписування сертифікатів

У попередніх статтях ми спиралися на те, що сертифікати сервера та клієнтів виписуватимуться за допомогою Microsoft CA. Але якщо ми налаштовуємо все в Linux, то заразом розповімо про альтернативний спосіб виписування цих сертифікатів — не залишаючи Linux.
Як CA будемо використовувати XCA (https://hohnstaedt.de/xca/), який доступний у будь-якому сучасному дистрибутиві Linux. Всі дії, які ми будемо робити в XCA, можна зробити і в режимі командного рядка за допомогою утиліт OpenSSL і pkcs11-tool, але для більшої простоти та наочності в цій статті ми їх наводити не будемо.

Початок роботи

  1. Встановлюємо:
    $ apt-get install xca
  2. І запускаємо:
    $ xca
  3. Створюємо нашу базу даних для CA - /root/CA.xdb
    Ми рекомендуємо зберігати базу даних Certificate Authority у папці, куди є доступ лише адміністратора. Це важливо для захисту закритих ключів кореневих сертифікатів, які використовуються для підписування всіх інших сертифікатів.

Створюємо ключі та сертифікат root CA

В основі інфраструктури відкритих ключів лежить ієрархічна система. Головним у цій системі є кореневий центр сертифікації чи root CA. Його сертифікат і треба створити насамперед.

  1. Створюємо для CA закритий ключ RSA-2048. Для цього на вкладці Приватні ключі натискаємо Новий ключ та вибираємо відповідний тип.
  2. Задаємо ім'я для нової ключової пари. Я її назвав CA Key.
  3. Виписуємо сертифікат CA, з використанням створеної ключової пари. Для цього переходимо на вкладку сертифікати і натискаємо Новий сертифікат.
  4. Обов'язково вибираємо SHA-256Тому що використання SHA-1 вже не може вважатися безпечним.
  5. Як шаблон обов'язково вибираємо [default] CA. Не забудьте натиснути на Застосувати все, інакше шаблон не застосовується.
  6. На вкладці Тема вибираємо нашу ключову пару. Також ви можете заповнити всі основні поля сертифіката.

Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

Створюємо ключі та сертифікат https-сервера

  1. Аналогічно створюємо для сервера закритий ключ RSA-2048, я його назвав - Server Key.
  2. Під час створення сертифіката вибираємо, що сертифікат сервера необхідно підписати на сертифікаті CA.
  3. Не забуваємо вибрати SHA-256.
  4. Як шаблон вибираємо [default] HTTPS_server. Тиснемо на Застосувати все.
  5. Після чого на вкладці Тема вибираємо наш ключ та заповнюємо потрібні поля.

Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

Створюємо ключі та сертифікат для користувача

  1. Закритий ключ користувача зберігатиметься на нашому токені. Для роботи з ним необхідно встановити бібліотеку PKCS#11 з нашого сайту. Для популярних дистрибутивів ми розповсюджуємо готові пакети, які лежать тут. https://www.rutoken.ru/support/download/pkcs/. У нас також є збірки для arm64, armv7el, armv7hf, e2k, mipso32el, які можна взяти в нашому SDK https://www.rutoken.ru/developers/sdk/. Крім збірок для linux також є збірки для macOS, freebsd та android.
  2. Додаємо новий PKCS#11 Provider у XCA. Для цього йдемо в меню Опції на вкладку PKCS#11 Provider.
  3. Тиснемо додавати та вибираємо шлях до бібліотеки PKCS#11. У моєму випадку це usrliblibrtpkcs11ecp.so.
  4. Нам знадобиться відформатований токен Рутокен ЕЦП PKI. Завантажуємо утиліту rtAdmin https://dev.rutoken.ru/pages/viewpage.action?pageId=7995615
  5. виконуємо
    $ rtAdmin -f -q -z /usr/lib/librtpkcs11ecp.so -u <PIN-код пользователя>
  6. Як тип ключа вибираємо - ключ RSA-2048 на Рутокен ЕЦП PKI. Я назвав цей ключ Client Key.

    Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

  7. Вводимо PIN-код. І чекаємо на завершення апаратної генерації ключової пари

    Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

  8. Сертифікат для користувача створюємо за аналогією із сертифікатом сервера. На цей раз вибираємо шаблон [default] HTTPS_client і не забуваємо натиснути Застосувати все.
  9. На вкладці Тема вводимо інформацію про користувача. На запит про збереження сертифіката на токен відповідаємо ствердно.

У результаті на вкладці Сертифікати у XCA має вийти приблизно така картинка.

Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux
Цього мінімального набору ключів та сертифікатів достатньо для того, щоб розпочати налаштування безпосередньо серверів.

Для налаштування нам необхідно виконати експорт сертифіката УЦ, сертифіката сервера та закритого ключа сервера.

Для цього треба вибрати потрібний запис на відповідній вкладці XCA і натиснути Експорт.

Nginx

Як встановити та запустити nginx-сервер, писати не буду — на цю тему достатньо статей в інтернеті, не кажучи вже про офіційну документацію. Приступимо відразу до налаштування HTTPS та двофакторної автентифікації по токену.

Додаємо до секції server у nginx.conf наступні рядки:

server {
	listen 443 ssl;
	ssl_verify_depth 1;
	ssl_certificate /etc/nginx/Server.crt;
	ssl_certificate_key /etc/nginx/ServerKey.pem;
	ssl_client_certificate /etc/nginx/CA.crt;
	ssl_verify_client on;
}

Детальний опис всіх параметрів, що стосуються налаштування ssl в nginx, можна знайти тут. https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate

Я лише коротко опишу ті, які сам поставив:

  • ssl_verify_client - вказує, що необхідно перевірити ланцюжок довіри до сертифіката.
  • ssl_verify_depth - визначає глибину пошуку довіреного кореневого сертифіката в ланцюжку. Оскільки сертифікат клієнта одразу підписаний на кореневому сертифікаті, то й глибина задана — 1. Якщо сертифікат користувача підписується на проміжному CA, то в цьому параметрі необхідно вказати 2, і так далі.
  • ssl_client_certificate — вказує шлях до довіреного кореневого сертифіката, який використовується для перевірки довіри до сертифіката користувача.
  • ssl_certificate/ssl_certificate_key — вказують шлях до сертифіката/закритого ключа сервера.

Не забуваємо виконати nginx -t, щоб перевірити, що в конфізі немає друкарських помилок, а всі файли лежать де треба і так далі.

І все! Як бачите, налаштування дуже проста.

Перевіряємо роботу у Firefox

Якщо ми все повністю робимо в Linux, то вважатимемо, що й наші користувачі теж працюють у Linux (якщо в них Windows, то дивіться інструкцію з налаштування браузерів у попередній статті.

  1. Запускаємо Firefox.
  2. Спробуємо спочатку зайти без токена. Отримуємо ось таку картинку:

    Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

  3. заходимо на about: уподобання # конфіденційність, і йдемо в Security Devices…
  4. Тиснемо Навантаженнящоб додати новий PKCS#11 Device Driver і вказуємо шлях до нашої librtpkcs11ecp.so.
  5. Для перевірки того, що сертифікат бачиться, можна зайти в Диспетчер сертифікатів. З'явиться запит на введення PIN-коду. Після коректного введення можна перевірити, що на вкладці Your Certificates з'явився наш сертифікат із токена.
  6. Тепер заходимо із токеном. Firefox пропонує вибрати сертифікат, який буде вибрано на сервер. Вибираємо наш сертифікат.

    Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

  7. PROFIT!

    Двофакторна аутентифікація на сайті з використанням USB-токену. Тепер і для Linux

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

Apache

Так само як і з nginx проблем із встановленням apache ні в кого не повинно виникнути. Якщо ви не знаєте, як встановити цей web-сервер, просто скористайтеся офіційною документацією.

А ми приступаємо до налаштування нашого HTTPS та двофакторної аутентифікації:

  1. Для початку необхідно активувати mod_ssl:
    $ a2enmod ssl
  2. А потім увімкнути налаштування HTTPS сайту за промовчанням:
    $ a2ensite default-ssl
  3. Тепер редагуємо конфігураційний файл: /etc/apache2/sites-enabled/default-ssl.conf:
        SSLEngine on
        SSLProtocol all -SSLv2
    
        SSLCertificateFile	/etc/apache2/sites-enabled/Server.crt
        SSLCertificateKeyFile /etc/apache2/sites-enabled/ServerKey.pem
    
        SSLCACertificateFile /etc/apache2/sites-enabled/CA.crt
    
        SSLVerifyClient require
        SSLVerifyDepth  10

    Як бачите, назви параметрів практично збігаються з назвами параметрів в nginx, тому пояснювати я їх не буду. Знову ж кому цікаві подробиці — ласкаво просимо до документації.
    Тепер перезапускаємо наш сервер:

    $ service apache2 reload
    $ service apache2 restart

  4. Як бачите налаштувати двофакторну автентифікацію на будь-якому веб-сервері, що в Windows, що в Linux справа однієї години максимум. А налаштування браузерів займає близько 5 хвилин. Багато хто вважає, що налаштування та робота з двофакторною автентифікацією це складно та незрозуміло. Сподіваюся, наша стаття хоч трохи, але розвінчує цей міф.

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

Чи потрібна інструкція з налаштування роботи TLS із сертифікатами на ГОСТ 34.10-2012:

  • Так, TLS-ГОСТ дуже потрібний

  • Ні, налаштування з ГОСТ-алгоритмами не цікаве

Проголосували 44 користувачів. Утрималися 9 користувачів.

Джерело: habr.com

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