0、导读
看到这个问题,是不是觉得很奇怪?
为啥要锁定swarm集群呢?
你一听就明白了,在swarm集群中,raft log存储的是加密的数据,主要是secret相关的数据,raft log数据在集群的manager节点之间进行传送,传送的时候,是加密的,就是通过节点的key(密钥)进行加密、解密,同时,在使用raft log中的数据的时候,解密,也是通过swarm node key来完成的。
那,如果这些key要是泄漏了呢,所以,锁定swarm集群就是对这个node key进行加密。
避免这个key被泄露。
原理是这样的,事实到底是什么······
1、示例
实验的环境是一个已经搭建好的swarm集群,未开启锁定。
(1)查看密钥
[root@nccztsjb-node-01 certificates]# pwd /var/lib/docker/swarm/certificates [root@nccztsjb-node-01 certificates]# ls -l total 12 -rw-r--r-- 1 root root 826 Oct 14 11:58 swarm-node.crt -rw------- 1 root root 319 Oct 14 12:00 swarm-node.key -rw-r--r-- 1 root root 554 Sep 6 15:44 swarm-root-ca.crt [root@nccztsjb-node-01 certificates]#
查看swarm-node.key这个节点密钥
[root@nccztsjb-node-01 certificates]# cat swarm-node.key -----BEGIN PRIVATE KEY----- kek-version: 3663 raft-dek: EiCa16W7GEUAwmUWgrEF2Pq2DCxcAAqt7UJA9ov0RJZ7+w== MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgtf7W1vTiH2FsobXq 5UlnsucjwQJPq99fo0RGSIP30POhRANCAAQ9ksqe9OuJxcJmvqO9Sb32YLLxEBQs PxFXDFIVqD5JnEoJ6jDSff2u4iKX9yeUU7K7LEvsa678ALnQfjDmWZ0T -----END PRIVATE KEY----- [root@nccztsjb-node-01 certificates]#
密钥未经过加密处理。
(2)锁定集群
docker swarm update --autolock=true
[root@nccztsjb-node-01 certificates]# 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-ow5f4fAPyDzpuK6+nO87XJRQ8IV24mwYWSFXesAbf+E Please remember to store this key in a password manager, since without it you will not be able to restart the manager. [root@nccztsjb-node-01 certificates]#
这个是什么意思呢?意思是说,现在集群已经锁定了,如果要重启的话,必须输入下面的key才能够进行解密。
更加严重的是,必须要妥善保管这个key,否则无法启动manager。
(3)再看swarm集群密钥
BEGIN ENCRYPTED PRIVATE KEY,即加密的私钥
[root@nccztsjb-node-01 certificates]# cat swarm-node.key -----BEGIN ENCRYPTED PRIVATE KEY----- kek-version: 3664 raft-dek: CAESMLR6Mi+jx7HjSRi5ysTBmSJntJnXj5XcSdYjeaRWYW46uZer0ZmE0Dr0nwjn5uXTCRoYxh0zhPB/6tMvCn4EGWxH6sxHfT7spqFt MIHeMEkGCSqGSIb3DQEFDTA8MBsGCSqGSIb3DQEFDDAOBAgupvgmBlLdJgICCAAw HQYJYIZIAWUDBAEqBBCT8a1poeUOnKXU8BedH0BGBIGQekAKzXwoxXM5DzCAahaN QopVuZgiOvUYp99LPQns5tiFV3Wo9y53EdQUP1k+IRky/07uiTzoc/TnKgOz02T3 C94JhprXLJ0nZNp+eiJQ0Wec8F8q8fmdRLw1tpUczWRWMskd3CL7OUfi2TivrV7s YIGBHfgiMbfu9fdvFI1HUrG2r8GlRytPq/MbYQuxNngC -----END ENCRYPTED PRIVATE KEY----- [root@nccztsjb-node-01 certificates]#
这样,这个私钥就被加密了,也就是说,无法通过窃取这个key来解密raft log了。
(4)重启docker
ok ,既然上面说了重启需要key,我们试试
重启docker
systemctl restart docker
查看service
[root@nccztsjb-node-01 certificates]# docker service ls Error response from daemon: Swarm is encrypted and needs to be unlocked before it can be used. Please use "docker swarm unlock" to unlock it. [root@nccztsjb-node-01 certificates]#
果然,重启后,swarm集群被锁定了,无法访问了。
(5)解锁swarm集群
输入key进行解锁
[root@nccztsjb-node-01 certificates]# docker swarm unlock Please enter unlock key: [root@nccztsjb-node-01 certificates]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS p5a8ef3pna87 nginx_sec replicated 1/1 172.20.58.152/middleware/nginx:1.21.4 [root@nccztsjb-node-01 certificates]#
swarm集群已经解锁。
(6)更新swarm集群为不自动锁定
docker swarm update --autolock=false
[root@nccztsjb-node-01 certificates]# docker swarm update --autolock=false Swarm updated. [root@nccztsjb-node-01 certificates]#
(7)查看密钥
key变为非加密的了。
[root@nccztsjb-node-01 certificates]# cat swarm-node.key -----BEGIN PRIVATE KEY----- kek-version: 3675 raft-dek: EiDbu3N2vDWX6rcO/qk0yksqtoxuOpLwqHUvwhSsQEzlKA== MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgfw2GHEV/OdAwtZou +Oi24oBh3HF3XimKTVfxTURWtYihRANCAATkKqPLbLxsdCVmHLFYeQ7A1vZ578y9 Qb+lrPyHAfQcz1L1iKKakgeSxCqheLJluJms9Z600q9z5Tyo1gR9bXIq -----END PRIVATE KEY----- [root@nccztsjb-node-01 certificates]#
2、初始化swarm集群是如何开启自动锁定
docker swarm init --autolock
3、总结
锁定集群的目的:对集群私钥进行加密。
重启之后,由于需要和manager进行通讯,自然需要密钥。所以,需要输入key.
docker重启时:
用于加密群节点之间通信的TLS密钥和用于加密和解密磁盘上Raft日志的密钥都被加载到每个管理节点的内存中。
Docker能够保护相互TLS加密密钥和用于加密和解密Raft日志的密钥,允许您获得这些密钥的所有权,并要求手动解锁管理器。这个特性被称为自动锁定。
手动解锁的目的:获取这个密钥的所有权。否则,无法加载到内存中,或者说,无法使用。
标签:node,01,swarm,集群,key,certificates,锁定,root From: https://www.cnblogs.com/chuanzhang053/p/16791410.html