このブログでは、既存のデータベースを最初に暗号化された状態に移行し、次にデータベースを暗号化されていない状態に移行する方法を紹介します。
暗号化を使用するには、暗号化キーを管理するプラグインをロードする必要があります。現在サポートされている暗号化プラグインを参照してください。各キーは、32ビット整数をキー識別子(key_id)および実際のキーとして使用します。キーをバージョン管理して、データが古いキーから新しいバージョンのキーに再暗号化されるようにすることができます。このブログでは、例としてファイルキー管理プラグインを使用します(暗号化キー管理を参照)。また、最新バージョンのMariaDBサーバーを使用していることも前提としています(このブログでは、MDEV-15566が修正されていることを前提としています。つまり、MariaDBのバージョンは10.1.33、10.2.15、または10.3.6である必要があります)。
データベースを暗号化された状態または暗号化されていない状態に移行するには、key_rotationを使用します。 キーローテーションにより、データベースが既存の暗号化された状態から別の状態に移動します。ここで、テーブルスペースに暗号化された状態がない(つまり、テーブルスペースが暗号化されていない)か、テーブルスペースに暗号化されていない状態に移行する暗号化状態がある可能性があることに注意してください。キーローテーションは定期的に発生する可能性があります(構成変数 innodb-encryption-rotate-key-age に基づく) つまり、データベース管理者によって要求された(たとえば、 set global innodb_encrypt_tables =ON を発行することによって)キーがローテーションされる前にどのくらい古いか。; )または暗号化キー管理システム(キーのローテーションなどを参照)
データベース管理者は、個々のテーブルのみを暗号化する(InnoDBのデータの暗号化を参照)か、システムテーブルスペースを含むデータベース全体を暗号化するだけで十分かどうかを判断する必要があります。テーブルデータはREDOログとUNDOログにも書き込まれることに注意してください。したがって、データベースに非常に機密性の高いデータを含むテーブルが含まれている場合 innodb-encrypt-log また、有効にする必要があります。このブログでは、データベース全体を暗号化する方法を紹介します。
データベースを暗号化された状態に移行する
データベースを暗号化された状態に移行する前に、暗号化プラグイン構成を構成ファイルに追加する必要があります(パラメーターの詳細な説明を参照):
# File Key Management
plugin-load-add = file_key_management
file-key-management-filename = /mnt/flash/keys.txt
file-key-management-encryption-algorithm = aes_ctr
# InnoDB encryption setup
innodb-encrypt-tables=ON
innodb-encrypt-log=ON
innodb-encryption-rotate-key-age=1024
innodb-encryption-threads=4
innodb-tablespaces-encryption
再起動後、暗号化操作の進行状況は、INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTIONテーブルから監視できます。次の例では、テーブルスペースの名前、キーローテーション中の現在のページ、およびまだ暗号化されていないテーブルのテーブルスペース内の最大ページをクエリします。
MariaDB [(none)]> select name, KEY_ROTATION_PAGE_NUMBER, KEY_ROTATION_MAX_PAGE_NUMBER from information_schema.innodb_tablespaces_encryption where min_key_version = 0 or ROTATING_OR_FLUSHING = 1;
+---------------+--------------------------+------------------------------+
| name | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER |
+---------------+--------------------------+------------------------------+
| innodb_system | 17641 | 1397504 |
+---------------+--------------------------+------------------------------+
1 row in set (0.000 sec)
もちろん、すべてのテーブルのステータスを照会することもできます。
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption;
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| 0 | innodb_system | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 3 | tpcc1000/customer | 1 | 1 | 0 | 1 | 2401 | 1317888 | 1 | 1 |
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
2 rows in set (0.000 sec)
これから、システムテーブルスペースはすでに暗号化されているが、データベースtpcc1000のテーブルcustomerは現在暗号化されていることがわかります。システムにハードウェアリソースがあり、暗号化プロセスが遅いと思われる場合は、次のパラメータを試してください。
# Set close to number of cores
set global innodb_encryption_threads=16;
# For SSD increase number of I/O operations used for encryption in second
set global innodb_encryption_rotation_iops=40000;
暗号化されていない状態のテーブルがない場合、データベースの暗号化は終了します:
MariaDB [tpcc1000]> select name, KEY_ROTATION_PAGE_NUMBER, KEY_ROTATION_MAX_PAGE_NUMBER from information_schema.innodb_tablespaces_encryption where min_key_version = 0 or ROTATING_OR_FLUSHING = 1;
Empty set (0.001 sec)
確認するには、暗号化されているすべてのテーブルを一覧表示します。
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0;
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| 0 | innodb_system | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 3 | tpcc1000/customer | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 2 | tpcc1000/district | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 4 | tpcc1000/history | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 8 | tpcc1000/item | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 5 | tpcc1000/new_orders | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 7 | tpcc1000/order_line | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 6 | tpcc1000/orders | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 9 | tpcc1000/stock | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 1 | tpcc1000/warehouse | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
10 rows in set (0.000 sec)
ご覧のとおり、すべてのテーブルスペースは ENCRYPTION_SCHEME =1を使用しています。 (暗号化)および MIN_KEY_VERSION =1 。このフェーズの後、データベース管理者は、使用される暗号化スレッドとローテーションIOPSの数を減らすことを検討する必要があります。さらに、ファイルキー管理プラグインは実際のキーローテーションをサポートしていないため、さらにキーローテーションを行う必要があることも考慮する必要があります。キーローテーションは、 innodb-encryption-rotate-key-age =0を使用して無効にできます。 。その設定でも、作成されたすべての新しいテーブルは暗号化の対象と見なされることに注意してください。
データベースを暗号化されていない状態に移行する
ここでは、暗号化されたデータベースがあり、データを暗号化する必要がなくなったか、データ保護が別の方法で行われていることを前提としています。データベースを暗号化状態に移行する場合と同じデータベースを例として使用します。この時点で、サーバーを再起動する必要はありません。代わりに、データベースを暗号化されていない状態に移動することは、オンライン操作として実行できます。まず、データベース管理者は、明示的な暗号化を使用するテーブルがないこと、つまり、テーブルの作成でENCRYPTED=YESテーブルオプションを使用するテーブルがあることを確認する必要があります。これで、データベースを暗号化されていない状態に移行するには、次のコマンドを発行するだけです。
SET GLOBAL innodb_encrypt_tables=OFF;
これにより、システムテーブルスペースを含むすべてのテーブルスペースの暗号化解除が開始され、この操作の進行状況は次の方法で監視できます。
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0;
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| 7 | tpcc1000/order_line | 1 | 1 | 1 | 1 | 76564 | 1947904 | 1 | 1 |
| 6 | tpcc1000/orders | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 9 | tpcc1000/stock | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 1 | tpcc1000/warehouse | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 10 | tpcc1000/t1 | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
5 rows in set (0.001 sec)
これから、データベースtpcc1000のテーブルorder_lineがローテーションされていることがわかります。暗号化を使用するテーブルがない場合、つまりmin_key_version!=0の場合、操作は終了します。
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0 or rotating_or_flushing = 1;
Empty set (0.000 sec)
暗号化設定を構成から削除する必要がある場合は、今がサーバーをシャットダウンするときです。構成でREDOログ暗号化を使用する場合、つまり innodb-encrypt-log =ON InnoDBログファイルを含むデータベースからバックアップを取り、その後、暗号化されたデータが含まれている場合は使用できないため、InnoDBログファイルを削除します。
rm -rf ib_logfile*
構成から暗号化セットアップを削除し、サーバーを再起動します。これで、暗号化が使用されていないデータベースインスタンスができました。
結論
上記のようにデータベースを暗号化された状態に移行するには、サーバーを再起動する必要があり、慎重な暗号化プラグインの構成が必要です。この操作にかかる時間は、テーブルの数とこれらのテーブルの大きさによって異なります。この進捗状況を監視する方法と、使用するハードウェアに十分なリソースがある場合にそれを高速化する方法を紹介しました。データベースを暗号化されていない状態に移行するには、1つのグローバル変数を設定するだけで済みます。ただし、暗号化がより長く必要であり、暗号化へのすべての参照を削除する必要がある場合は、1回再起動する必要があります。この移行を監視する方法と、データベースと構成の両方から暗号化設定を完全に削除する方法を示しました。