web-dev-qa-db-ja.com

秘密鍵を保持するためのNginxとHSMの統合

Nginxを使用して、サーバー上のファイルに秘密鍵を保存しています。秘密鍵をHSMに移動して、SSL鍵がHSMに保管され、HSMを離れないようにします。 SSL終了時に必要なすべての暗号化操作は、HSMで実行できます。

Heartbleedの後、HSMの使用を提案する多くの記事を見てきましたが、これをNginxに有効化/追加する方法を見つけることができませんでした。検索中に、エンジンKeyformがエンジンから秘密鍵を読み取れるようにするパッチが見つかりました http://forum.nginx.org/read.php?29,251983,251983#msg-25198 。ただし、PKCS#11でサポートされているエンジンからキーを読み取る代わりに、HSMを使用してすべての暗号化操作を実行し、SSLキーがHSMを離れないようにします。

これを達成するのに役立つ既存のNginx/OpenSSLプラグイン/モジュール/実装はありますか? HSMを使用したSSL終了について話している記事をたくさん見ましたが、実装の詳細は見つかりませんでした。したがって、Nginx/OpenSSLコードを掘り下げる前に、この問題について何か提案や推奨があるかどうかを知りたいと思います。

18
GG01

私はこれをしたことがありません。しかし、ここにいくつかの示唆的なポインタがあります。これらのポイントは、それを機能させるための具体的な手順ではありません。 newAWS CloudHSM(クラシックではない)オファリングの documentation から:

  1. CLIユーティリティを使用して、CloudHSMと プライベートキーの生成 をセットアップします。
  2. CloudHSM OpenSSLライブラリをインストールして構成します。
  3. エンジンが動作するかどうかを確認するopenssl engine -t cloudhsm
  4. Nginxを構成します。 Nginx 1.7.9以降では、秘密キーに エンジンを指定 を使用できます

値engine:name:idは、ファイル(1.7.9)の代わりに指定できます。これは、OpenSSLエンジン名から指定されたIDの秘密鍵をロードします。

だからあなたのnginx設定は次のようになります

ssl_certificate_key cloudhsm:<name>:<keyid>;

名前が何であるか、またはkeyIDがよくわかりません。少し読み上げて、何か見つけたらこの回答を編集します。

注: ドキュメントごと 、SSLアクセラレーション(HSMで暗号化を行う)を有効にする場合は、ssl_enginecloudhsmに設定する必要がある場合があります。

ssl_engine cloudhsm;
  1. テスト。

AWS ACMを使用してロードバランサーでSSLをオフロードしたくない理由を教えてもらえますか?これが最も簡単な方法であり、AWSが安全であると信頼すれば安全です。


編集:私は少し読んで、CloudHSMの用語でのKey Handle-6桁の数値識別子-がここでkeyidであることを確信しています。 user namenameの部分だと思います。したがって、あなたのNginx設定は次のようになります

# something that looks like:
ssl_certificate_key cloudhsm:AWSUser:568900;

edit2:Nginxコンパイルは必要ありません。 opensslエンジンがロード可能であることを確認する必要があります。設定すると、確認すると次のようになります。

[root@ip-172-31-14-127 ~]# export n3fips_password=user_cu:Wzs8sukUp7FkVs4xQU
[root@ip-172-31-14-127 ~]# openssl engine -t cloudhsm
(cloudhsm) CloudHSM hardware engine support
     SDK Version: 2.03
[ available ]

edit3:朗報です! このフォーラムの投稿 によると、AmazonはCloudHSMとのNginx統合のためのより良いドキュメントに取り組んでいます。

edit4:AWSは、ApacheとNginxの手順を含むようにドキュメントを更新しました。少し正解したようです! ;)したがって、明らかに、「偽の秘密鍵」をダウンロードして、それをNginx構成で使用します。残りの指示はうまくいきます。

選択した方法に関係なく、HSMから秘密鍵ハンドルをエクスポートして、ファイルに保存します。ファイルには実際の秘密鍵が含まれていません。これには、HSMに保管されている秘密鍵のハンドルへの参照が含まれています。ファイルの内容は、偽のPEM形式の秘密鍵と呼ばれます。 Webサーバーソフトウェアは、OpenSSL用のAWS CloudHSMソフトウェアライブラリと共に偽のPEM形式の秘密鍵ファイルを使用して、SSLまたはTLS処理をクラスター内のHSMにオフロードします

ここにドキュメント: https://docs.aws.Amazon.com/cloudhsm/latest/userguide/ssl-offload.html

これはまだテストしていません。更新したら投稿します。

4
eternaltyro

私のようにGoogling "cloudhsm nginx"を介してこの投稿を見つけた人のために、@ eternaltyroからの回答はほぼ正しいです。ただし、cloudhsm:<name>:<keyid>;形式でキーIDを参照する代わりに、CloudHSMの key_mgmt_utilgetCaviumPrivKey関数を使用して、キーを「偽の」PEMファイルとしてエクスポートし、そのファイルのnginx ssl_certificate_keyまた、ssl_enginecloudhsmに設定する必要があります。

0
Wintermute

Safenet(現在はGemalto)Luna HSM SA 7000を使用しています。たとえば、キー管理サービスの抽象化レイヤーを追加できます。たとえば、-GemaltoのKey Secure Appliance(仮想アプライアンスを実行します)。

KMSはHSMと統合します。キー管理サービスをHSMに登録する必要があります。その後、KMSからの各トランザクションは、HSMに登録されているパーティションの1つにあるマスターキーでラップされます。

私はHSMとKeySecureで作業しましたが、SSL終了は行いませんでした。 KMSを使用して(HSMなしで)SSLを試すことができる場合は、最初に残りの統合を支援できます。

0
Karthik tv