2013-12-11 16 views
5

私のデータベースには、PHPクラスを使用してオンザフライで暗号化および復号化された情報が保存されています。PHP環境で暗号化用の秘密鍵を格納する場所

アプリケーションごとユーザーが自分のデータを復号しようとすると、復号化が成功するだけであることを確認するために、ユーザーキーが付加された秘密キーを使用します。

ユーザー 'キー'はデータベースに格納されます。秘密鍵(アプリケーションレベル)はtxtファイルとしてFSに格納されます。もちろん、ウェブルートの上にはありません。

考慮事項: - データベースがハッキング入った場合: - :彼らだけinclude('../private/private.php')その中で単一のページで終わるPHP-停止した場合、または破損している彼らは、一つのキーの一部、および暗号化されたデータ で終わります。
- NGINXが失敗した場合:接続が「ただの」状態になりました。

私が考えることができる唯一のシナリオは、システム自体の破損です。しかし、サーバーはファイアウォールを実行し、定期的に更新され、fail2banを実行し、必要なサービスだけが実行されます。 SSHログインはキーアクセスなどでのみ行われます。

これは「ベスト」なのか疑問に思っていました。 上記の仕様でこの種の暗号化を行うより良い方法がある場合は、 キーファイルへの正しいアクセス権は何ですか?

現時点では、データベースとWebサーバーは、両方ともインターネットに面した同じサーバーにあります。それを分割し、Webサーバーだけを持つインターネットに直面しているサーバーを作成する方が良いですか?データベースサーバーとキーファイルをプライベートネットワーク内の別のサーバーに配置しますか?

編集:
$key = $app_key . $user_key

+3

キーファイルへの正しいアクセス権は '-r --------'または '400'で、Webサーバーユーザーは所有者です。それ以外は、あなたはかなり良い仕事をしたようだ。 –

+1

* "私は自分のデータを解読しようとすると解読が成功するだけであることを確認するために秘密鍵をユーザキーに付加する" *何が手段。両方のキーをサーバーに保存するので、いつでも復号化が成功します。逆に、サーバーが所有されている場合、データも所有されます。 – Jon

+0

その能力は、あなたが持っている情報のレベルとセキュリティが必要なのはどれほど厳しいかによってまったく異なります。ほとんどの一般的なシナリオでは、OS上で実行されているデーモンの監査を実行して、sshのバージョンなどの既知の攻撃ベクトルがないことを確認することを検討することをおすすめします。 – Dave

答えて

1

あなたはAPCまたは類似のものの中にキーをロードすることができます:秘密鍵データを暗号化するには2つのコンポーネントによって構築されます。これは、起動時に人間の入力が必要になります(または、おそらくより安全なサーバーから開始されます)。これは、サーバー上のファイルにキーが格納されないことを意味します。

これは完璧ではありませんが、ローカルファイルを使用するより一般的な方法よりも優れています。これは、 '最良' プラクティスである場合、私は思っていた

q.v.、Where should I store an encryption key for php?

2

。または、上記の仕様でこの種の暗号化を行うより良い方法が の場合は、 キーファイルへの正しいアクセス権は何ですか?ハード

は完全にあなたは、このようなスマートカードやHSMボックスとしてHSM(ハードウェアセキュリティモジュール)上の秘密鍵と公開鍵のペアを生成する必要があります確保するために実装します。生成された秘密鍵はHSM内部で作成され、HSMから離れることはありません。HSM自体の復号/署名操作にのみ使用できますが、HSMから読み取ることはできません。この場合、誰かがサーバーをハックしたり、サーバーを完全に制御したりしても、HSM内に格納されている秘密鍵を保持することはできません。サーバー上で必要な復号化/符号化操作の数に応じて、必要なデータを復号化するために合理的に実行するHSMが必要です。純粋なPHPでこのタスクを達成することが長い道のりである(あなたがあなた自身のC++拡張機能を実装したり、HSMとできる相互作用であるプロセスとプロセス間通信を使用することができます)

を実装する方が簡単サーバーを強化し、可能な限り攻撃ベクトルを最小化することが重要です。これには、主にファイルとデータベースに適切な権限を割り当てることが含まれます。いくつかの良いセキュリティプラクティスについては、thisをご覧ください。 あなたが使用することができ、私の数セントを追加するには:

  1. APCのためのPHPで、あなたの秘密鍵のメモリストレージに(constanltyは、ファイルからキーを読み込むと比較して、これはまた、あなたのパフォーマンスの向上を提供します)。 Webサーバーを再起動するたびに暗号化されたキーをAPCに復号化/復元するには、セキュアなメカニズム(パスコードの入力など)を実装する必要があります。データベースとWebサーバが同じサーバ 対面に両方とも現時点では、このようなdocker

などのアプリケーションコンテナを使用して

  • 何かあなたのコントロール
  • PHPスクリプトを暗号化し、保護するための ionCubeなどの展開プロセスインターネット。それらを分割してインターネットを作成する方が良いですか? データベースサーバーと キーファイルをプライベートネットワーク内の別のサーバーに配置しますか?

    はい、ウェブサーバーとデータベースサーバーを分離することは間違いなく良い方法です。

    0

    OWASP Cryptographic Storageチートシートとその推奨事項を参照してください。ルール2.1.5.4:鍵保管庫の鍵を保護します。キーは、アプリケーションまたはWebサーバーに格納しないでください。

    関連する問題