MySQL 表空间加密插件 Keyring

# 前言

MySQL支持对InnoDB单表空间、通用表空间、系统表空间和Redo、Undo文件进行静态加密。从8.0.16开始支持对Schema和通用表空间设置加密默认值,这就允许对在这些Schema和表空间中的表是否加密进行统一控制;静态加密功能依赖于Keyring组件或插件,MySQL社区版提供的Keyring file插件会将Keyring数据存储在服务器主机的本地文件系统中。

01 安装
mkdir /usr/local/mysql/keyringchown -R mysql.mysql keyring
  • 配置文件中增加
[mysqld]early-plugin-load=keyring_file.sokeyring_file_data=/usr/local/mysql/keyring/keyring
  • 重启数据库
mysql> select * from information_Schema.plugins where plugin_name like '%keyring%'\G*************************** 1. row *************************** PLUGIN_NAME: keyring_file PLUGIN_VERSION: 1.0 PLUGIN_STATUS: ACTIVE PLUGIN_TYPE: KEYRING PLUGIN_TYPE_VERSION: 1.1 PLUGIN_LIBRARY: keyring_file.soPLUGIN_LIBRARY_VERSION: 1.10 PLUGIN_AUTHOR: Oracle Corporation PLUGIN_DESCRIPTION: store/fetch authentication data to/from a flat file PLUGIN_LICENSE: GPL LOAD_OPTION: ON mysql> show global variables like '%keyring%';+--------------------+----------------------------------+| Variable_name | Value |+--------------------+----------------------------------+| keyring_file_data | /usr/local/mysql/keyring/keyring || keyring_operations | ON |+--------------------+----------------------------------+2 rows in set (0.02 sec)
02 加密操作
mysql> alter table t7 encryption='Y'; Query OK, 2 rows affected (0.10 sec)Records: 2 Duplicates: 0 Warnings: 0
mysql> alter table t2 encryption='Y'; Query OK, 1 row affected (0.11 sec)Records: 1 Duplicates: 0 Warnings: 0

mysql> alter database test DEFAULT ENCRYPTION = 'Y';Query OK, 1 row affected (0.03 sec)

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y'; Query OK, 0 rows affected (2.80 sec)
03 取消加密
mysql> alter table t2 encryption='N';Query OK, 1 row affected (0.11 sec)Records: 1 Duplicates: 0 Warnings: 0
mysql> alter table t7 encryption='N'; Query OK, 2 rows affected (0.08 sec)Records: 2 Duplicates: 0 Warnings: 0

mysql> alter database test DEFAULT ENCRYPTION = 'N';Query OK, 1 row affected (0.03 sec)

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'N';Query OK, 0 rows affected (2.37 sec)
04 查看元数据
  • 查看插件

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';+--------------+---------------+| PLUGIN_NAME | PLUGIN_STATUS |+--------------+---------------+| keyring_file | ACTIVE |+--------------+---------------+1 row in set (0.01 sec)
  • 查看存在的key

mysql> SELECT * FROM performance_schema.keyring_keys;+--------------------------------------------------+-----------+----------------+| KEY_ID | KEY_OWNER | BACKEND_KEY_ID |+--------------------------------------------------+-----------+----------------+| INNODBKey-8c537ce5-4a53-12eb-907d-000c298c47fa-1 | | |+--------------------------------------------------+-----------+----------------+1 row in set (0.00 sec)
05 查看加密对象
  • 加密表空间

mysql> SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE ENCRYPTION='Y';+------------+---------+------------+------------+| SPACE | NAME | SPACE_TYPE | ENCRYPTION |+------------+---------+------------+------------+| 4294967294 | mysql | General | Y || 145 | test/t7 | Single | Y |+------------+---------+------------+------------+2 rows in set (0.00 sec)
  • 查看加密表

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%'; +--------------+------------+----------------+| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |+--------------+------------+----------------+| test | t7 | ENCRYPTION='Y' |+--------------+------------+----------------+1 row in set (0.04 sec)
  • 查看加密Database

mysql> SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM INFORMATION_SCHEMA.SCHEMATA WHERE DEFAULT_ENCRYPTION='YES';+-------------+--------------------+| SCHEMA_NAME | DEFAULT_ENCRYPTION |+-------------+--------------------+| test | YES |+-------------+--------------------+1 row in set (0.00 sec)
  • 从MySQL8.0.23版本开始,支持对DoubleWrite文件页的加密,这一特性无需单独配置。MySQL会自动加密属于加密表的双写文件页。

  • 支持通过配置innodb_redo_log_encrypt选项对Redo日志进行加密,默认禁用。启用innodb_redo_log_encrypt后原Redo日志中未加密页面保持未加密状态,新产生的Redo日志页面以加密形式写入;反之亦然。加密Metadata存放在ib_logfile0文件header中。

  • 支持通过配置innodb_undo_log_encrypt选项对Undo日志进行加密,默认禁用。启用innodb_undo_log_encrypt后原Undo日志中未加密页面保持未加密状态,新产生的undo日志页面以加密形式写入;反之亦然。加密Metadata存放在Undo日志文件header中。

06 加密秘钥轮换

加密秘钥应该定期轮换,轮换操作是原子的实例级别的操作。每次轮换主加密密钥时,MySQL 实例中的所有表空间密钥都会重新加密并保存回各自的表空间表头。如果轮换操作被服务器故障中断,重启后将会做前滚操作。

轮换操作只会更新主秘钥并重新加密表空间秘钥,并不会重新解密并加密表空间数据。

轮换操作需要Super权限或 ENCRYPTION_KEY_ADMIN权限;语句如下:

