web-dev-qa-db-ja.com

シークレットをクラウドに保存するためのベストプラクティスは何ですか?

Securing Java Cloud Computingのアプリケーションデータ に関するこの投稿は、Java KeyStoreを使用して、ただし、コメントの1つで述べられているように、クラウド上のキーストアのパスワードをどのように保護しますか?

AWSパブリッククラウドでSAASウェブアプリケーションを設計しています。これには、多くのエンドユーザーがいます(数百万にスケーリング)。すべてのユーザーデータは、ユーザーごとに標準の暗号化で暗号化されます。パスワードで保護された暗号化キーは、リモートの安全なキーサーバーに保存されます。アクセスするには、API秘密キーが必要です。これは上記の質問で述べたのと本質的に同じ問題があり、キーサーバーAPIの秘密鍵はキーストアのパスワードに直接相当します。クラウド上のキーサーバーAPIの秘密鍵をどのように保護しますか?

Webアプリケーションは、ユーザーデータを暗号化および復号化するためのユーザーごとのキーを取得できるように、この秘密キーにアクセスする必要があることに注意してください。私たちはAES-256対称暗号化を使用していますが、秘密鍵を保護する必要があるため、PKIソリューションでも根本的な問題が残っています。また、リモートのキーサーバーの代わりにキーストアを使用することもできますが、これは前の質問に戻り、基本的な問題が残っています。

さらにいくつかの制約:

  • シークレットをリモートの安全なキーサーバーに格納することは不可能です。これは、そのキーサーバーへのアクセスに使用されるためです。
  • クラウドファイルシステムにシークレットを保存するのは安全ではありません。主なポイントは、クラウドファイルシステムに違反したユーザーがシークレットにアクセスできないようにすることです。 (クラウドファイルシステムが完全に安全であれば、そこでデータを暗号化する必要はありません。)また、クラウドリソースがダウンして再起動が必要になることが予想される場合、シークレットを保持するためにクラウドに依存することは信頼できません。
  • コードにシークレットを保存することは、バージョン管理、プレーンテキストストレージ、リバースエンジニアリング、キーローテーションなどの多くの理由で受け入れられません。また、参照してください クローズドソースのWebサイトがソースにシークレットキーを保持する必要がありますか?
  • シークレットをHSMに格納することは現実的ではありません。仮想クラウドサーバーにシークレットをアタッチすることができないためです。 「シークレット」、キーストア、HSM、その他のストレージ も参照してください。
  • アプリケーションがリモートでロードするためにシークレットをクラウドの外に保存することも問題があります。内部サーバーを維持する必要がないように、純粋にクラウドベースのアプローチを探しています。ネットワークの信頼性は保証されません。内部サーバーでのクラウドサーバーのシークレット要求の認証には、独自の問題があります。等.
  • サーバーをできるだけ自動的に起動および再起動して、ダウンタイムや人的エラーを減らすため、手動による操作は最小限に抑える必要があります。私の推測では、手動の操作が必要になる場合があります。

では、シークレットをクラウドに保存するためのベストプラクティスは何ですか? Webアプリはこのような秘密をどのようにロードする必要がありますか?私は特にJava=ソリューションに興味がありますが、これはどの言語でも一般的な問題です。

8
Richard

「クラウド内」とは、「契約関係にある大企業のインフラストラクチャ上で実行される仮想マシン上」を意味します。定義により、「クラウド」に物を保存するとき、あなたはtrustingクラウドプロバイダーです。そのプロバイダーは、コードとデータの内臓の細部、およびこれらのマシンに格納されているすべてを細かく調べる技術的な力をすべて持っています。

それは、全身麻酔下ですでに手術台にいて外科医がメスを手にしているときに、身体の完全性を維持しようとするようなものです。外科医を疑うのは少し遅れます...

秘密が重要な場合は、クラウドに保存しないでください。別の言い方をすると、専用のハードウェアサーバーの追加コストを支払う余裕がない場合、秘密データcannotはそれだけの価値があります-またはおそらく自分の利益のためにあまりにも貪欲です。

5
Thomas Pornin