Ведение журнала

Ведение журнала

Я использую OpenVPN-сервер для некоторых устройств IoT, и многим из этих устройств необходимо заменить сертификаты, поскольку старые истекают. Обновление этих сертификатов — это хрупкий, ручной процесс, использующий медленные мобильные соединения, и, кроме того, к этим устройствам можно получить доступ только с помощью OVPN. По этой причине я хочу быть уверенным, что сертификаты были успешно заменены, и новые соединения устанавливаются с их помощью. Проблема в том, что я не могу найти достаточно простой способ получить достаточно подробностей из OVPN, например, чтобы увидеть серийные номера или время выпуска замененных сертификатов.

Итак, как регистрировать данные сертификатов для каждого соединения в OpenVPN?

Лучше всего было бы добавить какой-нибудь дополнительный столбец в журнал состояния, но даже--status-версия 2похоже, не предоставляет никаких дополнительных подробностей из сертификатов. Такие вещи, как общее имя сертификатов, одинаковы для старых и новых. Есть ли поддержка дополнительных пользовательских столбцов на основе внутренне доступных данных?

Я дополнительно увеличил уровень журнала до 9, но кроме регистрации множества низкоуровневых данных, связанных с пакетами, я не увидел никаких дополнительных сведений о сертификатах клиентов. В зависимости от уровня журнала, вещи могут быть легко упущены, поэтому в любом случае предпочтительнее было бы регистрировать только эти данные сертификата.

Концепции вроде --client-connectи, --learn-addressпохоже, также предоставляют только общие имена. Кроме того, поскольку вещи представляют лишь временный интерес, я бы хотел избежать реализации слишком индивидуального программного обеспечения для этого случая.

Спасибо!

решение1

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

Ведение журнала

Хотя я не нашел простой конфигурации для регистрации дополнительных данных, таких как серийные номера сертификатов, это можно реализовать индивидуально с помощью--tls-проверка. Это ожидает скрипт, и для этого скрипта OVPN устанавливает несколько переменных среды, например, содержащих серийный номер некоторого сертификата.

–tls-verify командаЗапустите команду cmd, чтобы проверить имя X509 ожидающего соединения TLS, которое в противном случае прошло все остальные тесты сертификации (за исключением отзыва с помощью директивы –crl-verify; тест отзыва выполняется после –tls-verifytest).

Поддерживаемые переменные среды:

tls_id_{n}
tls_serial_{n}
tls_serial_hex_{n}

Хотя это и не является ведением журнала в строгом смысле, --tls-export-certно может представлять интерес, поскольку теоретически делает весь сертификат некоторого клиента доступным на сервере для детального анализа.

–tls-export-cert каталогСохраните сертификаты, которые клиенты используют при подключении к этому каталогу. Это будет сделано до вызова –tls-verify. Сертификаты будут использовать временное имя и будут удалены при возврате скрипта tls-verify. Имя файла, используемое для сертификата, доступно через переменную среды peer_cert.

Отклонить недействительные сертификаты

Моя конечная цель — убедиться, что замененный сертификат используется так, как и ожидалось. Один из подходов к этому — использование списка отзыва сертификатов, и OVPN поддерживает очень простой способ сделать это: не требуется никакого конкретного формата файла или чего-то подобного с сертификатами, а можно просто добавить некоторые имена файлов в некоторый настроенный каталог, и все сертификаты, содержащие серийный номер, соответствующий некоторому имени файла, будут заблокированы. Самое главное, что нужно помнить, — имена файлов должны быть cert-serials в десятичной записи, все остальное довольно просто.

–crl-verify crl ['dir']Проверьте сертификат однорангового узла по файлу crl в формате PEM. [...]Если указан необязательный флаг dir, включите другой режим, где crl — это каталог, содержащий файлы, названные как отозванные серийные номера (файлы могут быть пустыми, содержимое никогда не читается). Если клиент запрашивает соединение, где серийный номер сертификата клиента (десятичная строка) — это имя файла, присутствующего в каталоге, оно будет отклонено.

server.confпросто содержит следующую дополнительную конфигурацию:

crl-verify 'crl' 'dir'

Который соответствует следующему каталогу:

crl
    7
    8
    9
crl_staging
    12
    13
    14
openvpn-status.log
server.conf

Файлы в crlи crl_stagingявляются просто десятичными серийными номерами сертификатов и могут перемещаться между каталогами по мере необходимости. Если серийный номер доступен в crl, соединение блокируется, в противном случае оно успешно устанавливается. Пример сообщения об ошибке в журналах выглядит следующим образом:

ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS: new session incoming connection from [AF_INET]34.252.35.124:35231 (via [AF_INET][...]%eth1)
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 VERIFY OK: depth=1, C=DE, ST=[...], O=[...], OU=[...], CN=[...], emailAddress=[...]
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 VERIFY CRL: certificate serial number 10 is revoked
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 OpenSSL: error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS_ERROR: BIO read tls_read_plaintext error
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS Error: TLS object -> incoming plaintext read error
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS Error: TLS handshake failed

Связанный контент