はじめまして。インフラグループDB担当のMと申します。
今回はMySQL 8.xの暗号化方法について触れさせていただきます。
データ暗号化とは
データ暗号化とは、データにアクセスされた場合でも中身を推測されにくくする技術のことです。暗号化されていないファイルは、誰でも閲覧や編集ができる状態で、万が一情報が流出した場合、改ざんされる危険性や改ざんによる事業サービス継続への影響など、企業ブランドイメージへ与えるインパクトは計り知れないものがあります。今や暗号化は最低限必須となるセキュリティ対策の一つといっていいでしょう。
概要前置きはこの程度とし、実際の暗号化の方法について記載致します(環境前提:MySQL 8.x)
暗号化方法
- MySQLのパラメーター(/etc/my.cnf)に以下pluginの設定を追記
early-plugin-load=keyring_file.so
plugin-load=audit_log.so
keyring_file_data="ファイルパス/ファイル名"
- plugin有効化の確認
DB再起動でパラメーターの読み込みを行ったのち以下のSQLで設定を確認select PLUGIN_NAME,PLUGIN_STATUS from information_schema.plugins WHERE PLUGIN_NAME IN ('keyring_file','audit_log');
「keyring_file」、「audit_log」が「ACTIVE」であることを確認
+--------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +--------------+---------------+ | keyring_file | ACTIVE | | audit_log | ACTIVE | +--------------+---------------+
- 暗号化する対象に応じて、以下を設定
暗号化する対象 暗号化方法 redoログ パラメータ(/etc/my.cnf)にinnodb_redo_log_encrypt=ONを追記 undoログ パラメータ(/etc/my.cnf)にinnodb_undo_log_encrypt=ONを追記 binlog パラメータ(/etc/my.cnf)にbinlog_encryption=ONを追記 テーブル パラメータ(/etc/my.cnf)にdefault_table_encryption=ONを追記 一般テーブルスペース alter tablespace "表領域名" encryption = 'Y'; auditログの暗号化ついては以下の通り
・パラメータ(/etc/my.cnf)にaudit_log_encryption=AESを追記
・以下SQLで暗号化関連のファンクション作成CREATE FUNCTION audit_log_read_bookmark RETURNS STRING SONAME 'audit_log.so'; CREATE FUNCTION audit_log_read RETURNS STRING SONAME 'audit_log.so'; CREATE FUNCTION audit_log_encryption_password_set RETURNS INTEGER SONAME 'audit_log.so'; CREATE FUNCTION audit_log_encryption_password_get RETURNS STRING SONAME 'audit_log.so';
・ランダムパスワードを設定
SELECT audit_log_encryption_password_set('***********');
暗号化に関して注意すべきこと
暗号化には付随して考慮すべき事柄も多々存在します。
- 暗号化キー
その名の通り、暗号化・復号化に用いる鍵ですが、鍵そのものの管理(アクセス制限・保存場所・バックアップ保護) も重要となってきます。
- パフォーマンス
実装形態にも依存はするものの暗号化/復号化には処理コストがかかります(性能についてまで透過的・・・ではありません)暗号化で発生する性能劣化の度合い計測は必須です。
最後に
MySQLでは、テーブルデータ以外にも、redoログ、undoログ、binlog、auditログなど
データとして扱われるすべてを透過的に暗号化設定することができます。
設定自体は比較的簡単に暗号化できますので、MySQL導入時にはセキュリティ対策の一環として暗号化することをお勧めいたします。
■参考としたMySQLマニュアル
https://dev.mysql.com/doc/refman/8.0/ja/innodb-data-encryption.html
次回にはMySQL暗号化によるパフォーマンスについて記事をかければと考えています。
最後までお読みいただき、ありがとうございました。