• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 加密二进制日志文件和中继日志文件

    从MySQL 8.0.14开始,可以对二进制日志文件和中继日志文件进行加密,从而有助于保护这些文件以及其中包含的潜在敏感数据,使其免受外部攻击者的滥用,并防止未经授权的用户参见其所在的操作系统被存储。用于文件的加密算法AES(高级加密标准)密码算法内置于MySQL Server中,无法配置。

    通过将binlog_encryption系统变量设置为,可以在MySQL服务器上启用此加密ONOFF是默认值。系统变量为二进制日志文件和中继日志文件设置加密功能。无需在服务器上启用二进制日志记录即可启用加密,因此您可以在没有二进制日志的从站上对中继日志文件进行加密。要使用加密,必须安装并配置密钥环插件以提供MySQL Server的密钥环服务。有关执行此操作的说明,请参见“ MySQL密钥环”。任何受支持的密钥环插件均可用于存储二进制日志加密密钥。

    首次启动启用了加密的服务器时,将在初始化二进制日志和中继日志之前生成一个新的二进制日志加密密钥。此密钥用于为每个二进制日志文件(如果服务器启用了二进制日志记录)和中继日志文件(如果服务器具有复制通道)加密文件密码,并且从文件密码生成的其他密钥用于加密数据在文件中。服务器上当前正在使用的二进制日志加密密钥称为二进制日志主密钥。两层加密密钥体系结构意味着可以根据需要旋转二进制日志主密钥(用新的主密钥替换),并且只需要使用新的主密钥重新加密每个文件的文件密码,而不是整个密钥文件。中继日志文件对所有通道都进行了加密,包括在激活加密后创建的新通道。二进制日志索引文件和中继日志索引文件从不加密。

    如果在服务器运行时激活加密,则此时将生成一个新的二进制日志加密密钥。例外是,如果加密先前在服务器上处于活动状态,然后又被禁用,则在这种情况下,将再次使用之前使用的二进制日志加密密钥。立即旋转二进制日志文件和中继日志文件,并使用此二进制日志加密密钥对新文件以及所有后续二进制日志文件和中继日志文件的文件密码进行加密。服务器上仍然存在的现有二进制日志文件和中继日志文件未加密,但是如果不再需要它们,则可以清除它们。

    如果通过将binlog_encryption系统变量更改为来停用加密OFF,则二进制日志文件和中继日志文件将立即旋转,并且所有后续日志记录均未加密。先前加密的文件不会自动解密,但是服务器仍然可以读取它们。该BINLOG_ENCRYPTION_ADMIN服务器运行时权限才能启动或禁用加密。

    可以使用加密日志文件(0xFD62696E)的文件头开头的魔术数字来区分加密和未加密的二进制日志文件,该数字与未加密日志文件(0xFE62696E)的魔术数字不同。该SHOW BINARY LOGS语句显示每个二进制日志文件是加密的还是未加密的。

    二进制日志文件被加密后,mysqlbinlog无法直接读取它们,但是可以使用该--read-from-remote-server选项从服务器读取它们。从MySQL 8.0.14开始,如果您尝试直接读取加密的二进制日志文件,则mysqlbinlog返回一个适当的错误,但是较早版本的mysqlbinlog根本不将该文件识别为二进制日志文件。如果使用mysqlbinlog备份加密的二进制日志文件,请注意,使用mysqlbinlog生成的文件副本以未加密的格式存储。

    二进制日志加密的范围

    当MySQL服务器实例的二进制日志加密处于活动状态时,加密范围如下:

    • 使用上述两层加密体系结构,从开始加密的时间点开始,加密写入二进制日志文件和中继日志文件的静态数据。开始加密时服务器上存在的现有二进制日志文件和中继日志文件未加密。您可以清除不再需要的文件。
    • 复制事件流中发送到MySQL客户端(包括mysqlbinlog)的运动中的数据将被解密以进行传输,因此在传输过程中应通过使用连接加密进行保护(请参见“使用加密的连接”和)。 1,“将复制设置为使用加密的连接”)。
    • 在事务期间在二进制日志事务和语句缓存中保存的使用中的数据以未加密的格式存储在存储缓存的内存缓冲区中。如果数据超过了内存缓冲区中的可用空间,则会将其写入磁盘上的临时文件。从MySQL 8.0.17开始,当服务器上的二进制日志加密处于活动状态时,用于保存二进制日志缓存的临时文件将使用AES-CTR(AES计数器模式)进行流加密。由于临时文件是易失性的,并且绑定到单个进程,因此它们使用单层加密进行加密,使用随机生成的文件密码和初始化向量,这些密码和初始化向量仅存在于内存中,而从未存储在磁盘或密钥环中。提交每个事务后,将重置二进制日志缓存:清除内存缓冲区,截断用于保存二进制日志缓存的任何临时文件,并随机生成一个新的文件密码和初始化向量,以用于下一个事务。在正常关闭或意外停止后重新启动服务器时,也会发生此重置。并随机生成一个新的文件密码和初始化向量,以用于下一个事务。在正常关闭或意外停止后重新启动服务器时,也会发生此重置。并随机生成一个新的文件密码和初始化向量,以用于下一个事务。在正常关闭或意外停止后重新启动服务器时,也会发生此重置。
    注意

    如果你使用LOAD DATA的时候binlog_format=STATEMENT设置,作为语句被认为是不安全的基于语句复制不建议这样做,对将更改应用于复制从创建一个包含数据的临时文件。当服务器上的二进制日志加密处于活动状态时,不会对这些临时文件进行加密。请改用基于行或混合的二进制日志记录格式,该格式不会创建临时文件。

    二进制日志加密密钥

    用于加密日志文件的文件密码的二进制日志加密密钥是256位密钥,这些密钥是使用MySQL Server的密钥环服务专门为每个MySQL服务器实例生成的(请参见“ MySQL密钥环”)。密钥环服务处理二进制日志加密密钥的创建,检索和删除。服务器实例仅创建和删除为其自身生成的密钥,但是如果它们已存储在密钥环中,则它可以读取为其他实例生成的密钥,就像服务器实例已通过文件复制克隆的情况一样。

    重要

    备份和恢复过程中必须包含MySQL服务器实例的二进制日志加密密钥,因为如果解密当前和保留的二进制日志文件或中继日志文件的文件密码所需的密钥丢失了,则可能无法启动服务器。

    密钥环中二进制日志加密密钥的格式如下:

    MySQLReplicationKey_{UUID}_{SEQ_NO}
    

    例如:

    MySQLReplicationKey_00508583-b5ce-11e8-a6a5-0010e0734796_1
    

    {UUID}是MySQL服务器生成的真实UUID(server_uuid系统变量的值)。{SEQ_NO}是二进制日志加密密钥的序列号,对于服务器上生成的每个新密钥,该序列号将递增1。

    服务器上当前正在使用的二进制日志加密密钥称为二进制日志主密钥。当前二进制日志主密钥的序列号存储在密钥环中。二进制日志主密钥用于加密每个新日志文件的文件密码,这是随机生成的特定于用于加密文件数据的日志文件的32字节文件密码。使用256位二进制日志加密密钥和随机初始化向量(IV)使用AES-CBC(AES密码块链接模式)对文件密码进行加密,并将其存储在日志文件的文件头中。使用从文件密码生成的256位密钥和从文件密码生成的随机数,使用AES-CTR(AES计数器模式)对文件数据进行加密。如果已知用于加密文件密码的二进制日志加密密钥,则使用OpenSSL加密工具包中提供的工具,从技术上讲,可以脱机解密加密的文件。

    如果您使用文件复制来克隆具有加密功能的MySQL服务器实例,从而对其二进制日志文件和中继日志文件进行加密,请确保还复制了密钥环,以便克隆服务器可以从源中读取二进制日志加密密钥。服务器。在克隆服务器上(在启动时或在启动时)激活加密时,克隆服务器会识别出与复制文件一起使用的二进制日志加密密钥包括源服务器生成的UUID。它使用自己生成的UUID自动生成新的二进制日志加密密钥,并使用它来加密后续二进制日志文件和中继日志文件的文件密码。继续使用源服务器读取复制的文件


    Binary Log主密钥旋转

    启用二进制日志加密后,您可以在服务器运行时随时通过发出旋转二进制日志主密钥ALTER INSTANCE ROTATE BINLOG MASTER KEY。使用此语句手动旋转二进制日志主密钥时,将使用新的二进制日志主密钥对新文件和后续文件的密码进行加密,并对现有加密二进制日志文件和中继日志文件的文件密码也进行重新加密使用新的二进制日志主密钥,因此加密将完全更新。您可以定期旋转二进制日志主密钥以符合组织的安全策略,并且还可以怀疑当前或任何先前的二进制日志主密钥已受到破坏。

    手动旋转二进制日志主密钥时,MySQL Server会依次执行以下操作:

    1. 将使用下一个可用的序列号生成新的二进制日志加密密钥,并将其存储在密钥环上,并用作新的二进制日志主密钥。
    2. 二进制日志和中继日志文件在所有通道上轮换。
    3. 新的二进制日志主密钥用于加密新的二进制日志和中继日志文件以及后续文件的文件密码,直到再次更改密钥为止。
    4. 服务器上现有的加密二进制日志文件和中继日志文件的文件密码使用最新的二进制日志主密钥依次重新加密。跳过所有未加密的文件。
    5. 从密钥环中删除了重新加密过程之后不再用于任何文件的二进制日志加密密钥。

    BINLOG_ENCRYPTION_ADMIN权限才能问题ALTER INSTANCE ROTATE BINLOG MASTER KEY,如果不能用的说法binlog_encryption系统变量设置为OFF

    作为二进制日志主密钥轮换过程的最后一步,将从密钥环中清除不再适用于任何保留的二进制日志文件或中继日志文件的所有二进制日志加密密钥。如果无法初始化保留的二进制日志文件或中继日志文件以进行重新加密,则不会删除相关的二进制日志加密密钥,以防将来可以恢复该文件。例如,如果二进制日志索引文件中列出的文件当前不可读,或者通道无法初始化,则可能是这种情况。如果服务器UUID发生更改(例如,由于使用MySQL Enterprise Backup创建的备份用于设置新的复制从属),则发出ALTER INSTANCE ROTATE BINLOG MASTER KEY新服务器上的服务器不会删除任何包含原始服务器UUID的早期二进制日志加密密钥。

    如果二进制日志主密钥旋转过程的前四个步骤中的任何一个步骤不能正确完成,则会发出错误消息,说明二进制日志文件和中继日志文件的加密状态及其后果。以前加密的文件始终处于加密状态,但是它们的文件密码仍然可以使用旧的二进制日志主密钥进行加密。如果看到这些错误,请首先通过ALTER INSTANCE ROTATE BINLOG MASTER KEY再次发行来重试该过程。然后调查单个文件的状态,以参见阻止该进程的原因,尤其是如果您怀疑当前或任何先前的二进制日志主密钥可能已被破坏。

    如果二进制日志主密钥旋转过程的最后一步无法正确完成,则会发出警告消息来说明情况。该警告消息标识该进程是否无法清除用于旋转二进制日志主密钥的密钥环中的辅助密钥,或者无法清除未使用的二进制日志加密密钥。您可以选择忽略消息,因为这些键是辅助键或不再使用,或者您可以ALTER INSTANCE ROTATE BINLOG MASTER KEY再次发出以重试该过程。

    如果服务器停止并ON在二进制日志主密钥旋转过程中仍设置为二进制日志加密的情况下重新启动,则使用新的二进制日志主密钥对重启后的新二进制日志文件和中继日志文件进行加密。但是,现有文件的重新加密不会继续,因此在服务器停止之前未重新加密的文件将使用以前的二进制日志主密钥保留加密状态。要完成重新加密并清除未使用的二进制日志加密密钥,请ALTER INSTANCE ROTATE BINLOG MASTER KEY在重新启动后再次发出。

    ALTER INSTANCE ROTATE BINLOG MASTER KEY操作不会写入二进制日志,也不会在复制从站上执行。因此,可以在包括多种MySQL版本的复制环境中执行二进制日志主密钥旋转。要在所有适用的主服务器和从服务器上安排二进制日志主密钥的定期轮换,可以在每台服务器上启用MySQL Event Scheduler并ALTER INSTANCE ROTATE BINLOG MASTER KEY使用以下命令发出语句CREATE EVENT声明。如果由于怀疑当前或任何先前的二进制日志主密钥已被泄露而旋转二进制日志主密钥,请在每个适用的主服务器和从属服务器上发出该语句。在单个服务器上发布该语句可确保您可以立即验证遵从性,即使从属服务器落后,属于多个复制拓扑或当前在复制拓扑中不活动但具有二进制日志和中继日志文件的从属也是如此。

    所述binlog_rotate_encryption_master_key_at_startup系统变量控制是否被重新启动服务器时二进制日志主密钥自动旋转。如果将此系统变量设置为ON,则每当服务器重新启动时,都会生成一个新的二进制日志加密密钥并将其用作新的二进制日志主密钥。如果设置为OFF,这是默认设置,重新启动后将再次使用现有的二进制日志主密钥。在启动时旋转二进制日志主密钥时,将使用新密钥对新二进制日志和中继日志文件的文件密码进行加密。现有加密的二进制日志文件和中继日志文件的文件密码不会重新加密,因此它们将使用旧密钥(在密钥环上仍然可用)进行加密。