web-dev-qa-db-ja.com

デバイス上のすべてのネットワークサービスが強力なTLS暗号スイートを使用するようにする

(これは架空のものですが、私が経験した実際の問題に基づいています)

コンテキスト:

いくつかの公開されたネットワークサービスを含む(埋め込み)デバイスを開発しています。私はこれらのサービスを開発するのではなく、セキュリティを担当しているので、それらがどのように構築されているのかわかりません。

私はいくつかのテスト(特定の暗号スイートを備えたデバイスサービスにターゲットのClient Helloメッセージを送信する)を行い、これらのサービスの一部が弱いTLS暗号スイートを受け入れることを発見しました。

問題:

私は現在、この問題に対処することを任されています。できれば、スタック内で可能な限り問題を修正してください(たとえば、個々のアプリケーションのコード/構成を確認する必要がなく、代わりにシステムレベル)。

仮定:

  1. OpenSSLがシステムで使用されている唯一の暗号ライブラリ/プログラムであることを知っています。

今いくつかの質問:

  1. ネットワークサービスが弱いTLS暗号を許可しないようにするには、どのようなオプションがありますか? (例:OpenSSL自体の変更、OpenSSL構成ファイルの変更、OS構成の変更など)

  2. どのオプションが合理的に「安全」ですか?例えばOpenSSLコードを変更して、これらの暗号スイートのすべての言及を削除し、再コンパイルして統合できると思います。これにより、アプリケーションがスイートを送信することを防止します(要求された場合でも)。ただし、これは危険な解決策のようであり、長期間維持することは困難です。

  3. これは可能ですか、それとも各サービスを確認する必要がありますか?

2
Josiah

ネットワークサービスが弱いTLS暗号を許可しないようにするには、どのようなオプションがありますか?

デバイス上のOpenSSLのバージョンが実際に必要なより強力な暗号をサポートしている場合、アプリケーションまたはアプリケーション構成の変更は1つのオプションです。

OpenSSLを変更して使用可能な暗号を制限することも別の方法ですが、デバイス上のすべてのアプリケーションがこの変更されたOpenSSLに実際にリンクしていることを確認してください。そしてそれは些細なことではありません。たとえば、暗号に必要ない場合でも実際にそこで使用されるため、TLS 1.0またはTLS 1.1を許可する限り、たとえばMD5を単純に禁止することはできません。したがって、特定の暗号のサポートを削除しようとするかもしれませんが、これは実際にはデバイス上の変更されていないアプリケーションを破壊する可能性があります。

また、必要な構成をサポートするためにOpenSSLの新しいバージョンを使用する必要がある場合もあります。その場合、アプリケーションが新しいバージョンに対してリンクされていることを確認するだけでなく、APIが変更されている可能性があるため、アプリケーションを再コンパイルする必要があります。 。また、一部のAPIの変更により、実際には動作の変更が導入されています。つまり、アプリケーションがEdgeの場合でも期待どおりに機能するかどうかを適切にテストする必要があります。

一部のグローバルOpenSSL構成を変更しても、アプリケーションでサポートされる暗号が指定されていないため、効果がありません。

場合によっては、安全な構成のみを許可し、古いアプリケーションからの弱い構成を「隠す」安全なリバースプロキシをデバイスに設定するというオプションもあります。ただし、これが機能するかどうかは、特定のユースケースによって異なります。

4
Steffen Ullrich

OpenSSLの設定でグローバルに変更することはできませんが、特定の暗号なしで再コンパイルするのは簡単です。 no-[cipher-to-disable]パラメータから./configure

例えば

./config no-ssl2 no-ssl3 no-tls1 no-tls1_1 no-dtls no-dtls1_1 no-ssl2-method no-ssl3-method no-tls1-method no-tls1_1-method no-dtls-method no-dtls1_1-method no-weak-ssl-ciphers
make

弱いプロトコルなしでOpenSSLを構築します

2
Jenessa

トンネリング/プロキシ

いくつかの欠点がありますが、サービスを変更せずに常に使用できます(サービスはaccepts弱いTLS暗号スイートだけでなく、requires弱いTLSでもかまいません)スイート(SSLv3より新しいものをサポートしないように構成されている可能性があります))はSSLトンネリング/プロキシです。

つまりサービス(およびホストとファイアウォール)を構成して、外部から直接アクセスできないようにします。次に、いくつかの「既知の良好な」ソフトウェアを使用して、すべての適切な設定で「適切な」TLS接続のみを受け入れ、それらを(ローカルで)適切なサービスに転送します。 Stunnelはそのための1つのオプションです。私が理解している限り、nginxはtlsリバースプロキシとしても使用できます。

0
Peteris