web-dev-qa-db-ja.com

秘密鍵をアプリケーションバイナリに格納しますか?

デーモン形式のプロセス(つまり、ユーザーの操作がない)に共有秘密キーへのアクセスを許可して、暗号化された共有データファイルにアクセスできるようにしたいと考えています。同じ暗号化されたデータにアクセスするユーザーアプリケーションは、共有秘密キーをユーザーのOSキーチェーン(OS XキーチェーンやGnomeキーリングなど)に保存します。 OSキーチェーンは、ユーザーのログイン(または他のユーザー固有の)パスワードで秘密キーを保護します。

ここでの暗号化は、サーバーとクライアント間のパブリックネットワークを通過するデータを保護するために使用されます。問題のデータは科学実験の生データです。ほとんどの場合は価値がありません(つまり、攻撃者が暗号を解読してデータを閲覧することを推測する可能性は低い)が、非常に貴重である可能性があり、ユーザーは、公開する(つまり、保護する)まで、詳細を非公開にすることを望んでいます。ネットワーク上のカジュアルなオブザーバーから)。科学的分析なしではデータの値を判断するのは難しいため、暗号化されていない状態でワイヤを通過するユーザーのアクティビティ(クエリを含む)を監視すると、データの値に関する手掛かりが得られます。

デーモンプロセスは、システムのクエリサーバーです。共有データから読み取り、クエリを処理して、結果セットの識別子をクライアントに返し、クライアントは識別されたデータを共有ストアからプルします。

暗号化されたデータをユーザーのローカルワークステーション/ラップトップに同期できるので、ディスク上のデータの暗号化は、決定的な攻撃者にとってせいぜい迷惑です。私たちまたはは、ユーザーがクエリサーバーをローカルで実行できるようにします(まだinit.d/launchdで開始されます)。したがって、デーモンに格納されている秘密キーを保護するためにできることは何でもしたいと思います。主なリスクは、悪意のあるユーザーがシステムのデーモンから秘密鍵を発見できることです。そのキーを公開するには、キーを変更し、すべてのユーザーを更新して、データベースを再暗号化する必要があります。

デーモンプロセスの共有秘密キーを保存する最良の方法は何ですか?キーをディスクに配置してファイルをディスク上で暗号化できますが、デーモンプロセスはそのファイルを復号化するためのキーを持っている必要があります。これは、元の暗号化されたデータの共有秘密鍵を持っていることと同じです。私の素朴なアプローチは、アプリケーションのバイナリにキーを格納することですが、それが最良のオプションであるとは想像できません。何かアドバイス?

12
Barry Wark

これはすぐに「カメがずっと下に落ちる」問題に変わります。暗号化を停止し、別の方法に依存する時点を決定する必要があります。目標は、保護されたデータに簡単にアクセスできるように、ハッカーを決定するのではなく、カジュアルなユーザーを停止することです。

私は、DBパスワードとSSL証明書パスワードを保存する必要があるWebアプリケーションで同様の方法を使用して取り組みました。私がやったことは、アプリの設定ファイルで異なるマスターパスワードを使用してこれらのパスワードを暗号化することでした。マスターパスワードは、アプリケーション起動スクリプトによって設定された環境変数として保存されました。マスターパスワードは起動スクリプトでのみ設定されたため、標準のUNIXファイルのアクセス許可を使用してスクリプトを実行する機能とともに、1人のユーザーにスクリプトへのアクセス権を与えるのは簡単です。

私の考えでは、このスクリプトにアクセスするには、それ以外の場合は、既にrootである必要があります。その時点では、それは問題ではありません。ルートを信頼できない(またはサーバーがハッキングされている)場合は、おそらく他の問題があります。

また、これがどのように機能するかのすべての詳細が意図的に十分に文書化されていないという点で、あいまいさを介して少しセキュリティがあります。起動スクリプトがどのように機能するかをバックトレースし、どのアルゴリズムが使用されているか、salt + plantextがどのようにフォーマットされているかなどを把握する必要があります。 DBサーバーに直接分割されます。

12
AngerClown

いつものように、開始するのに最適な場所は、いくつかの質問をすることです:脅威モデルは何ですか?何を守ろうとしているの?誰から守ろうとしているのですか?そもそもなぜ暗号を使用しているのですか?これらのどれも質問から明らかではありません。 (暗号は魔法のピクシーダストではありません。)そして、これらの質問に対する答えがなければ、解決策を提供することはできません。正しい解決策は、達成しようとしていることに依存します。

一般的に言えば、この問題に対する優れた解決策はありません。ユーザーの関与なしにシステムを起動できるようにしたい場合は、秘密鍵がディスクのどこかにクリアテキストで(または同等のクリアテキストで)ライブに保管されます。他の人が示唆しているように、あなたはすぐに「カメをずっと下に」叩きます。

実行できる手順の1つは、秘密鍵がファイルシステムのアクセス制御によって保護されていることを確認することです。

脚注:洗練されたアプローチがありますが、低コスト環境にはおそらく適していません。 (1)もう1つの安全な方法は、サーバーに接続されたハードウェアセキュリティモジュールに秘密鍵を保存することです。サーバーが侵害された場合、ソフトウェアは秘密鍵を盗むことができません(ただし、ハードウェアセキュリティモジュールに任意のメッセージに署名/復号化するように指示することはできます)。 (2)より洗練されたアプローチは、TPMを使用して、秘密鍵を特定のソフトウェアにロックすることです。残念ながら、現在のOSはこれを適切にサポートしていません。そのため、システム管理者として自分で作業することは非常に困難です。開発者による多大なサポートが必要です。

7
D.W.

バリー、私はあなたの解決策が好きで、それをさらに一歩進める考えを持っています。新しいマシンを作成するために使用するマシンイメージをキーファイルで自動的に400を使用するように設定し、ブート時にサーバーソフトウェアをルートとして起動し、キーをメモリに読み込み、キーを削除し、サーバーソフトウェアを実行するユーザーを切り替えます。非rootアカウントに。

1
devadvocate

完全を期すために、私たちが選択したソリューションは、@ SteveSyfuhsと@AngerClownの回答の組み合わせでした。 OS Xでは、システムキーチェーン(/Library/Keychains/System.keychain)。 Linuxでは、rootが所有するアクセス権ビット400(つまり、所有者のみが読み取り専用)を持つファイルに暗号化キーを保存しています。

1
Barry Wark

デーモンのアカウントで使用できるキーチェーンはありませんか?

1
Steve