ログ記録

ログ記録

私はいくつかの IoT デバイス用に OpenVPN サーバーを運用していますが、それらのデバイスの多くは、古い証明書の有効期限が切れているため、証明書を交換する必要があります。それらの証明書の更新は、低速のモバイル接続を使用する脆弱な手動プロセスであり、さらにそれらのデバイスには OVPN のみを使用してアクセスできます。このため、証明書が正常に交換され、それらを使用して新しい接続が確立されていることを特に確認する必要があります。問題は、交換された証明書のシリアル番号や発行時刻などを確認するのに十分な詳細を OVPN から取得する簡単な方法が見つからないことです。

では、OpenVPN で各接続の証明書の詳細をログに記録するにはどうすればよいでしょうか?

ステータスログに列を追加するのがベストですが、--ステータスバージョン 2証明書からの追加の詳細は提供されていないようです。証明書の共通名などは、古いものと新しいもので同じです。内部で利用可能なデータに基づく追加のカスタム列のサポートはありますか?

さらに、ログ レベルを 9 まで上げましたが、低レベルのパケット関連のログが大量に記録される以外に、クライアントの証明書の詳細も記録されませんでした。ただし、ログ レベルによっては、簡単に見逃される可能性があるため、証明書の詳細のみを記録するものが望ましいでしょう。

や のような概念も--client-connect--learn-address共通の名前のみを提供しているようです。また、一時的な関心事にすぎないため、このケースではカスタムすぎるソフトウェアを実装することは避けたいと思います。

ありがとう!

答え1

私の質問には、実際には 2 つの部分があります。興味のあるものをログに記録する方法と、古い証明書が使用されないようにするという目標を達成する方法です。したがって、回答も異なります。

ログ記録

証明書のシリアル番号などの追加の詳細を記録するための簡単な設定は見つかりませんでしたが、これは次の方法でカスタマイズして実装できます。--tls-検証これにはスクリプトが必要であり、そのスクリプトに対して OVPN は複数の環境変数 (たとえば、証明書のシリアル番号を含む) を設定します。

–tls-verify コマンドコマンド cmd を実行して、保留中の TLS 接続の X509 名を検証します。この接続は、他のすべての認証テストに合格しています (–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 環境変数から取得できます。

無効な証明書を拒否する

私の最終的な目標は、置き換えられた証明書が期待どおりに使用されるようにすることです。これを行う 1 つの方法は、証明書失効リストを使用することです。OVPN は、これを行う非常に簡単な方法をサポートしています。証明書に具体的なファイル形式などは必要ありませんが、構成されたディレクトリにいくつかのファイル名を追加するだけで、ファイル名に対応するシリアル番号を含むすべての証明書がブロックされます。覚えておくべき最も重要なことは、ファイル名が 10 進表記の証明書シリアル番号である必要があることです。それ以外はすべて非常に簡単です。

–crl-verify crl ['dir']PEM 形式のファイル crl に対してピア証明書を確認します。[...] オプションの dir フラグが指定されている場合は、取り消されたシリアル番号で名前が付けられたファイルを含むディレクトリである crl の別のモードを有効にします (ファイルは空でもかまいません。内容は読み取られません)。クライアントが接続を要求し、クライアント証明書のシリアル番号 (10 進文字列) がディレクトリ内に存在するファイルの名前である場合、接続は拒否されます。

server.conf単純に次の追加構成が含まれます。

crl-verify 'crl' 'dir'

これは次のディレクトリにマップされます:

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

および内のファイルはcrlcrl_staging単に 10 進数の証明書シリアルであり、必要に応じてディレクトリ間で移動できます。 でシリアルが使用可能な場合は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

関連情報