web-dev-qa-db-ja.com

Webアプリケーションでのデータセキュリティのベストプラクティス

プライバシーとセキュリティに関するいくつかの記事を読みましたが、攻撃者がユーザーの個人情報にアクセスできないようにするためのベストプラクティスを明確に理解できていません。

真正性を確認するためだけにチェックされるパスワードやその他のデータを保存する場合、SHA-256のようなハッシュアルゴリズムは完全な候補であることを理解しています。

ただし、私の場合、パスワードに加えて、ユーザーがログインせずに、サーバーがバックグラウンド処理のために復号化してこれらのシークレットを読み取り、履歴統計を提供する必要がある他のシークレットをユーザーが保存できるようにします。これらの "シークレット」は通常、外部サービスへのapiキーであり、悪意のあるユーザーが使用すると危険な場合があります。

考えられる解決策は、ユーザーセッションまたはCookieを使用してシークレットを格納することでしたが、Cookieまたはセッションハイジャックの影響を受けるだけでなく、ユーザーがログインして機能する必要があり、私の場合はサーバーにユーザーがログインしていなくても、バックグラウンドタスクのシークレットを復号化して使用できる。

したがって、別の解決策は、たとえばAES-256を使用してデータベースのシークレットを暗号化し、暗号化パスフレーズをデータベースの外部に保持することです。攻撃者がデータベースにアクセスできる場合、ユーザーの秘密を解読することはできません。攻撃者がサーバーのファイルシステムにアクセスできる場合、パスフレーズにはアクセスできますが、DBにはアクセスできません...ああ、ちょっと待ってください、なぜDBではないのですか?攻撃者が構成を含むサーバーのファイルシステムへのアクセス権を取得すると、接続文字列もファイルシステムの構成に含まれるため、攻撃者はデータベースへのアクセス権も取得します。したがって、攻撃者がファイルシステムにアクセスすると、パスフレーズとデータベースにアクセスできます...

パスフレーズをデータベースから完全に分離するための解決策は考えられません。何か不足していますか?ユーザーのシークレットを保護するための実際の解決策はありますか?ユーザーの助けなしにサーバーがシークレットを暗号化/復号化できる必要があることを知って、少なくとも2つの異なるシステム(DB /ファイル)をハッキングしてシークレットにアクセスする必要がありますか?

私のプロジェクトは、webサーバーとしてnodejs、データベースとしてmongodbを使用してクラウドで実行されます。公開する前に、攻撃者がユーザーのシークレットを取得することがほぼ不可能であることを確認したいと思います。事実である。

編集:パスフレーズを設定に保存する代わりに、Webサーバー(私の場合はnodejs)を起動するときにコマンドで実際にパスフレーズを渡すことができます。したがって、フラット構成ファイルからパスフレーズを読み取る代わりに、コマンドラインからパスフレーズを読み取ります。これを行うと、パスフレーズがファイルに書き込まれることはなく(bash履歴を無効にできると想定)、メモリにのみ存在するため、ハッキングが難しくなりますよね?唯一の欠点は、サーバーがダウンした場合に手動でサーバーを起動する必要があることです。パスフレーズを知らなくても自動的に起動するためです(つまり、自分で起動する必要があります)。しかし、うまくいくでしょうか?それは既知の慣例ですか?

5
Thomas

素晴らしい解決策はないというのはあなたの言う通りです。

はい、CLIを介して入力し、RAMに保存することも時々使用されますが、ramのダンプはそれほど難しくありません。このシナリオに特化したハードウェアセキュリティモジュールがあります(この問題が重要な場合は、この用語を調査してください)足りる)。

一般的に言って、アクセス許可が非常に制限されているフォルダに保存し、サーバーの強化に集中することをお勧めします。攻撃者は2つの困難なことを行う必要があります(サービスを悪用し、特権を昇格させる)。データベースまたはWebユーザーがアクセスできるディレクトリに保存しないでください。

AESを使用して暗号化することをお勧めします。攻撃者が平文を制御したり、暗号文を観察したりできる場合は、それが正しく実装されていることを確認するために、はるかに注意を払う必要があります。

1
Alex Lauerman