锁定群以保护其加密密钥

预计阅读时间:5分钟

群集管理器使用的Raft日志默认情况下在磁盘上加密。这种静态加密可保护您的服务配置和数据免遭攻击者的攻击,这些攻击者可以访问加密的Raft日志。引入此功能的原因之一是对Docker机密功能的支持。

当Docker重新启动时,用于加密群节点之间通信的TLS密钥以及用于加密和解密磁盘上Raft日志的密钥都被加载到每个管理器节点的内存中。Docker可以保护相互的TLS加密密钥以及用于静态加密和解密Raft日志的密钥,方法是允许您获得这些密钥的所有权并要求对管理器进行手动解锁。此功能称为自动锁定

当Docker重新启动时,您必须 首先使用由Swarm锁定时Docker生成的密钥加密密钥解锁Swarm。您可以随时旋转此密钥加密密钥。

注意:当新节点加入群集时,您无需解锁群集,因为密钥是通过相互TLS传播到群集的。

在启用自动锁定的情况下初始化群组

初始化新的群集时,可以使用该--autolock标志在Docker重新启动时启用群集管理器节点的自动锁定。

$ docker swarm init --autolock

Swarm initialized: current node (k1q27tfyx9rncpixhk69sa61v) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-0j52ln6hxjpxk2wgk917abcnxywj3xed0y8vi1e5m9t3uttrtu-7bnxvvlz2mrcpfonjuztmtts9 \
    172.31.46.109:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:

    SWMKEY-1-WuYH/IX284+lRcXuoVf38viIDK3HJEKY13MIHX+tTt8

将密钥存储在安全的地方,例如密码管理器中。

Docker重新启动时,您需要解锁swarm。当您尝试启动或重新启动服务时,锁定的群组会导致类似以下的错误:

$ sudo service docker restart

$ docker service ls

Error response from daemon: Swarm is encrypted and needs to be unlocked before it can be used. Use "docker swarm unlock" to unlock it.

在现有群组上启用或禁用自动锁定

要在现有群上启用自动锁定,请将autolock标志设置为true

$ docker swarm update --autolock=true

Swarm updated.
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:

    SWMKEY-1-+MrE8NgAyKj5r3NcR4FiQMdgu+7W72urH0EZeSmP/0Y

Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.

要禁用自动锁定,请设置--autolockfalse。用于读取和写入Raft日志的双向TLS密钥和加密密钥未加密地存储在磁盘上。在存储静态未加密的加密密钥的风险与无需解锁每个管理器的情况下重新启动群集的便利性之间要权衡取舍。

$ docker swarm update --autolock=false

禁用自动锁定后,请在短时间内保持解锁键,以防管理器在仍配置为使用旧键进行锁定的同时关闭。

解锁一群

要解锁锁定的群组,请使用docker swarm unlock

$ docker swarm unlock

Please enter unlock key:

输入锁定群或旋转密钥后生成的加密密钥,该密钥显示在命令输出中,并且群解锁。

查看正在运行的群组的当前解锁密钥

考虑一下您的集群正在按预期运行的情况,然后管理器节点变得不可用。您可以对问题进行故障排除并使物理节点重新联机,但是您需要通过提供解锁密钥以读取加密的凭据和Raft日志来解锁管理器。

如果自从节点离开群集以来尚未旋转密钥,并且群集中具有功能管理器节点的法定人数,则可以使用docker swarm unlock-key不带任何参数的方式查看当前的解锁密钥。

$ docker swarm unlock-key

To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:

    SWMKEY-1-8jDgbUNlJtUe5P/lcr9IXGVxqZpZUXPzd+qzcGp4ZYA

Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.

如果在群集节点不可用之后旋转了密钥,并且您没有上一个密钥的记录,则可能需要强制管理器离开群集,并以新管理员的身份将其重新加入群集。

旋转解锁键

您应该定期旋转锁定的群组的解锁密钥。

$ docker swarm unlock-key --rotate

Successfully rotated manager unlock key.

To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:

    SWMKEY-1-8jDgbUNlJtUe5P/lcr9IXGVxqZpZUXPzd+qzcGp4ZYA

Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.

警告:旋转解锁密钥时,请在几分钟内保留旧密钥的记录,这样,如果经理在获得新密钥之前就掉下来了,则仍可以用旧密钥将其解锁。

经理解锁自动锁加密