版权声明:本文由吴洪辉原创文章,转载请注明出处:
文章原文连接:https://www.qcloud.com/community/article/193mysql
来源:腾云阁 https://www.qcloud.com/community算法
MariaDB在10.1.3版本中加入了支持表加密和表空间加密的特性,在10.1.7版本加入了支持binlog加密的特性,这使得咱们能够对数据文件和binlog进行加密,避免数据文件、binlog等文件被窃取后破解出关键数据。sql
本文主要介绍MariaDB加密特性、使用方法。工具
加密特性的一些限制:测试
为了保护加密后的数据,密钥通常存放在和数据文件不一样的位置。MariaDB的密钥管理方式能够根据不一样的保密需求来开发密钥管理插件,在默认状况下可使用file_key_management
插件,该插件以文件的方式存储密钥。
file_key_management
插件:
相关参数:
file_key_management_filename
:密钥文件位置, 好比/etc/my.cnf.d/file_key.txt
file_key_management_filekey
:密钥文件的解密密码,若是密钥文件有加密的话则必须提供
file_key_management_encryption_algorithm
:加密算法, AES_CBC/AES_CTR加密
密钥文件格式:spa
# MariaDB encryption file key 1;561A4A02DA569D12EE4A468236957432 2;561A4A02DA569D12EE4A468236957444 3;87A6C96D487659137E316A467BEA646787A6C96D487659137E316A467BEA6467
每行密钥由两部分组成,第一部分是密钥id,紧跟分隔符后面的是十六进制的密钥。
每一个表能够单独指定一个密钥id(1-255)。不过innodb系统表空间和日志文件固定使用id为1的密钥来加密,因此密钥文件中必定要有id为1的密钥。若是存在密钥id为2的密钥,则会用来加密临时表和临时文件。插件
这里还能够对密钥文件自己进行加密来防止密钥文件外泄,例如把明文的file_key.txt文件加密成file_key_enc.txt,密码为file_key_encrypt_key: openssl enc -aes-256-cbc -md sha1 -k file_key_encrypt_key -in file_key.txt -out file_key_enc.txt
线程
innodb加密选项:
innodb-encrypt-tables
:on/off/force, 是否加密全部innodb表, force表示强制加密全部innodb表
innodb-encrypt-log
:on/off, 是否加密innodb日志文件
innodb-encryption-rotate-key-age
:秒数,若是获取到了新密钥多久更新一次页面加密
innodb-encryption-rotation-iop
:IOPS,最多容许用多少IOPS来作页面加密更新
innodb-encryption-threads
:线程数,用多少个后台线程来作页面加密更新日志
binlog加密选项:
encrypt-binlog
:on/off,是否加密binlog
其余加密选项:
encrypt_tmp_files
:on/off,是否加密临时文件
encrypt_tmp_disk_tables
:on/off,是否加密aria临时表
aria_encrypt_tables
:on/off,是否加密aria表(只对ROW_FORMAT=PAGE)
加密测试:
在/etc/my.cnf.d/server.conf中添加: plugin-load-add=file_key_management.so file_key_management_encryption_algorithm=aes_cbc file_key_management_filename = /etc/my.cnf.d/file_key_enc.txt file_key_management_filekey = file_key_encrypt_key innodb-encrypt-tables innodb-encrypt-log innodb-encryption-threads=4 encrypt-binlog encrypt_tmp_files encrypt_tmp_disk_tables aria_encrypt_tables 添加完成后重启MariaDB服务。
建立不加密的表:
create table unencrypt_t(id int, name varchar(32)) ENCRYPTED=NO
;
建立加密的表,指定密钥id为3:
create table encrypt_t(id int, name varchar(32)) ENCRYPTED=YES ENCRYPTION_KEY_ID=3
;
修改不加密的表为加密:
alter table unencrypt_t ENCRYPTED=YES ENCRYPTION_KEY_ID=3
;
修改加密的表为不加密:
alter table unencrypt_t ENCRYPTED=NO
;
插入数据:
insert into unencrypt_t(id, name) values(1, 'one'); insert into encrypt_t(id, name) values(1, 'one');
已加密的数据文件对比未加密的数据文件:
binlog加密:
加密开启后的主备同步:
开启加密后,主机和备机之间的binlog传输是不加密的,由备机在写relaylog/binlog/数据文件时进行加密。因此主备之间的密钥能够不一样,但id信息必须一致,不然建表语句在备机上没法执行成功,将会致使slave SQL线程停止。
加密和压缩: 数据加密和数据压缩能够同时使用,MariaDB先作数据压缩再作数据加密,能够节约很大的存储空间。