web-dev-qa-db-ja.com

アプリケーションによるデータ暗号化とデータベース内のデータ暗号化

GDPR(EU一般データ保護規則)の実装では、個人情報を暗号化する必要があります。データを暗号化する方法は2つあります。

  • 暗号化と復号化の責任はWebアプリケーションだけに任せてください。データベース内の実際のデータは完全に暗号化されています。このように、データが盗まれた場合、データは安全です(私の暗号化が適切であると想定)。

  • データベースレベルで暗号化を有効にし、アクセスするWebアプリケーションを信頼できるクライアントとして追加します。暗号化と復号化はデータベース自体で行われます。このように、データベースの資格情報がわかっている場合、データは失われます。

それでは、パフォーマンスに過度に妥協することなく、最良の方法はどれですか?

18
madhairsilence

データベースに暗号化/復号化を処理させるのは、おそらく最良の方法です。

  1. 暗号化/復号化コードを記述する必要はなく、誤って自分のセキュリティを破るリスクもありません。これは、 Guntram Blohmpointed out として、証明する必要がないことも意味します自分自身のセキュリティを確保するために必要な場合。そして、カスタムソフトウェアの安全性を証明することは、おそらくそれがそうであるとは思えないほど困難です。
  2. 通常、データベースに組み込まれているものを使用する方が簡単です。 Postgres を使用すると、暗号化する列とテーブルを選択できます。その設計では、サーバー上にキーと復号化されたデータが短時間しかありません。他のデータベースもおそらく似ていますが、私が知っているのはそれだけです。
  3. たとえば、データに基づいてレポートを生成する必要がある場合は、暗号化されたデータベースをサポートする既存のツールを使用して、クライアント側ですべてのカスタムコードを自分で作成するよりも簡単です。
  4. 大文字と小文字が区別される正確な値ではないデータに対してフィルタリングを実行する必要がある場合、データベースはそれを効率的に処理します。インデックスは維持しますが、必要になるまで暗号化しておき、必要なときに特定の値のみを復号化します。

すでに述べたように、クライアント側の暗号化に有利な点が1つあります。これは大きな問題ですが、上記のメリットを上回るとは思いません。

  1. クライアント側ですべての暗号化/復号化を処理すると、データベース(およびそのサーバーを制御する悪意のあるシステム管理者/攻撃者)が復号化キーまたは復号化されたデータを認識しないため、セキュリティがわずかに向上します。ただし、データとその使用方法によっては、考慮すべきいくつかの短所があります。
    • クライアント側の暗号化コードをめちゃくちゃにして、直接または サイドチャネル を介してデータ/キーをリークすることは完全に可能です。
    • trust an outsider か、自分でキー管理を処理する必要があります。これは簡単ではありません(very計画的なダウンタイムを頻繁に回避したい場合は、コードでサポートするのは簡単ではありません)
    • コードをめちゃくちゃにした場合、あなただけ(まあ、あなたの会社だけです-私が何を言っているのか知っています)がコードを修正し、損傷をクリーンアップする責任があります。修正には、元のコードと同じくらいバグがある可能性があります。あなたがストレスを受けることを考えると、おそらくもっと。
    • lotの時間のパフォーマンスチューニングを費やすか、パフォーマンスが悪いことを受け入れるか、簡単にパフォーマンスを向上させるためにセキュリティを下げる必要があります(例:比較を短絡するか、定数を事前計算するか、コンパイラに間違ったビットを最適化させる)。これらはどれも良いことではありません。データベースサーバーには、既にlotを実行しているlot人がいますチューニング;あなたはそのすべての努力を一からやり直すでしょう。
    • すべての新しい開発者に対して、安全なコーディング方法でトレーニングするか、コードのセキュリティ関連のビットに触れないように指示する必要があります。どちらも費用対効果が高く、一般的に信頼性も高くありません。
    • クライアント側でファジーフィルタリングを実装する必要がある場合、基本的にはSELECT * FROM table;を実行し、すべての行を手動で復号化してフィルター処理する必要があります。これは...うまくいきません。攻撃者が送信できるリクエストへの直接応答として、直接Webアクセス可能なサーバーのメモリにキーを長期間保持します。

Kevinpoints out なので、特定のフィールドを暗号化するオプションもあります。たとえば、顧客のユーザー名とクレジットカード番号を保存する場合、後者は確実に暗号化する必要がありますが、前者はおそらく暗号化されません。含めることができます。 a CHECK制約 暗号化されていないクレジットカードを誤って追加しないようにします。クレジットカード番号は特に良い例です。クレジットカード番号に対して照合を行う必要がないため、データベースから取得またはデータベースに保存するだけなので、できますクライアント側から効率的に処理します。

ただし、優れたセキュリティは1つではないことに注意してください。良いセキュリティが行われていますすべて正しい:

  • 脅威モデルを分析して、適切な脅威から保護していることを確認する
  • 有効な現在の証明書でWebサイト全体にHTTPSを使用する
  • 何らかの方法でデータベースを暗号化する
  • Webサイトとデータベース間の通信を暗号化する
  • SQLを正しく使用してSQLインジェクションを回避する
  • 攻撃から保護するためにデータベースサーバーを強化する
  • 最小特権の 原則の適用
  • そしてはるかに

どのようにデータベースを処理しても、これで終わりではありません。 すべてに注意してください。

28

データベースごとに、またはフィールドグループごとに暗号化を追加することは、暗号化される各フィールドと共にインデックスフィールドも作成されるという条件で、最善のトレードオフのようです。

一度にいくつかの問題を解決します。

  1. インデックスの検索も同じくらい高速になります
  2. すべてのフィールドを暗号化する必要はありません
  3. GDPRに重点を置いて、暗号化のオーバーヘッドを最小限に抑えます。
  4. 権限で許可されているため、フィールドごとに異なるパスワードを異なるエンドユーザーに使用できます。
3
John Greene

最新の傾向は、ハードウェアセキュリティモジュールであるHSMに秘密キーを格納することです。 HSM内からキーをエクスポート不可としてマークするオプションがあります。暗号化する必要のあるデータはHSMに送信されますが、大量のデータの場合はパフォーマンスに影響する可能性があります。キーがエクスポート可能な場合は、エクスポートされ、アプリケーションが暗号化に使用するためにメモリに保持されます。鍵をエクスポートするときは、最初にHSM内の別の公開鍵を使用して暗号化してから、アプリケーションに送信する必要があります。アプリケーションにはプライベートキーがあるため、マスター暗号化キーを復号化できます。ここで問題は、このキーのキーをどこに保存する必要があるかです。アクセスが制限されたデータベースに保存できます。

0
securitygeek