![](https://habrastorage.org/webt/if/ba/dd/ifbaddvhncdnbsktyvxxh6zkkkg.png)
В одной из наших предыдущих статей мы рассказывали про важность двухфакторной аутентификации на корпоративных порталах компаний. В прошлый раз мы продемонстрировали, как настроить безопасную аутентификацию в web-сервере IIS.
В комментариях нас просили написать инструкцию для самых распространенных web-серверов под Linux — nginx и Apache.
Вы просили — мы написали.
Что надо, чтобы начать?
- Любой современный дистрибутив Linux. Я выполнял тестовую настройку в MX Linux 18.2_x64. Это конечно не серверный дистрибутив, но для Debian вряд ли будут какие-то отличия. Для других дистрибутивов могут слегка различаться пути до библиотек\конфигов.
- Токен. Мы продолжаем использовать модель Рутокен ЭЦП PKI, которая идеально подходит по скоростным характеристикам для корпоративного применения.
- Для работы с токеном в Linux необходимо установить следующие пакеты:
libccid libpcsclite1 pcscd pcsc-tools opensc
![](https://habrastorage.org/webt/jy/7l/no/jy7lno_ntxphhd3mmqrrcgptxni.jpeg)
Выписывание сертификатов
В предыдущих статьях мы опирались на то, что сертификаты сервера и клиентов будут выписываться с помощью Microsoft CA. Но раз уж мы настраиваем все в Linux, то заодно расскажем про альтернативный способ выписывания этих сертификатов — не покидая Linux.
В качестве CA будем использовать XCA (https://hohnstaedt.de/xca/), который доступен в любом современном дистрибутиве Linux. Все действия, которые мы будем совершать в XCA можно сделать и в режиме командной строки с помощью утилит OpenSSL и pkcs11-tool, но для большей простоты и наглядности в этой статье мы их приводить не будем.
Начало работы
- Устанавливаем:
$ apt-get install xca
- И запускаем:
$ xca
- Создаём нашу базу данных для CA — /root/CA.xdb
Мы рекомендуем хранить базу данных Certificate Authority в папке, куда есть доступ только у администратора. Это важно для защиты закрытых ключей корневых сертификатов, которые используются для подписывания всех остальных сертификатов.
Создаём ключи и сертификат root CA
В основе инфраструктуры открытых ключей (PKI) лежит иерархическая система. Главным в этой системе является корневой центр сертификации или root CA. Его сертификат и надо создать в первую очередь.
- Создаём для CA закрытый ключ RSA-2048. Для этого на вкладке Private Keys нажимаем New Key и выбираем соответствующий тип.
- Задаём имя для новой ключевой пары. Я её назвал — CA Key.
- Выписываем сам сертификат CA, с использованием созданной ключевой пары. Для этого переходим на вкладку Certificates и нажимаем New Certificate.
- Обязательно выбираем SHA-256, потому что использование SHA-1 уже не может считаться безопасным.
- В качестве шаблона обязательно выбираем [default] CA. Не забудьте нажать на Apply all, иначе шаблон не применяется.
- На вкладке Subject выбираем нашу ключевую пару. Там же вы можете заполнить все основные поля сертификата.
![](https://habrastorage.org/webt/ob/xf/7t/obxf7tawfryfu_rvb_7kmlet_si.png)
Создаём ключи и сертификат https-сервера
- Аналогичным образом создаём для сервера закрытый ключ RSA-2048, я его назвал — Server Key.
- При создании сертификата выбираем, что сертификат сервера необходимо подписать на сертификате CA.
- Не забываем выбрать SHA-256.
- В качестве шаблона выбираем [default] HTTPS_server. Жмём на Apply all.
- После чего на вкладке Subject выбираем наш ключ и заполняем нужные поля.
![](https://habrastorage.org/webt/9u/jc/wf/9ujcwfioxqhgm6piabwczsdipwu.png)
Создаём ключи и сертификат для пользователя
- Закрытый ключ пользователя будет храниться на нашем токене. Для работы с ним необходимо установить 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.
- Добавляем новый PKCS#11 Provider в XCA. Для этого идём в меню Options на вкладку PKCS#11 Provider.
- Жмём Add и выбираем путь до библиотеки PKCS#11. В моём случае это \usr\lib\librtpkcs11ecp.so.
- Нам понадобится отформатированный токен Рутокен ЭЦП PKI. Скачиваем утилиту rtAdmin — https://dev.rutoken.ru/pages/viewpage.action?pageId=7995615
- Выполняем
$ rtAdmin -f -q -z /usr/lib/librtpkcs11ecp.so -u <PIN-код пользователя>
- В качестве типа ключа выбираем — ключ RSA-2048 на Рутокен ЭЦП PKI. Я назвал этот ключ Client Key.
- Вводим PIN-код. И ждём завершения аппаратной генерации ключевой пары
- Сертификат для пользователя создаём по аналогии с сертификатом сервера. На этот раз выбираем шаблон [default] HTTPS_client и не забываем нажать Apply all.
- На вкладке Subject вводим информацию о пользователе. На запрос о сохранении сертификата на токен отвечаем утвердительно.
В итоге на вкладке Сертификаты в XCA должна получиться примерно такая картинка.
![](https://habrastorage.org/webt/td/jb/9w/tdjb9wzqlfbfjnp9or_fsnj00k8.png)
Этого минимального набора ключей и сертификатов достаточно для того, чтобы приступать к настройке непосредственно серверов.
Для настройки нам необходимо выполнить экспорт сертификата УЦ, сертификата сервера и закрытого ключа сервера.
Для этого надо выбрать нужную запись на соответствующей вкладке в 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, то смотрите инструкцию по настройке браузеров в предыдущей статье.
- Запускаем Firefox.
- Попробуем в начале зайти без токена. Получаем вот такую картинку:
- Заходим на about:preferences#privacy, и идём в Security Devices…
- Жмём Load, чтобы добавить новый PKCS#11 Device Driver и указываем путь до нашей librtpkcs11ecp.so.
- Для проверки того, что сертификат видится можно зайти в Certificate Manager. Отобразится запрос на ввод PIN-кода. После корректного ввода можно проверить, что на вкладке Your Certificates появился наш сертификат с токена.
- Теперь заходим с токеном. Firefox предлагает выбрать сертификат, который будет выбран на сервер. Выбираем наш сертификат.
- PROFIT!
Настройка выполняется один раз, и как видно в окне запроса на сертификат мы можем сохранить наш выбор. После этого при каждом входе на портал нам надо будет только вставить токен и ввести PIN-код пользователя, который был задан при форматировании. После такой аутентификации сервер уже знает какой пользователь на него зашёл и можно больше не делать никаких дополнительных окон для проверки, а сразу пускать пользователя в его личный кабинет.
Apache
Так же как и с nginx проблем с установкой apache ни у кого не должно возникнуть. Если же вы не знаете, как установить этот web-сервер, просто воспользуйтесь официальной документацией.
А мы приступаем к настройке нашего HTTPS и двухфакторной аутентификации:
- Для начала необходимо активировать mod_ssl:
$ a2enmod ssl
- А затем включить настройки HTTPS сайта по умолчанию:
$ a2ensite default-ssl
- Теперь редактируем файл конфигурации: /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
Как видите настроить двухфакторную аутентификацию на любом веб-сервере, что в Windows, что в Linux дело одного часа максимум. А настройка браузеров занимает около 5 минут. Многие считают, что настройка и работа с двухфакторной аутентификацией это сложно и непонятно. Надеюсь наша статья хоть немного, но развенчивает этот миф.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Нужна ли инструкция по настройке работы TLS с сертификатами на ГОСТ 34.10-2012:
84.75% Да, TLS-ГОСТ очень нужен50
15.25% Нет, настройка с ГОСТ-алгоритмами не интересна9
Проголосовали 59 пользователей. Воздержались 16 пользователей.