カジュアルな人間の読者があまりに簡単にパスワードを設定することなく、パスワードを設定可能な状態に保つ最良の方法は何ですか? [database]


Answers

以下の一般的なシナリオを想定しましょう。

  • すべての環境で同じコードベースを使用し、コードベースには各環境のデータベースパスワードがあります。

  • プロダクションアプリケーションサーバーにアクセスできる担当者(システム管理者、構成マネージャー)は、本番データベースのパスワードを知ることができます。

  • あなたはソースコードにアクセスできる誰もが本番のパスワードが何であるか知ることを望まないでしょう。

このようなシナリオでは、プロダクションパスワードを暗号化して、アプリケーションのプロパティファイルに格納することができます。 アプリケーション内で、プロパティファイルからパスワードを読み取り、データベースドライバに渡す前に復号化するクラスを含めることができます。 ただし、パスワードを解読するために使用されるキーとアルゴリズムは、ソースコードの一部ではなく、実行時にシステムプロパティとしてアプリケーションに渡されます。 これにより、キーの知識がアプリケーションのソースコードから分離され、アプリケーションのソースコードだけにアクセスできる人は、アプリケーションの実行時環境(アプリケーションサーバー)にアクセスできないため、パスワードを復号化できなくなります。

Javaを使用している場合は、 これをより具体的な例として見てください。 この例では、SpringとJasyptを使用しています。 私は、このようないくつかのものは、.Netのような他の環境に外挿することができると確信しています

Question

私は、多くの異なるクライアントアプリケーション(Webサービス、いくつかのJavaアプリケーション、いくつかのドットネットアプリケーション)に接続するデータベースを持っています。 これらのすべてがWindows上で実行されているわけではありません(悲しいことに、それ以外の場合はデータベース接続のWindows認証を有効にするだけで簡単に答えられます)。 現時点では、パスワードは、システムの周囲にあるさまざまな構成/プロパティファイルに格納されています。 理想的には、サポートスタッフだけがファイルが実行されているサーバーにアクセスできますが、他のユーザーがサーバーの1つにアクセスすると、データが十分に取得できるだけの十分なデータベースアクセス許可が得られます。

私の質問は、カジュアルな人間の読者にあまりにも簡単にパスワードを設定せずに、パスワードを設定可能に保つ最良の方法は何ですか?

編集 DBサーバーはMSSQL 2005を実行しているWindows Server 2003です。

PS:これは重複する質問はありませんが、もしあれば、これを閉じてください。




簡単な答えがないように思えます(接続するアプリケーションの種類が異なるため)...本当に、私が見る唯一の問題は、データベースに直接接続するJavaアプリケーションです。 あれは正しいですか?

もしそうなら、あなたができることは次のとおりです:

1)DBに直接接続してサービスを通過するクライアント側のアプリケーションを変更します。 (直接接続する必要がある場合は、少なくともサービスから「パスワードを取得する」ための最初のステップを与えてから、直接接続することができます)。

2)web.configファイルにパスワードを格納し(.Net Webサービスを選択した場合)、ファイルの「接続文字列」セクションを暗号化します。




Blowfishな​​どの可逆暗号化アルゴリズムを使用して、パスワードをストップギャップ測定値として保存することができます。 このアクセスを必要とするすべてのプログラムにこれを組み込むために使用できるいくつかのフリーライブラリが必要です。

BruceのBruce Schneierのページ

ブローフィッシュに関するウィキペディアの記事




NTLM認証またはLDAPベース(Active Directory)認証は、手間をかけずに利用できるようにする必要があります。 これにより、アプリケーション間でWindows認証を使用することができます。

これは、運用スタッフのための移行のビットを意味するかもしれませんが、一連のアプリケーションのSSOはいいです。




暗号化を使うのは良い考えではありません。 誰かが鍵を妥協すると、鍵を解読することができます。 パスワードを保存するには、塩を含むハッシュアルゴリズムを使用します。 ハッシュアルゴリズムは1つの方法であり、その逆もありません。 しかし、彼らは辞書攻撃の影響を受けやすいので、塩(concataneプレーンテキストはハッシュよりも長く、冗長である)を使用します。 また、内部の攻撃からデータベースを保護します。