web-dev-qa-db-ja.com

Apache2からopensslプリマスターシークレットを抽出する

デバッグと分析のためにサーバーのhttpsトラフィックを復号化したいのですが。私のサーバーは、mod_wsgiとDjangoを実行するdebian 9 Apache2サーバーです。

私はこの投稿を見ました: OpenSSLアプリケーションからプリマスターキーを抽出する

そして、私は https://httpd.Apache.org/docs/2.4/mod/mod_ssl.html#sslopensslconfcmd を使用できる可能性があると考えました

apacheにこれらのdhキーを出力させるにはどうすればよいのかわかりません。

多くのセキュリティアプリケーションやベンダー(IPS/IDSシステムなど)によって行われているため、可能であることはわかっています。

何か案は?

1
Yotam Alon

Apache om Debian 9(Stretch)はOpenSSL 1.0.2( Apache2-binlibssl1. への依存関係を参照)を使用するため、そのリンクされた投稿に記載されているアプローチを使用できます。スタートアップスクリプトを変更して、LD_PRELOAD=/path/to/libsslkeylog.soおよびSSLKEYLOGFILE=/tmp/your.keysをエクスポートできます。

その方法は、アプリケーションによって異なります。 systemdの場合、systemctl edit Apache2を試してオーバーライドを作成できます。 それでもApacheのような古典的なsysvinit initスクリプトである場合は、上記の2つの環境変数を使用して/etc/init.d/Apache2を変更してみてください。 exportキーワードを忘れないでください。 Apacheはsysvinitスクリプトを使用していないようなので、systemdユニットファイルを変更する必要があります。

これにより、SSLKEYLOGFILE環境変数で指定されたファイルにマスターシークレットが書き込まれます。これは正確にはプリマスターシークレットではありませんが、Wiresharkでの復号化を有効にするために使用できます。後者の詳細については、次も参照してください https://wiki.wireshark.org/TLS

ユースケースによっては、サーバーの変更をスキップして、クライアント側のキーをタップする方が簡単な場合があります。 FirefoxとChromiumには、SSLKEYLOGFILE環境変数のサポートが組み込まれています。 curlの新しいバージョンもサポートしていますが、curlの古いバージョンやOpenSSLを使用するその他のアプリケーションでは、上記のsslkeylog.shアプローチのようなものが必要です。

ウォークスルー

sslkeylog.soライブラリはOpenSSLバージョンに固有です。バージョン1.0.2( libssl1.0.2 Debian Stretchの場合)はOpenSSL 1.1.0( libssl1.1 Debian Stretchの場合)と互換性がありません。ライブラリをビルドするには、対応する開発ヘッダーファイルが必要です。これらは、それぞれのバージョンの libssl1.0-dev または libssl-dev パッケージから入手できます。

ソースを取得してライブラリを構築するのは簡単です。

Sudo apt install git make gcc libssl1.0-dev
git clone --depth=1 https://git.lekensteyn.nl/peter/wireshark-notes
cd wireshark-notes/src
make
# Optional: install to a specific location. Adjust paths below if you skip this.
Sudo install libsslkeylog.so /usr/local/lib/

これにより、現在のディレクトリにlibsslkeylog.soファイルが作成されます。機能するかどうかをテストするには:

$ ./sslkeylog.sh curl https://example.com -sI
CLIENT_RANDOM ... ...    <-- expected for TLS 1.2
HTTP/2 200 
...
$ ldd /usr/bin/curl | grep ssl
libssl.so.1.0.2 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 (0x00007fc5a088d000)

最後のコマンドは、プログラムがリンクされたlibsslのバージョンを示しています。 Apacheでも同様のことができます。プライマリプログラム(Apache2)は、別のライブラリを介してTLSサポートをロードするため、次のことを確認する必要があります。

$ ldd /usr/lib/Apache2/modules/mod_ssl.so | grep ssl
libssl.so.1.0.2 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 (0x00007f8dbb6ed000)

何らかの理由でlibssl.so.1.1が表示される場合は、代わりにSudo apt install libssl-devを使用し、make -Bで再構築する必要があります。

次のステップは、Apache2サービスのsystemdユニットファイルを変更することです。 systemctl edit Apache2を実行すると、/etc/systemd/system/Apache2.service.d/override.confのエディターが開き、追加する必要があります。

[Service]
Environment=LD_PRELOAD=/usr/local/lib/libsslkeylog.so
Environment=SSLKEYLOGFILE=/tmp/your.keys

Sudo systemctl restart Apache2)を再起動した後、/tmp/systemd-private-*-Apache2.service-*/tmp/your.keysのどこかにキーが作成されます。短いパスが必要な場合は、/home/user/your.keysのように入力できますが、www-dataユーザーがファイルに書き込み可能であることを確認してください。

テストが完了したら、必ず削除してください。この種のテストを実行する代わりに、クライアントを一時的に変更することをお勧めします。上記のように、sslkeylog.shはクライアントでも機能します。

4
Lekensteyn