
データベースの特定のフィールドを暗号化できることはわかっていますが、データベースのすべてのフィールドを暗号化することに興味があります。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 サーバーのルートが侵害されても、攻撃者がアプリケーション ソースからキーを読み取ることができないようにします。
このアプローチは過剰に思えます。機密データ(パスワード、クレジットカードなど)は適切に処理する必要がありますが、すべてを暗号化するのはやりすぎです。(そして、主キーの世界では逆効果になる可能性があります)