如何锁定swarm集群?

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、查看解密密钥

 

docker swarm unlock-key

 

[root@nccztsjb-node-01 certificates]# 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-0Y/facFe3ukCn7Jd64NPbsRA+ucJsWssz139U6wPEGw

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]# 

 

4、更新解密密钥

 

为了最大化密钥安全,需要对key进行定期的更新,更新命令如下:

[root@nccztsjb-node-01 certificates]# 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-lDBojWHcXpAgixcGaJVEnjlmZXAGJHgVFSDzkRtZmhQ

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]# 

5、总结

 

锁定集群的目的:对集群私钥进行加密。

 

重启之后,由于需要和manager进行通讯,自然需要密钥。所以,需要输入key.

 

docker重启时:

用于加密群节点之间通信的TLS密钥和用于加密和解密磁盘上Raft日志的密钥都被加载到每个管理节点的内存中。

 

Docker能够保护相互TLS加密密钥和用于加密和解密Raft日志的密钥,允许您获得这些密钥的所有权,并要求手动解锁管理器。这个特性被称为自动锁定。

 

手动解锁的目的:获取这个密钥的所有权。否则,无法加载到内存中,或者说,无法使用。

 

6、警告

 

当更新解锁密钥时,记录下旧密钥几分钟,这样如果一个管理节点在得到新的密钥之前宕掉了,它仍然可以用旧密钥进行解锁。

posted @ 2022-10-14 13:55  Zhai_David  阅读(106)  评论(0编辑  收藏  举报