私の職場には、アプリケーション構成ファイルでプレーンテキストのパスワードを使用できないという標準があります。これは、誰かがそのアプリケーションのすべての特権に自動的にアクセスするわけではない設定ファイルにアクセスする場合に備えて、十分に理にかなっています。場合によっては、ログインに関連付けられたアクセス権を持つか、SQL Server認証のWindowsセキュリティなどでパスワードを使用しないようにするか、J2EE環境のJDBC構成などのサードパーティの場所で構成することが可能であり、明らかに好ましい、しかしこれは常に可能であるとは限りません。
したがって、次のコメントには長すぎます...
おそらく、1つ前のステップに戻り、予防的コントロールと検出的コントロールの利点を比較すると役立つ場合があります。予防的制御には暗号化が含まれますが、パスワードを暗号化してわかりにくくすることもできます。このアプローチは、偶発的な共有からパスワードを保護することを目的としています(b32エンコーディングは意味の少ない文字を生成します(b32はb64よりも長い文字列を生成します)。このようなアプローチは、ランダムな数字のシーケンスを記憶する難しさと、文字列をデコードするために使用するBase32/64エンコーディングは、追加のロジックを構築/維持する必要のないパスワードを保護する簡単な方法です。
予防的管理への他のアプローチはおそらく暗号化を使用するでしょう。キーを保護するには、さまざまな方法があります。詳細に触れたり、D.W。すでに投稿されている場合は、検出制御を重ねてセキュリティ体制を改善できます。たとえば、キーを含むファイルへのアクセスを監査できます。イベント(サーバー/サービスの再起動など)をキーファイルへのアクセスと関連付けることができます。キーファイルへのその他のアクセス要求(成功または失敗)は、異常なアクティビティを示している可能性があります。
あなたの質問に答えるために、これが私の見解です:
パスワードを設定ファイルに保存する必要がある場合は、少なくとも可能な限りパスワードをエンコードすることをお勧めします。パスワードをエンコードすると、ベンダーのサポート担当者が監視している場合など、誰かがファイルをスクロールした場合にパスワードが漏洩する可能性が低くなります。パスワードを暗号化する方がはるかに安全ですが、さらに複雑にする必要があります。
キーをハードコーディングするか、別のファイルに格納する必要があるという事実に対処する方法。暗号化キーを別のファイルに分離すると、誰かがキーを表示するのが難しくなります。たとえば、アクセス制御を使用して、キーファイルへのアクセスを制限しながら、構成ファイルのよりオープンなACLを維持できます。同様に、キーファイルへのアクセスの監査を実装して、キーの使用を必要とするイベントに関連付けることができます。バイナリへのアクセスを制限する場合は、キーをハードコーディングしても問題ありません。バイナリに対して「文字列」を実行することにより、パスワードの慎重なエンコーディングを簡単に検出できます。ハードコーディングされたパスワードをエンコード/暗号化できます(つまり、パスワードをデコードするときに別の機能(おそらく監査が必要)が必要ですが、開発者と管理者の複雑さが増加します(つまり、バイナリを再構築/再コンパイルせずにキーを変更する方法) ?)。
パスワードの暗号化キーは人間が読めるようにする必要がありますか?場合によります。キーを保護する方法は限られています。暗号化キーは通常、メモリにコミットするのが難しい英数字の文字列と見なされます。いつでもキーをエンコード/暗号化できますが、そのような方法ではスクリーンショットを撮るのに十分賢い人を阻止できません。ただし、キー拡張機能への入力として、単純な「キー」(よりパスワードのような)を使用できます。それらの例では、おそらく、エンコーディングなどの追加の手段により、複雑さのコストに比べていくつかの付加価値が追加されます。
どちらかといえば、複数のコントロール層を実装するのが良いアプローチです。予防的管理はより困難ですが、検出的管理は一般的に実装が容易です。キーファイルを分離すると、全体的なアーキテクチャとコントロールの実装を簡素化できます。予防的コントロールと検出的コントロールのどちらが使用されているかに関係なく、監査ログを確認するには、一部の監査機能を有効にする必要があります。このようにして、ありそうもないことが起こった場合(キーへのアクセス)、修正措置を講じることができます。
リモートサービスにアクセスするためにパスワードが必要なサーバーを実行している場合、適切な解決策はありません。適切な場所に保存されている構成ファイルにパスワードを保存することは、不適切な選択肢のセットを最大限に活用することになるでしょう。
選択肢は次のとおりです。起動時にユーザーにパスワードを入力してもらいます(サーバーが再起動すると、ユーザーが物理的にサーバーに近づいてパスワードを入力できるようになるまでサーバーに到達できないため、これは悪いことです)。パスワードをサーバーコードのソースコードにハードコードします(これは、構成ファイルにパスワードを入力するよりもはるかに悪いです)。またはパスワードを構成ファイルに保存します(すべてのオプションの中で最も悪いもの)。構成ファイルで注意すべき主なことは、構成ファイルがWebルートの外部に格納されていることと、ファイルのアクセス許可が適切にロックされていることを確認することです。
構成ファイルに格納されているパスワードを暗号化しても役に立たないのは、復号化キーをどこに格納するのでしょうか。あなたはちょうど問題を変えました。 「カメはずっと下にいる」というのは許容できる回答ではありません。
Windowsでは、パスワードをDPAPIに保存することも考えられます。これは、デスクトップアプリケーションには少し役立ちますが、無人サーバーにはあまり役に立ちません。
詳細については、このサイトで次の質問をお読みください: ユーザーの操作を回避するためにパスワードを保存する 、 暗号化用のキーを保存する場所 、 オープンソースプロジェクトの方法安全なアーティファクトを処理しますか? 、 キーをハードコーディングせずにJavaでデータを復号化するにはどうすればよいですか? 、 ファイル.phpのパスワード 、 どこで行うかソースが表示されるシステムのキーを安全に保存しますか? 。
追伸原則として、TPMを使用してパスワードを保存することができますが、実際には、これにより最先端の問題が発生するため、ほとんどの人にとってそれはおそらく現実的ではありません。
(非セッション)O/Sユーザー環境変数にパスワードを保存し、そのユーザーとしてプログラムを実行します。
利点:
チェックインするファイルがないため、誤ってパスワードをソース管理にチェックインすることはありません。
設定ファイルのファイル権限を台無しにした場合(これは決して正しくありませんか?)、パスワードは危険にさらされません
ユーザーまたはルートのみが読み取ることができます(構成ファイルと同じ、暗号化ファイルを保護する秘密鍵と同じ)
ファイルを暗号化する場合、どのようにキーを保護しますか?
ただし、新しいプロセスを開始する前に、環境変数をクリアしてください。
HSMの利点の1つは、ユーザーまたはルートが値を復号化するためにHSM seを使用できる一方で、その中にキーを取得できないことです。
ローカルパスワードの保存は、私が扱っていた長い問題です。暗号化は完全ではありませんが、役立つ場合があるため、他にいくつかのオプションがあります。
。
そしてあなたの質問のために:
構成ファイルにパスワードが必要な場合、どのレベルの暗号化を実行する必要がありますか?
コードにパスワードを含める必要はありませんが、これが最も簡単で安全な方法です。
パスワードの暗号化キーをハードコーディングするか、さらに別の構成ファイルに保存する必要があるという事実にどのように対処しますか?
アクセス制限の使用とファイルの監視
パスワードの暗号化キーは人間が読めるようにする必要がありますか?人間が読める強力なパスワードを意味する場合は、まったく問題ありません
ここで私の2セントは、完全なセキュリティのために、同じ権限を持つ物理マシン上の攻撃者が実行できないはずのことをアプリケーションが実行できるようにすることです(パスワードの読み取り)。これは矛盾しているようです。 。
せいぜいobfuscate構成内のパスワード(Base64、コンピューターのどこかにキーなど...)