web-dev-qa-db-ja.com

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

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

また、誰かがマシンへのrootアクセス権を持っているが、復号化キーを持っていない場合、データを読み取ることができないことを確認したいと思います。

どうすればよいですか?行うことは理にかなっていますか?誰かがmysqlデータベースにアクセスできるかどうか、彼らが必然的にキーにアクセスできるかどうか心配ですので、これは意味がありません。何か不足していますか?

20
Snitse

最小限のフィールドレベルの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接続が必要です。

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

10
GioMac

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

7
Scott C

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

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

このアプローチは過度に思われます。機密データ(パスワード、クレジットカードなど)を適切に処理しますが、すべての暗号化はやりすぎです。 (そして主キーの世界ではおそらく逆効果です)

3
Daniel Widrick