ALTER INSTANCE ROTATE INNODB MASTER KEY;

成功的 ALTER INSTANCE ROTATE INNODB MASTER KEY 语句将写入二进制日志以在副本上进行复制。

请确保对主秘钥进行备份(在创建和轮换后),否则可能无法恢复加密表空间中的数据。

07 通过Performance Schema监控加密进度
  • 打开stage/innodb/alter tablespace (encryption) instrument:

mysql> system clearmysql> USE performance_schema;Database changedmysql> UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)';Query OK, 0 rows affected (0.01 sec)Rows matched: 1 Changed: 0 Warnings: 0
  • 启用the stage event consumer tables,包括events_stages_current, events_stages_history, and events_stages_history_long.

mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';Query OK, 3 rows affected (0.01 sec)Rows matched: 3 Changed: 3 Warnings: 0
  • 执行一个加密操作

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y'; Query OK, 0 rows affected (2.80 sec)
  • 通过查询Performance_Schema events_stages_current 表来检查加密操作的进度。

    WORK_ESTIMATED 报告表空间中的总页数。

    WORK_COMPLETED 报告处理的页数。

mysql> select * from events_stages_current;Empty set (0.00 sec)
  • 如果加密操作已完成,events_stages_current 表将返回一个空集。在这种情况下,您可以检查 events_stages_history 表以查看已完成操作的事件数据。
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history;+--------------------------------------------+----------------+----------------+| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |

+--------------------------------------------+----------------+----------------+| stage/innodb/alter tablespace (encryption) | 2559 | 2559 || stage/innodb/alter tablespace (encryption) | 2559 | 2559 || stage/innodb/alter tablespace (encryption) | 2559 | 2559 || stage/innodb/alter tablespace (encryption) | 2559 | 2559 || stage/innodb/alter tablespace (encryption) | 2559 | 2559 || stage/innodb/alter tablespace (encryption) | 2559 | 2559 || stage/innodb/alter tablespace (encryption) | 2559 | 2559 |+--------------------------------------------+----------------+----------------+7 rows in set (0.00 sec)

墨天轮原文链接:https://www.modb.pro/db/99637?sjhy(复制到浏览器或者点击“阅读原文”立即查看)

关于作者
杨明翰,云和恩墨服务总监。拥有MySQL、TDSQL、TiDB、openGauss等认证。长期从事MySQL、PG、Redis、MongoDB的数据库技术服务。现负责云和恩墨西区开源数据库交付运维工作;热衷于开源数据库产品的研究。
END
(0)

相关推荐

  • 线上故障如何快速排查?来看这套技巧大全

    文末福利:轻量应用服务器优惠,新用户专享. 前言 线上定位问题时,主要靠监控和日志.一旦超出监控的范围,则排查思路很重要,按照流程化的思路来定位问题,能够让我们在定位问题时从容.淡定,快速的定位到线上 ...

  • 我在 MySQL 的那些年

    作者:赖铮(Allen Lai),前 MySQL 官方团队成员,专注数据库内核开发近二十年,先后就职于达梦,Teradata,北大方正以及 MySQL InnoDB 存储引擎团队,是达梦数据库内核,方 ...

  • MySQL 8.0 表空间机制

    墨墨导读:数据是以表空间来维护和存放的.在表空间中包含数据,结构,索引等信息,如何有效使用表空间对于MySQL来说非常重要. 数据库的表空间是用来存储数据的逻辑空间,也是存储数据的最大逻辑单元,其下还 ...

  • 解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程

    昨天开发人员跟我说,执行一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段.这种 ...

  • 【总结】Oracle数据库 查看表空间和增加表空间

    一.Oracle查看 表空间 的名称及其大小 查看 表空间的名称及其大小的SQL语句: ? 1 2 3 4 select t1.tablespace_name,round(sum(bytes/(102 ...

  • 【一周资讯】SPARTA 开源空间音频插件包免费下载

    音乐舞台的梦想 从这里起航 点击题目下方蓝字关注分享鹦鹉咖 SPARTA 开源空间音频插件包免费下载 芬兰Aalto University的声学实验室的研究员研发了一套空间音频插件,SPARTA.这套 ...

  • oracle 创建表空间、用户 4个步骤

    /*分为四步 */ /*第1步:创建临时表空间(注意:D:\Project\OracleTableSpace\FHADMIN\ 手动创建路径)  */ create temporary tablesp ...

  • excel如何对工作表进行加密

    excel如何对工作表进行加密呢? 打开一个excel表格,如图所示. 然后单击工具栏上的文件-另存为,如图所示. 在另存为对话框中点击加密,如图所示. 然后在密码加密对话框中输入密码和密码提示,接着 ...

  • Oracle数据库迁移:异构传输表空间TTS HP-UX迁移至Redhat Linux 7.7

    墨墨导读:本文来自墨天轮用户"你好我是李白"的投稿,记录一个Oracle数据库迁移过程 :异构传输表空间TTS HP-UX迁移至Redhat Linux 7.7. 墨天轮主页:ht ...

  • 第34期:MySQL 表冗余设计

    引言: 上一篇我介绍了 MySQL 范式标准化表设计,范式设计具有以下优点: 把如何消除数据冗余做到极致,从而减少关系表对磁盘的额外占用. 各个表之间的关系表现非常清晰,可读性非常强. 正文: 但是范 ...

  • MySql 表结构修改、约束条件、表关系

    表结构修改(alter) 查看表的结构:desc 表名; 修改表名:alter table 表名 rename to 新表名; 修改字段名:alter table 表名 change 旧字段名 新字段 ...