MySQL データベースを暗号化する良い方法は何ですか? また、それは価値がありますか?

MySQL データベースを暗号化する良い方法は何ですか? また、それは価値がありますか?

データベースの特定のフィールドを暗号化できることはわかっていますが、データベースのすべてのフィールドを暗号化することに興味があります。mysql シェルにアクセスできても、復号化キーにアクセスできない人は、データベースから何も読み取れないようにしたいのです。

また、誰かがマシンのルートアクセス権を取得しても、復号化キーを持っていない場合は、データを読み取ることができないようにしたいと考えています。

これをどうやって行うべきでしょうか? 行う意味はあるでしょうか? 誰かが mysql データベースにアクセスできる場合、必然的にキーにもアクセスできることになるので、これは意味がありません。何か見落としているのでしょうか?

答え1

最小限のフィールドレベルの AES および DES 暗号化が利用可能です。暗号化関数

すべてのクエリにキーを指定せずに (またはキーをトリガー/プロシージャに追加せずに)、誰もデータを読み取ることはできません。

例:

入れる:

INSERT INTO users (username, password) VALUES ('root', AES_ENCRYPT('somepassword', 'key12346123'));

そして選択:

SELECT AES_DECRYPT(password, 'key12346123') FROM users WHERE username = 'root';

また、これは必要データベースへの SSL 接続。

また、より低いレベルでは、ファイルシステムも暗号化できます。

答え2

MariaDB は最近、InnoDB および XtraDB テーブルにテーブルレベルの暗号化を追加しました。 https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/#暗号化するテーブルを指定する

MySQL は InnoDB のテーブルレベルの暗号化もサポートしています。 https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html

答え3

まず、キーをアプリケーションに保存し、すべての暗号化をアプリケーション層で処理します。

次に、MySQL インスタンスとアプリケーション [サーバー] が別のマシン上にあることを確認して、MySQL サーバーのルートが侵害されても、攻撃者がアプリケーション ソースからキーを読み取ることができないようにします。

このアプローチは過剰に思えます。機密データ(パスワード、クレジットカードなど)は適切に処理する必要がありますが、すべてを暗号化するのはやりすぎです。(そして、主キーの世界では逆効果になる可能性があります)

関連情報