当前位置: 首页 > news >正文

ETCD未授权访问风险基于角色认证和启用https的ca证书修复方案

在这里插入图片描述

ETCD未授权访问风险安全漏洞修复方案

  • ETCD未授权访问风险介绍
  • 基于角色认证的访问控制(BASIC认证)
  • 基于ca证书的https访问控制(TLS传输)
    • 下载cfssl认证配置工具
    • 生成ca认证证书
    • 修改etcd配置
      • 方式一
      • 方式二
    • 访问etcd节点信息
  • patroni使用配置调整
  • 参考链接

ETCD未授权访问风险介绍

未授权访问可能产生的风险为攻击者可以从ETCD中拿到节点的注册信息

http://IP:2379/v2/keys
http://IP:2379/v2/keys/?recursive=true

常规修复方案有以下两种:

  • 方案一:基于角色认证的访问控制(BASIC认证)
  • 方案二:基于ca证书的https访问控制(TLS传输)

简单点理解:
方案一就是添加用户密码认证,后续访问需要用户密码才能正常访问
方案二就是使用ca证书,将原先的http通信改成https,后续访问需要使用证书才能正常访问

备注:基于角色认证和ca证书的访问控制支持同时配置

基于角色认证的访问控制(BASIC认证)

# 创建测试数据
etcdctl set /testkey testvalue
# 可直接查看测试数据
etcdctl ls
etcdctl get testkey

image.png

# 创建root用户(etcd V2客户端版本输入密码间期时间很短,且只输入一次)
etcdctl user add root
# 启用认证
etcdctl auth enable

image.png
此处测试我们把root用户密码设置为root

# 开启 Basic Auth 默认会启用拥有所有权限的两个角色 root 和 guest ,并默认用 guest 角色进行的操作,不能删除,得收回 guest 的权限进行限制
etcdctl --username root:password role revoke guest --path '/*' --rw
# 检查 guest 角色权限
etcdctl --username root:password role get guest

image.png

# 再次查看测试数据失败,需要加上用户密码才能正常查看
etcdctl --username root:password get testkey

image.png

至此基于角色认证的访问控制配置结束,还是比较简单的。

基于ca证书的https访问控制(TLS传输)

下载cfssl认证配置工具

cfssl认证配置工具下载网址:https://github.com/cloudflare/cfssl
屏幕快照 20240616 17.41.45.png

若github网站打不开或下载太慢可关注公众号「 钥道不止 」并于后台回复关键字: cfssl 获取X86和ARM架构版本的工具

# X86 版本
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

授予可执行权限并加入bin目录

chmod +x cfssl*
cp -v cfssl_linux-amd64 /usr/local/bin/cfssl
cp -v cfssljson_linux-amd64 /usr/local/bin/cfssljson
cp -v cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
ls /usr/local/bin/cfssl*

生成ca认证证书

有多个节点,ca证书的生成在任意节点上操作即可

mkdir -p /etc/etcd/etcdSSL
cd /etc/etcd/etcdSSL

1)、创建 CA 配置文件(ca-config.json),可配置证书有效期(100年)
vi ca-config.json

{"signing": {"default": {"expiry": "876000h"},"profiles": {"etcd": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "876000h"}}}
}

字段说明:

  • ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;此处只定义一个etcd通用认证的profile
  • signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
  • server auth:表示client可以用该CA对server提供的证书进行验证
  • client auth:表示server可以用该CA对client提供的证书进行验证

2)、创建 CA 证书签名请求文件(ca-csr.json)
vi ca-csr.json

{"CN": "etcd","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "shenzhen","L": "shenzhen","O": "etcd","OU": "System"}]
}

字段说明:

  • CN:Common Name,etcd 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法
  • O:Organization,etcd 从证书中提取该字段作为请求用户所属的组 (Group)

3)、生成 CA 证书和私钥(ca-key.pem ca.pem)

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

4)、创建 etcd 证书签名请求(修改配置节点的IP)文件(etcd-csr.json)
vi etcd-csr.json

{"CN": "etcd","hosts": ["127.0.0.1","192.168.56.101","192.168.56.102","192.168.56.103"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "shenzhen","L": "shenzhen","O": "etcd","OU": "System"}]
}

5)、生成 etcd 证书和私钥(etcd-key.pem etcd.pem)

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd

