背景

万象的元数据存储中心 etcd集群并未开启登陆校验,理论上所有客户都可以在网络连通的情况下,获取和篡改etcd中的数据。即需要开启etcd的安全认证,对etcd的所有访问都需要一个用户名和密码进行操作。

场景

当客户要求etcd授权时,才需要进行操作。

注意

本次修改需要有手动维护操作,如果你的万象版本页面没有手动维护按钮的话,请升级到新版本后再进行授权。

影响

授权期间,万象暂时不管控 操作时间10分钟

授权步骤

1.开启手动维护状态

确保集群状态为正常

确保服务状态为可用

点击手动维护并确定 (⚠️:别点成主从切换了)

etcd 未授权漏洞修复 - 图1

检查是否成功开启手动维护

集群状态和服务状态均为手动维护状态

etcd 未授权漏洞修复 - 图2

2.查找任意一台可以操作的etcd节点 。进入etcd 容器内部

可以操作的判断标准

docker exec -it mysql-paas-etcd /bin/bash  #进入etcd容器

etcdctl   get --prefix /cluster 
# 上面或者下面这条语句可以执行成功 获取到数据即为可以操作的标准 。把ip 换成你的ip不是硬写 
# 端口是部署的时候yaml端口,或者查看容器配置,里面的端口
etcdctl --endpoints=ip:2379 get --prefix /cluster 

# 记住你可以操作成功的语法形式 也就是需不需要 '--endpoints=ip:2379',不需要时 ,下列有关etcd操作 便不需要加

3.创建etcd root用户 (在可以操作的etcd机器节点上,执行一次即可)

# ip 指本机ip
docker exec -it <etcd containerId> /bin/bash
etcdctl --endpoints=ip:2379 role add root # 输出Role root created 即位创建成功
etcdctl --endpoints=ip:2379 user add root:ntes_rds_etcd_kv_123    # 如果访问出现上下文超时的报错语句,删除'--endpoints=ip:2379'后重新执行即可
# 出现User root created 即为创建成功
etcdctl --endpoints=ip:2379 user grant-role  root root #输出 Role root is granted to user root  即为成功

4.开启etcd 认证

docker exec -it <etcd containerId> /bin/bash
etcdctl --endpoints=ip:2379 auth enable

# 校验 再次执行 
etcdctl --endpoints=ip:2379 get --prefix /cluster  
# 无法获取数据.

5.启动etcd认证的用户和密码(所有manager 容器)

docker exec -it <manager containerId> /bin/bash
cd /
vi startup.py
# startup.py 文件第三十行的
 ETCD_AUTH = environ("ETCD_AUTH", bool, True)
修改为
ETCD_AUTH = True
# 3.5 以上的版本使用   ETCD_AUTH = "true"

# 保存退出后。重启manager 容器

查看manager 是否在线。在线即成功。 (你的万象版本可能没有下列页面,那只需要刷新manager页面,可以看到集群信息也认为授权成功)

etcd 未授权漏洞修复 - 图3

如果有多个manager 重复执行即可

6.启动etcd认证的用户和密码 (所有node容器)

docker exec -it <node containerId> /bin/bash
cd /
vi startup.py
# startup.py 文件第59行的
 ETCD_AUTH = environ("ETCD_AUTH", bool, True)
修改为
ETCD_AUTH = True
# 3.5 以上的版本使用   ETCD_AUTH = "true"
# 保存退出文件后,在node容器内部执行下列语句
pgrep -f agent|xargs kill -9

查看页面 agent 在线即修改成功

etcd 未授权漏洞修复 - 图4

7.取消手动维护

取消手动维护状态

etcd 未授权漏洞修复 - 图5

等待3秒左右,刷新页面

检查集群状态正常

检查服务状态可用