データベースの特定のフィールドを暗号化できることはわかっていますが、データベースのすべてのフィールドを暗号化することに興味があります。 mysqlシェルにアクセスできるが、復号化キーにアクセスできないユーザーがデータベースから何も読み取ることができないようにしたいのですが。
また、誰かがマシンへのrootアクセス権を持っているが、復号化キーを持っていない場合、データを読み取ることができないことを確認したいと思います。
どうすればよいですか?行うことは理にかなっていますか?誰かがmysqlデータベースにアクセスできるかどうか、彼らが必然的にキーにアクセスできるかどうか心配ですので、これは意味がありません。何か不足していますか?
最小限のフィールドレベルのAESおよびDES暗号化が利用可能です: https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_encrypt
すべてのクエリにキーを指定せずに(またはトリガー/プロシージャに追加せずに)データを読み取ることはできません。
例:
インサート:
INSERT INTO users (username, password) VALUES ('root', AES_ENCRYPT('somepassword', 'key12346123'));
およびSELECT:
SELECT AES_DECRYPT(password, 'key12346123') FROM users WHERE username = 'root';
また、これにはデータベースへのSSL接続が必要です。
そしてより低いレベルでは-ファイルシステムも暗号化できます。
MariaDBは最近、InnoDBおよびXtraDBテーブルにテーブルレベルの暗号化を追加しました。 https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/#specifying-what-tables-to-encrypt
MySQLは、InnoDBのテーブルレベルの暗号化もサポートしています。 https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html
最初に、アプリケーションにキーを保存し、すべての暗号化をアプリケーション層で処理します。
次に、MySQLインスタンスとアプリケーション[サーバー]が別々のマシン上にあることを確認します。これにより、MySQLサーバーでのルート侵害により、攻撃者がアプリケーションソースからキーを読み取ることができなくなります。
このアプローチは過度に思われます。機密データ(パスワード、クレジットカードなど)を適切に処理しますが、すべての暗号化はやりすぎです。 (そして主キーの世界ではおそらく逆効果です)