将生成的证书文件拷贝至其他节点:

scp /etc/etcd/etcdSSL/*.pem 192.168.56.102:/etc/etcd/etcdSSL/
scp /etc/etcd/etcdSSL/*.pem 192.168.56.103:/etc/etcd/etcdSSL/

修改etcd配置

从官网的说明介绍可以看到这里有两种配置方式:用 --config-file 指定配置文件路径 或 用ETCD_CONFIG_FILE环境变量
https://etcd.io/docs/v3.5/op-guide/configuration/
屏幕快照 20240616 18.10.34.png

方式一

配置 etcd 的 service 服务文件(修改3个节点IP、–name配置)

[root@dba01 ~]# vi /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target network-online.target
Wants=network-online.target[Service]
Type=notify
# Environment="ETCD_UNSUPPORTED_ARCH=arm64"  #Just for ARM
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
# set GOMAXPROCS to number of processors
ExecStart=/usr/bin/etcd \--name etcd01 \--data-dir=/etc/etcd/etcd01 \--initial-advertise-peer-urls https://192.168.56.101:2380 \--listen-peer-urls https://192.168.56.101:2380 \--listen-client-urls https://192.168.56.101:2379,http://127.0.0.1:2379 \--advertise-client-urls https://192.168.56.101:2379 \--initial-cluster-token etcd-cluster \--initial-cluster etcd01=https://192.168.56.101:2380,etcd02=https://192.168.56.102:2380,etcd03=https://192.168.56.103:2380 \--initial-cluster-state new \--cert-file=/etc/etcd/etcdSSL/etcd.pem \--key-file=/etc/etcd/etcdSSL/etcd-key.pem \--peer-cert-file=/etc/etcd/etcdSSL/etcd.pem \--peer-key-file=/etc/etcd/etcdSSL/etcd-key.pem \--trusted-ca-file=/etc/etcd/etcdSSL/ca.pem \--peer-trusted-ca-file=/etc/etcd/etcdSSL/ca.pemRestart=on-failure
LimitNOFILE=65536[Install]
WantedBy=multi-user.target

方式二

配置 etcd 的 service 服务文件,采用 --config-file所有参数配置都从配置文件里读取

[root@dba01 ~]# vi /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target network-online.target
Wants=network-online.target[Service]
Type=notify
# Environment="ETCD_UNSUPPORTED_ARCH=arm64"  #Just for ARM
ExecStart=/usr/bin/etcd --config-file /etc/etcd/etcd.confRestart=on-failure
LimitNOFILE=65536[Install]
WantedBy=multi-user.target

在etcd原配置基础上追加如下ca证书配置并调整网络协议http为https

[root@dba01]# cat /etc/etcd/etcd.conf
name: etcd01
data-dir: /etc/etcd/etcd01
initial-advertise-peer-urls: https://192.168.56.101:2380
listen-peer-urls: https://192.168.56.101:2380
listen-client-urls: https://192.168.56.101:2379,http://127.0.0.1:2379
advertise-client-urls: https://192.168.56.101:2379
initial-cluster-token: dcs-cluster
initial-cluster: etcd01=https://192.168.56.101:2380,etcd02=https://192.168.56.102:2380,etcd03=https://192.168.56.103:2380
enable-v2: true
initial-cluster-state: new#[Security]
client-transport-security:cert-file: /etc/etcd/etcdSSL/etcd.pemkey-file: /etc/etcd/etcdSSL/etcd-key.pemclient-cert-auth: truetrusted-ca-file: /etc/etcd/etcdSSL/ca.pem
peer-transport-security:cert-file: /etc/etcd/etcdSSL/etcd.pemkey-file: /etc/etcd/etcdSSL/etcd-key.pemclient-cert-auth: truetrusted-ca-file: /etc/etcd/etcdSSL/ca.pem

若是已经运行过存在缓存的,需要先清理etcd缓存,三个节点都要清理(物理缓存文件清理后会导致方案一配置的角色认证失效,若要开启用户密码认证需重新操作上述步骤

rm -rf /etc/etcd/etcd0*

然后重启 etcd 服务

systemctl daemon-reload
systemctl start etcd
systemctl status etcd

至此基于ca证书的https访问控制配置结束。

访问etcd节点信息

检查etcd集群服务的健康,不带证书将无法正常访问

# 不带ca证书访问
etcdctl cluster-health
# 带ca证书访问
etcdctl \--ca-file=/etc/etcd/etcdSSL/ca.pem \--cert-file=/etc/etcd/etcdSSL/etcd.pem \--key-file=/etc/etcd/etcdSSL/etcd-key.pem \cluster-health

image.png

patroni使用配置调整

在PostgreSQL+etcd+patroni的高可用架构中,etcd开启访问控制后patroni得相应的做调整,期间涉及patronide重启,也就是涉及PostgreSQL数据库的重启,需要窗口时间操作

  • 方案一:基于角色认证的访问控制(BASIC认证)
# patroni
username: root
password: root
  • 方案二:基于ca证书的https访问控制(TLS传输)
chown -R postgres.postgres /etc/etcd/etcdSSL/*.pem# patroni
protocol: https
cacert: /etc/etcd/etcdSSL/ca.pem
cert: /etc/etcd/etcdSSL/etcd.pem
key: /etc/etcd/etcdSSL/etcd-key.pem

image.png

patroni配置文件更新etcd的配置:
https://patroni.readthedocs.io/en/latest/yaml_configuration.html#etcd
image.png

# 同时开启用户认证和ca证书的访问
etcdctl \--ca-file=/etc/etcd/etcdSSL/ca.pem \--cert-file=/etc/etcd/etcdSSL/etcd.pem \--key-file=/etc/etcd/etcdSSL/etcd-key.pem \--username root:root cluster-health

参考链接

etcd 的实现原理:https://draveness.me/etcd-introduction/
RAFT协议工作原理:http://thesecretlivesofdata.com/raft/
etcd单台部署,启用https以及ca自签名:
https://cloud.tencent.com/developer/article/1441188
etcd多台部署,启用https以及ca自签名:
https://cloud.tencent.com/developer/article/1441194
etcd的配置参数:
https://github.com/etcd-io/etcd/blob/main/etcd.conf.yml.sample

http://www.lryc.cn/news/468582.html

相关文章:

  • 执行Django项目的数据库迁移命令时报错:(1050, “Table ‘django_session‘ already exists“);如何破?
  • 问丫:创新社交平台的技术魅力与发展潜力
  • iOS Swift逆向——被编译优化后的函数参数调用约定修复
  • self-supervised learning(BERT和GPT)
  • 基于RBF神经网络的双参数自适应光储VSG构网逆变器MATLAB仿真模型
  • Openpyxl--学习记录
  • 高边坡稳定安全监测预警系统解决方案
  • 计算机毕业设计 | vue+springboot借书管理 图书馆管理系统(附源码)
  • vue3 腾讯地图 InfoWindow 弹框
  • 【Linux】解锁进程间通信奥秘,高效资源共享的实战技巧
  • O1 Nano:OpenAI O1模型系列的简化开源版本
  • 浅谈人工智能之Llama3微调后使用cmmlu评估
  • 为什么需要MQ?MQ具有哪些作用?你用过哪些MQ产品?请结合过往的项目经验谈谈具体是怎么用的?
  • Flutter项目打包ios, Xcode 发布报错 Module‘flutter barcode_scanner‘not found
  • RWSENodeEncoder, KER_DIM_PE(lrgb文件中的encoders文件中的kernel.py)
  • 技术文档:基于微信朋友圈的自动点赞工具开发
  • kubernetes_pods资源清单及常用命令
  • 科目二侧方位停车全流程
  • 2024源鲁杯CTF网络安全技能大赛题解-Round2
  • 10.24学习
  • 社交媒体与客户服务:新时代的沟通桥梁
  • 设置虚拟机与windows间的共享文件夹
  • 微信小程序性能优化 ==== 合理使用 setData 纯数据字段
  • 【加密系统】华企盾DSC服务台提示:请升级服务器,否则可能导致客户端退回到旧服务器的版本
  • 直连南非,服务全球,司库直联再进一步
  • 【spring】从spring是如何避免并发下获取不完整的bean引发的思考 什么是双重检查锁 什么是java内存模型
  • 【计算机网络一】网络学习前置知识
  • nuScenes数据集使用的相机的外参和内参
  • 数据结构与算法:贪心算法与应用场景
  • 音频编解码器音频文件格式