web-dev-qa-db-ja.com

パスワードを別のテーブル/データベースに保存し、別のプロセスで管理するのは良いことですか?

私はシステムアーキテクチャとセキュリティの初心者なので、この計画が理にかなっていることを確認したいだけです。 Webアプリを作成していて、ユーザーごとにパスワードを保存する必要があります。ハッシュアルゴリズムやソルトなどについては、すでにたくさん読んでいます。 Argon2は、現在推奨されているようですので、使用します。私の質問は、ハッシュがどのように格納され、全体的なアーキテクチャの観点からチェックされるかに関するものです。

Argon2でのハッシュは意図的に非常に高価であるため、別のモジュール/プロセスでサービスを作成して、必要に応じて1つ以上の別のマシンに簡単に移動できるようにしたいと考えています。メインアプリサーバーと同じマシンにある場合でも、CPUとメモリの使用状況を監視してハッシュアルゴリズムのコスト要素を調整するのは簡単です。

アプリはHTTPS POSTリクエストをサービスに送信して、パスワードを作成、更新、削除、または確認します。詳細は、プレーンテキストのパスワードを含め、リクエストの本文に含まれます。接続は暗号化され、応答は単に成功または失敗を示します。

このサービスは、データベース操作のロジックを処理し、パスワードをハッシュし、ハッシュが等しいかどうかを比較します。パスワードはユーザーとは別のデータベースに存在するため、攻撃者がパスワードデータベース全体をダンプしても、実際には誰のパスワードも知りません(逆も同様)。また、他のデータ用に別のストレージソリューションに移行した場合でも、パスワードをそのままにしておくことができるため、移行の回数が減ります。

いいですか?それとも、どういうわけか私が気付いていないより多くの弱点を開いてしまうのでしょうか?

7
Alex Hall

ハッシュが遅すぎる場合は、2番目のプロセスではなく、より高速なハッシュを使用する必要があります。 Argon2のパラメーターを微調整するか、bcryptに移動してください(まだ本当に安全です)。パラメータを調整して、ハッシュを適切な時間(約0.2〜0.4秒)にし、すべてを1つのプロセスに保持します。

必要に応じて、プライマリデータベースのコンテンツが盗まれた場合でも、パスワードを2番目のデータベースに保持してデータの損失を減らすことができますが、これが必要かどうかはわかりません。従来の知識では、すべてのデータが盗まれてもbcryptは安全であるとされています。保証はありませんが、NSAが後に続く場合、またはビットコインネットワークの大部分を動機付けしてパスワードの解読を開始する動機を与えるのに十分な価値のあるものを保存している場合を除き、私は合理的にbcryptを実行することに非常に満足しています。

4
Neil Smithline

これはセキュリティの質問ですが、別の考慮事項についてもお知らせしておきます。

パフォーマンスに関する考慮事項

認証を処理するマイクロWebサービスを作成することは、場合によっては良い考えですが、これはユースケースによって異なります。

しかし、(多くのリクエストに対して)多数のhttps接続を確立することもコストがかかることを考慮する必要があるかもしれません。複数の接続で使用される長命のトンネルを2つのサービスに確立させることは、負荷の最小化の点で(それが問題と思われるため)役立つ場合があります。

セキュリティに関する考慮事項について

  • このシナリオでは、実際のユーザー向けWebサービスがTLSクライアントとして機能します。

    トラストストアが意図したとおりに機能している(たとえば、パスワードサービスの証明書のみを信頼している)ことと、パスワードサービスの秘密鍵がextremlyであることが重要です。 Webサービスも非公開のままです。

    そうしないと、

    • サービスはMITM攻撃に対して脆弱になる可能性があります(特に異なるマシンで実行している場合)
    • 攻撃者はパスワードサービスと直接対話する可能性があり、非常に大きなペイロードでDOSを実行したり、間接的なサイドチャネルタイミング攻撃を使用したりする可能性があります。
  • Webサービスおよび/またはパスワードサービスは、可能性のあるタイミング攻撃とDOSを確実に軽減するために、いくつかの戦略を使用する必要があります。

また、もちろん、スケーラビリティの向上、懸念の分離、特にネットワークセグメンテーション(これは適切で重要です)には代償が伴います。ロジックの実装がより複雑になり、気づいていない微妙な問題が発生する可能性があります。これに慣れていない場合は特にそうです。

複雑さが増す例としては、次のようなものがあります。Eメールの変更で、実際のコミットを処理する人は、確認済みの新しいEメールを提供します。データベース間で複製されたデータを変更する権限があるのは誰ですか?データベーストランザクション内でネットワークを開始しますかIO?

ハッシュ関数について

あります パスワードを安全にハッシュすることについての質問です 非常に良い答えがあります。

最先端のリサーチハッシュ関数を使用する必要がないことを考慮してください。その他(PBKDF2、bcrypt、およびscrypt)はこの目的に適しています。彼らが徹底的にピアレビューを行う時間があれば、すぐに重大な問題が見つかることを期待する必要はありません。

3
Tobi Nary