MariaDB 加密特性及使用方法

版權聲明:本文由吳洪輝原創文章,轉載請註明出處: 
文章原文連接: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的加密特性

  • innodb表空間加密
  • innodb日誌加密
  • binlog加密
  • aria表加密
  • 臨時文件加密

加密特性的一些限制:測試

  1. 元數據文件(.frm)目前還沒有加密;
  2. 目前只有MariaDB server才能解密,mysqlbinlog工具還不支持解析加密後的binlog文件
  3. xtrabackup工具目前沒法備份/恢復使用了加密特性的MariaDB實例。
  4. 慢查詢日誌和錯誤日誌還沒有加密,裏面可能會包含原始數據。

二.使用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先作數據壓縮再作數據加密,能夠節約很大的存儲空間。

相關文章
相關標籤/搜索