MySQL 二进制日志文件和中继日志文件可以被加密,以保护这些文件和其中可能包含的敏感数据免受外部攻击者的滥用,并且也保护这些文件免受操作系统用户的未经授权的查看。用于文件的加密算法是 AES(高级加密标准)密码算法,该算法是 MySQL 服务器的内置组件,无法配置。
您可以通过将 binlog_encryption
系统变量设置为 ON
来启用此加密。默认值为 OFF
。该系统变量将加密应用于二进制日志文件和中继日志文件。二进制日志记录不需要在服务器上启用以启用加密,因此您可以在没有二进制日志的副本上加密中继日志文件。要使用加密,必须安装和配置密钥环组件或插件以提供 MySQL 服务器的密钥环服务。有关如何执行此操作的说明,请参阅 第 8.4.4 节,“MySQL 密钥环”。任何支持的密钥环组件或插件都可以用来存储二进制日志加密密钥。
当您首次启动服务器时,启用加密,新的二进制日志加密密钥将在二进制日志和中继日志初始化之前生成。该密钥用于加密每个二进制日志文件(如果服务器启用了二进制日志记录)和中继日志文件(如果服务器启用了复制通道)的文件密码,然后从文件密码生成的密钥用于加密文件中的数据。当前服务器上使用的二进制日志加密密钥称为二进制日志主密钥。两层加密密钥架构意味着二进制日志主密钥可以根据需要轮换(替换为新主密钥),并且只有文件密码需要重新加密,而不是整个文件。中继日志文件对于所有通道都是加密的,包括在激活加密后创建的新通道。二进制日志索引文件和中继日志索引文件从不加密。
如果您在服务器运行时激活加密,那么新的二进制日志加密密钥将在该时刻生成。唯一的例外情况是,如果服务器之前曾经激活过加密,然后又禁用了加密,那么之前使用的二进制日志加密密钥将再次使用。二进制日志文件和中继日志文件将立即轮换,文件密码将使用该二进制日志加密密钥加密。现有的二进制日志文件和中继日志文件仍然保留在服务器上,但您可以清除它们,如果它们不再需要。
如果您通过将 binlog_encryption
系统变量设置为 OFF
来停用加密,那么二进制日志文件和中继日志文件将立即轮换,所有后续日志记录将不加密。之前加密的文件不会自动解密,但服务器仍然可以读取它们。BINLOG_ENCRYPTION_ADMIN
权限是激活或停用加密时所需的。
加密和未加密的二进制日志文件可以使用文件头部的魔数字来区分,用于加密日志文件的魔数字为 0xFD62696E
,而用于未加密日志文件的魔数字为 0xFE62696E
。 SHOW BINARY LOGS
语句将显示每个二进制日志文件是否加密。
当二进制日志文件被加密时,mysqlbinlog 无法直接读取它们,但可以使用 --read-from-remote-server
选项从服务器读取。如果使用 mysqlbinlog 备份加密的二进制日志文件,请注意使用 mysqlbinlog 生成的文件副本将以未加密的格式存储。
二进制日志加密可以与二进制日志事务压缩结合使用。有关二进制日志事务压缩的更多信息,请参阅 第 7.4.4.5 节,“二进制日志事务压缩”。