MySQL 中的加密:主密钥轮换

期待新课程开始招生 “数据库” 我们将继续发布一系列关于 MySQL 加密的文章。

在本系列的上一篇文章中,我们讨论了 主密钥加密的工作原理. 今天,我们根据前面了解的知识,来看一下主要按键的轮换。

主密钥轮换涉及生成一个新的主密钥并使用这个新密钥重新加密表空间密钥(存储在表空间头中)。

让我们回忆一下加密表空间的表头是什么样的:

MySQL 中的加密:主密钥轮换

从上一篇文章我们知道,服务器在启动时会读取所有加密表空间的表头,并记住最大的KEY ID。 例如,如果我们有三个带有 KEY 的表ID = 3 和一张带 KEY 的表ID = 4,则最大密钥 ID 将为 4。我们称此 KEY ID - MAX KEY ID。

主密钥轮换的工作原理

1.用户执行ALTER INNODB MASTER KEY。

2、服务端请求keyring用服务端UUID和KEY生成新的master keyID等于一加MAXKEYID。 所以我们得到等于 INNODB 的主密钥 id密钥-UUID-(MAXKEYID + 1). 成功生成主密钥后,MAX KEY ID 加一(即 MAXKEYID=最大KEY身份证+1)。

3. 服务器扫描所有用主密钥加密的表空间,对于每个表空间:

  • 用新的主密钥加密表空间密钥;

  • 将密钥 ID 更新为新的 MAXKEY身份证;

  • 如果 UUID 与服务器 UUID 不同,则更新服务器 UUID。

我们知道,用于解密表的主密钥 ID 由一个 UUID 和一个从表空间头中读取的 KEY ID 组成。 我们现在正在做的是更新表空间加密标头中的此信息,以便服务器收到正确的主密钥。

如果我们有来自不同位置的表空间,例如不同的备份,那么它们可能使用不同的主密钥。 当服务器启动时,所有这些主密钥都需要从存储库中检索。 这会减慢服务器启动速度,尤其是在使用服务器端密钥库时。 通过主密钥轮换,我们使用对所有表空间都相同的单个主密钥重新加密表空间密钥。 服务器现在应该在启动时只收到一个主密钥。

当然,这只是一个令人愉快的副作用。 主密钥轮换的主要目的是让我们的服务器更安全。 如果主密钥以某种方式从保险库中被盗(例如,从保险库服务器),则可以生成一个新的主密钥并重新加密表空间密钥,从而使被盗密钥无效。 我们安全了……差不多了。

在之前的文章中,我谈到了一旦表空间密钥被盗,第三方可以使用它来解密数据。 前提是可以访问我们的磁盘。 如果主密钥被盗而您可以访问加密数据,您可以使用被盗的主密钥解密表空间密钥并获得解密数据。 如您所见,主密钥的轮换在这种情况下无济于事。 我们使用新的主密钥重新加密表空间密钥,但用于加密/解密数据的实际密钥保持不变。 因此,“黑客”可以继续利用它来解密数据。 早些时候我暗示过 用于 MySQL 的 Percona 服务器 可以执行真正的表空间重新加密,而不仅仅是简单的表空间密钥重新加密。 此功能称为加密线程。 但是,此功能目前仍处于试验阶段。

当主密钥被盗时,主密钥轮换很有用,但攻击者无法使用它来解密表空间密钥。

注册免费演示课程。

阅读更多:

来源: habr.com