このようなセキュリティの問題を決定する前に、脅威モデルを評価する必要があります。何に対して防御しているのかわからない場合、あなたがとる対策はほとんど価値がないでしょう。
ここで、このコンテキストで心配できることがいくつかあります。
- データに物理的にアクセスする攻撃者(データセンターへの侵入、バックアップテープの盗用など)
- 未加工のデータベースへの読み取りアクセス権を取得する攻撃者
- SQLインジェクション、バッファオーバーランなどにより、アプリケーションを侵害する攻撃者
最初のシナリオでは、サーバーがヘッドレスであれば、データベースとすべてのバックアップを暗号化されたボリュームに保存する必要があります。サーバーまたはテープを盗む場合、ディスクレベルの暗号化を解除する必要があります。
2番目のシナリオでは、データベースデータの暗号化が役立ちますが、必要なキーまたはパスフレーズをどこにも保存しない場合に限ります。
3番目のシナリオでは、すべてが攻撃が発生するコンテキストに依存します。たとえば、XSSまたはCSRF攻撃の場合、攻撃者は正当なユーザーができることを何でも行うことができ、データの暗号化はまったく役に立ちません。
したがって、脅威モデルは、ログイン資格情報を見つけて外部からデータベースサーバーへのログインを管理するか、データベースサーバーへのルートアクセスを取得することにより、未加工のデータベースへの読み取りアクセスを取得する攻撃者です。典型的な方法は、最初にWebサーバーでシェルアクセスを取得することです。攻撃者はそこから、構成ファイルからアクセス資格情報を読み取り、データベースに接続できます。
さらに考慮すべき点は、特にPHPなどのステートレス実行モデルを備えたプラットフォームを使用している場合、キーとパスフレーズを保持する場所です。理想的には、必要に応じて顧客にパスフレーズを入力してもらい、それをメモリのみに保持するか、さらに良いことに、クライアント側で復号化を行います(しかし、これは実行できないことがよくあります)。ステートレスプラットフォームでは、通常、状態はセッション、memcache、データベース、またはフラットファイルを使用して伝達されます。しかし、これらはすべて、ステートフルWebアプリケーションのメモリに状態を保持するよりもはるかに脆弱です。これを回避することは、鶏と卵の問題です。なぜなら、状態を永続化する前に暗号化すると、安全に覚えておく必要がある別の秘密を作成したからです。クライアントのパスフレーズを覚えて、それを必要とする各リクエストと一緒に送信することは、最も恐ろしい解決策かもしれません。