锁定 swarm 以保护其加密密钥

默认情况下,swarm manager 使用的 Raft 日志在磁盘上加密。这个静止的 加密可保护您的服务配置和数据免受攻击者的攻击,这些攻击者会获得 访问加密的 Raft 日志。引入此功能的原因之一 支持 Docker 密钥功能。

当 Docker 重新启动时,用于加密 swarm 之间通信的 TLS 密钥 加载了 nodes 和用于加密和解密磁盘上 Raft 日志的密钥 添加到每个 Manager 节点的内存中。Docker 能够保护双向 TLS encryption key 和用于加密和解密静态 Raft 日志的密钥,由 允许您获得这些密钥的所有权,并要求手动解锁 你的经理。此功能称为自动锁定。

当 Docker 重新启动时,您必须先使用 密钥加密密钥。您可以 随时轮换此密钥加密密钥。

注意

当新节点加入 Swarm 时,您无需解锁 Swarm, ,因为密钥是通过双向 TLS 传播给它的。

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

初始化新的 swarm 时,可以使用该标志 在 Docker 重启时启用 Swarm Manager 节点的自动锁定。--autolock

$ 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。一个 locked 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.

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

要在现有 swarm 上启用自动锁定,请将标志设置为 。autolocktrue

$ 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.

要禁用自动锁定,请设置为 。双向 TLS 密钥和 用于读取和写入 Raft 日志的加密密钥以未加密的方式存储在 磁盘。在存储加密密钥的风险之间需要权衡 静态未加密以及重新启动 swarm 的便利性,而无需 需要解锁每个 Manager。--autolockfalse

$ docker swarm update --autolock=false

禁用自动锁定后,请将解锁密钥放在身边一小段时间,以防 当 Manager 仍配置为使用旧密钥锁定时,它会关闭。

解锁一个 swarm

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

$ docker swarm unlock

Please enter unlock key:

在以下情况下,输入生成并显示在命令输出中的加密密钥 您锁定了 Swarm 或旋转了密钥,Swarm 将解锁。

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

考虑这样一种情况:您的 Swarm 按预期运行,然后是管理器 节点变得不可用。您解决问题并带上物理 节点重新联机,但您需要通过提供解锁 key 读取加密的凭证和 Raft 日志。

如果该 key 在节点离开 swarm 后没有轮换,并且您有一个 Functional Manager 节点的 Quorum 中,您可以查看当前解锁 key 使用,不带任何参数。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.

如果在 swarm 节点变得不可用后轮换了密钥,并且您没有 有前一个 key 的记录,可能需要强制 manager 离开 swarm 并将其作为新 manager 加入 swarm。

旋转解锁密钥

您应该定期轮换锁定的 swarm 的解锁密钥。

$ 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.

警告

当您轮换解锁密钥时,请保留旧密钥的记录 周围几分钟,这样,如果 Manager 在获得新的 键,它可能仍会用旧的 键解锁。