点击上方"蓝字"

关注我们,享更多干货!

# 前言

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

01 安装

mkdir /usr/local/mysql/keyring
chown -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: KEYRINGPLUGIN_TYPE_VERSION: 1.1PLUGIN_LIBRARY: keyring_file.so
PLUGIN_LIBRARY_VERSION: 1.10PLUGIN_AUTHOR: Oracle CorporationPLUGIN_DESCRIPTION: store/fetch authentication data to/from a flat filePLUGIN_LICENSE: GPLLOAD_OPTION: ONmysql> 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: 0mysql> alter table t2 encryption='Y';
Query OK, 1 row affected (0.11 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> 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: 0mysql> alter table t7 encryption='N';
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> 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 clear
mysql> USE performance_schema;
Database changed
mysql> 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

推荐阅读:267页!2020年度数据库技术年刊

推荐下载:2020数据技术嘉年华PPT下载

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

你知道吗?我们的视频号里已经发布了很多精彩的内容,快去看看吧!↓↓↓

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

MySQL 表空间加密插件 Keyring相关推荐

  1. mysql 表空间加密,MySql(8.0)基于docker部署(加密存储表空间)

    说明: MySql社区版的加密方式只支持keyring_file的方式: 目前我找到的加密只能针对表来,不能针对整个库使用. 1. 宿主机创建映射目录 正常情况下,我个人喜欢创建两个目录,一个映射配置 ...

  2. mysql表空间权限_MySQL InnoDB表空间加密示例详解

    前言 从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系 ...

  3. mysql 查看表v空间自增涨_MySQL InnoDB表空间加密

    从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加 ...

  4. mysql5.7.16 表空间加密,MySQL :: MySQL 5.7参考手册:: A.16 MySQL 5.7 FAQ:InnoDB表空间加密...

    A.16.1. 数据是否被授权查看的用户解密? 是.InnoDB表空间加密旨在为客户提供在数据库中透明地应用加密而不影响现有应用程序的能力.以加密格式返回数据会破坏大多数现有的应用程序.InnoDB表 ...

  5. mysql5.7.16 表空间加密_技术分享 | InnoDB 表空间加密

    本文目录: 一.表空间加密概述 应⽤场景 加密插件 加密限制 注意事项 二.加密表空间 安装加密插件 配置表空间加密 查看表空间被加密的表 三.更新 master encryption key 四.导 ...

  6. mysql 表空间监控shell_一种通过zabbix监控mysql表空间的方法

    一种通过zabbix监控mysql表空间的方法[ 技术领域: ][0001]本发明涉及计算机自动化运维与监控领域,具体地说是一种通过ZABBIX监控MYSQL表空间的方法.[ 背景技术: ][0002 ...

  7. MySQL表空间简介

    本文主要介绍一下MySQL中的几种表空间概念及相关操作. 基础材料: CentOS7.5  MySQL 5.7.24 ######################################### ...

  8. mysql 表空间收缩_mysql表碎片清理和表空间收缩

    mysql表碎片清理和表空间收缩(即清理碎片后report_site_day.ibd文件磁盘空间减小,该方案基于独立表空间存储方式) OPTIMIZETABLE [tablename],当然这种方式只 ...

  9. mysql 表空间收缩_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

最新文章

  1. 【FPGA】双端口RAM的设计(同步读写)
  2. Java 实现 HTTP 请求的三种方式
  3. 基于IPV6数据包分析(GNS3)
  4. Android 软键盘的全面解析,让你不再怕控件被遮盖
  5. Node.js执行系统命令
  6. 深入探索.NET框架内部了解CLR如何创建运行时对象
  7. JAVA头部声明异常,Java 异常详解
  8. Linux下导出MySQL为SQL文件_在linux命令下导出导入.sql文件的方法
  9. Emscripten 单词_极光单词独创多种学习方法助您高效背单词
  10. 2清空所有表_mysql数据库学习(第十二篇) - 数据高级操作(2)
  11. 和java_那些和Java的点滴
  12. PT-100系列 铂电阻温度传感器
  13. java mian是什么_java mian方法详解
  14. 计算机网络的 89 个核心概念【转自微信公众号Linux爱好者】
  15. 牛客网小白二(2018.4.21)
  16. 数仓基于表级别的数据血缘分析
  17. 银河麒麟V10 SP1服务版虚拟机安装
  18. mysql innodb 存储引擎
  19. win10 装黑苹果 完整教程
  20. 百度高德离线地图二次开发入门步骤

热门文章

  1. ipsec加密技术谁提出的_如何提出技术问题以获得高质量的答案
  2. JavaScript实现元素全排列
  3. CSS 设置表格格式
  4. python路线选择试题_python例题练习
  5. 单机启动nacos_SpringBoot集成Nacos的详细教程
  6. mysql设置本机可被访问_怎么设置MySQL就能让别人访问本机的数据库了?
  7. ajax请求携带tooken_9 HTMLJS等前端知识系列之Ajax post请求带有token向Django请求
  8. java参数值注入_在springboot中使用注解将值注入参数的操作
  9. Linux—Ubuntu14.0.5配置JAVA环境
  10. 第六章 图像识别与卷积神经网络