Хабрахабр

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

В одной из наших предыдущих статей мы рассказывали про важность двухфакторной аутентификации на корпоративных порталах компаний. В прошлый раз мы продемонстрировали, как настроить безопасную аутентификацию в web-сервере IIS.

В комментариях нас просили написать инструкцию для самых распространенных web-серверов под Linux — nginx и Apache.

Вы просили — мы написали.

Что надо, чтобы начать?

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

Выписывание сертификатов

В предыдущих статьях мы опирались на то, что сертификаты сервера и клиентов будут выписываться с помощью 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

В основе инфраструктуры открытых ключей (PKI) лежит иерархическая система. Главным в этой системе является корневой центр сертификации или root CA. Его сертификат и надо создать в первую очередь.

  1. Создаём для CA закрытый ключ RSA-2048. Для этого на вкладке Private Keys нажимаем New Key и выбираем соответствующий тип.
  2. Задаём имя для новой ключевой пары. Я её назвал — CA Key.
  3. Выписываем сам сертификат CA, с использованием созданной ключевой пары. Для этого переходим на вкладку Certificates и нажимаем New Certificate.
  4. Обязательно выбираем SHA-256, потому что использование SHA-1 уже не может считаться безопасным.
  5. В качестве шаблона обязательно выбираем [default] CA. Не забудьте нажать на Apply all, иначе шаблон не применяется.
  6. На вкладке Subject выбираем нашу ключевую пару. Там же вы можете заполнить все основные поля сертификата.

Создаём ключи и сертификат https-сервера

  1. Аналогичным образом создаём для сервера закрытый ключ RSA-2048, я его назвал — Server Key.
  2. При создании сертификата выбираем, что сертификат сервера необходимо подписать на сертификате CA.
  3. Не забываем выбрать SHA-256.
  4. В качестве шаблона выбираем [default] HTTPS_server. Жмём на Apply all.
  5. После чего на вкладке Subject выбираем наш ключ и заполняем нужные поля.

Создаём ключи и сертификат для пользователя

  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. Для этого идём в меню Options на вкладку PKCS#11 Provider.
  3. Жмём Add и выбираем путь до библиотеки PKCS#11. В моём случае это \usr\lib\librtpkcs11ecp.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.

  7. Вводим PIN-код. И ждём завершения аппаратной генерации ключевой пары

  8. Сертификат для пользователя создаём по аналогии с сертификатом сервера. На этот раз выбираем шаблон [default] HTTPS_client и не забываем нажать Apply all.
  9. На вкладке Subject вводим информацию о пользователе. На запрос о сохранении сертификата на токен отвечаем утвердительно.

В итоге на вкладке Сертификаты в XCA должна получиться примерно такая картинка.

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

Для настройки нам необходимо выполнить экспорт сертификата УЦ, сертификата сервера и закрытого ключа сервера.

Для этого надо выбрать нужную запись на соответствующей вкладке в XCA и нажать Export.

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. Попробуем в начале зайти без токена. Получаем вот такую картинку:

  3. Заходим на about:preferences#privacy, и идём в Security Devices…
  4. Жмём Load, чтобы добавить новый PKCS#11 Device Driver и указываем путь до нашей librtpkcs11ecp.so.
  5. Для проверки того, что сертификат видится можно зайти в Certificate Manager. Отобразится запрос на ввод PIN-кода. После корректного ввода можно проверить, что на вкладке Your Certificates появился наш сертификат с токена.
  6. Теперь заходим с токеном. Firefox предлагает выбрать сертификат, который будет выбран на сервер. Выбираем наш сертификат.

  7. PROFIT!

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

Apache

Так же как и с nginx проблем с установкой apache ни у кого не должно возникнуть. Если же вы не знаете, как установить этот web-сервер, просто воспользуйтесь официальной документацией.

А мы приступаем к настройке нашего HTTPS и двухфакторной аутентификации:

  1. Для начала необходимо активировать mod_ssl:

    $ a2enmod ssl

  2. А затем включить настройки HTTPS сайта по умолчанию:

    $ a2ensite default-ssl

    Как видите настроить двухфакторную аутентификацию на любом веб-сервере, что в Windows, что в Linux дело одного часа максимум. А настройка браузеров занимает около 5 минут. Многие считают, что настройка и работа с двухфакторной аутентификацией это сложно и непонятно. Надеюсь наша статья хоть немного, но развенчивает этот миф.

  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

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть