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

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

此处测试我们把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

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

至此基于角色认证的访问控制配置结束,还是比较简单的。
基于ca证书的https访问控制(TLS传输)
下载cfssl认证配置工具
cfssl认证配置工具下载网址:https://github.com/cloudflare/cfssl

若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/

方式一
配置 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

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

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

# 同时开启用户认证和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
相关文章:
ETCD未授权访问风险基于角色认证和启用https的ca证书修复方案
ETCD未授权访问风险安全漏洞修复方案 ETCD未授权访问风险介绍基于角色认证的访问控制(BASIC认证)基于ca证书的https访问控制(TLS传输)下载cfssl认证配置工具生成ca认证证书修改etcd配置方式一方式二 访问etcd节点信息 patroni使用…...
执行Django项目的数据库迁移命令时报错:(1050, “Table ‘django_session‘ already exists“);如何破?
一、问题描述: 当我们写Django时,由于自己的操作不当,导致执行数据库迁移命令时报错,报错的种类有很多,例如: 迁移文件冲突:可能你有多个迁移文件试图创建同一个表。数据库状态与迁移文件不同…...
问丫:创新社交平台的技术魅力与发展潜力
最近偶然间发现了一个很特别的社交网站,叫问丫。一开始我也只是抱着随便看看的心态去了解一下,没想到这个网站还蛮有意思的。 这个网站是由 LLMWorld 推出的,据说是一款跨时空跨次元的社交新产品。这个描述给网站蒙上了一层魔幻的纱布&#…...
iOS Swift逆向——被编译优化后的函数参数调用约定修复
头文件导入: typedef long long s64; typedef unsigned long long u64;typedef s64 Int; typedef u64 Bool;struct Swift::String {u64 _countAndFlagsBits;void *_object; };union Swift_ElementAny {Swift::String stringElement; };struct Swift_Any {Swift_Ele…...
self-supervised learning(BERT和GPT)
1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning,在講self-supervised learning之前呢,就不能不介紹一下芝麻街,為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…...
基于RBF神经网络的双参数自适应光储VSG构网逆变器MATLAB仿真模型
“电气仔推送”获得资料(专享优惠) 模型简介 此模型源侧部分采用光伏发电系统与混合储能系统(蓄电池超级电容),并网逆变器采用虚拟同步发电机(VSG)控制,为系统提供惯量阻尼支撑。同…...
Openpyxl--学习记录
1.工作表的基本操作 1.1 工作表的新建打开与保存 1.1.1 创建工作簿 from openpyxl import Workbook from pathlib import Pathfile_path Path.home() / "Desktop" / "123.xlsx"# 1.创建工作簿 wb Workbook() # 2.访问默认工作簿 ws wb.active # 3.填充…...
高边坡稳定安全监测预警系统解决方案
一、项目背景 高边坡的滑坡和崩塌是一种常见的自然地质灾害,一但发生而没有提前预告将给人民的生命财产和社会危害产生严重影响。对高边坡可能产生的灾害提前预警、必将有利于决策者采取应对措施、减少和降低灾害造成的损失。现有的高边坡监测技术有人工巡查和利用测…...
计算机毕业设计 | vue+springboot借书管理 图书馆管理系统(附源码)
1,项目背景 1.1 课题背景 随着现在科学技术的进步,人类社会正逐渐走向信息化,图书馆拥有丰富的文献信息资源,是社会系统的重要组成部分,在信息社会中作用越来越重要,在我国图书馆计算机等 信息技术的应用…...
vue3 腾讯地图 InfoWindow 弹框
1、vue项目index.html引入地图js 2、页面使用 <script setup lang"ts"> import { useMapStore } from //store;defineOptions({ name: PageMap }); const emits defineEmits([update:area, update:address, update:latitude, update:longitude]); const prop…...
【Linux】解锁进程间通信奥秘,高效资源共享的实战技巧
管道、共享内存、消息队列、信号量 1. 进程间通信1.1. 目的1.2. 概念和本质1.3. 分类 2. 管道2.1 概念2.2. 4种情况2.3. 4种特性2.4. 匿名管道2.4.1. 原理2.4.2. 概念2.4.3. 创建 — pipe()2.4.4. 应用场景 — 进程池 2.5. 命名管道2.5.1. 概念和原理2.5.2. 创建 — mkfifo()2.…...
O1 Nano:OpenAI O1模型系列的简化开源版本
概览 O1 Nano 是一个开源项目,它实现了 OpenAI O1 模型系列的简化版本。O1 模型是一个高级语言模型,它在训练和推理过程中整合了链式思维和强化学习。这个实现版本,称为 O1-nano,专注于解决算术问题,以展示模型的能力。…...
浅谈人工智能之Llama3微调后使用cmmlu评估
浅谈人工智能之Llama3微调后使用cmmlu评估 引言 随着自然语言处理(NLP)技术的发展,各类语言模型如雨后春笋般涌现。其中,Llama3作为一个创新的深度学习模型,已经在多个NLP任务中展示了其强大的能力。然而,…...
为什么需要MQ?MQ具有哪些作用?你用过哪些MQ产品?请结合过往的项目经验谈谈具体是怎么用的?
需要使用MQ的主要原因包括以下几个方面: 异步处理:在分布式系统中,使用MQ可以实现异步处理,提高系统的响应速度和吞吐量。例如,在用户注册时,传统的做法是串行或并行处理发送邮件和短信,这…...
Flutter项目打包ios, Xcode 发布报错 Module‘flutter barcode_scanner‘not found
报错图片 背景 flutter 开发的 apple app 需要发布新版本,但是最后一哆嗦碰到个报错,这个小问题卡住了我一天,之间的埪就不说了,直接说我是怎么解决的,满满干货 思路 这个报错 涉及到 flutter_barcode_scanner; 所…...
RWSENodeEncoder, KER_DIM_PE(lrgb文件中的encoders文件中的kernel.py)
该代码实现了一个基于核的节点编码器 KernelPENodeEncoder,用于在图神经网络中将特定的核函数编码(例如随机游走结构编码 RWSE)与节点特征相结合。通过将预先计算的核统计信息(如 RWSE 等)与原始节点特征结合,该编码器可以帮助模型捕捉图中节点的结构信息。该代码还定义了…...
技术文档:基于微信朋友圈的自动点赞工具开发
概述 该工具是一款基于 Windows 平台的自动化操作工具,通过模拟人工点击,实现微信朋友圈的自动点赞。主要适用于需频繁维护客户关系的用户群体,避免手动重复操作,提高用户的互动效率。 官方地址: aisisoft.top 一、开发背景与技术…...
kubernetes_pods资源清单及常用命令
示例: apiVersion: v1 kind: Pod metadata:name: nginx-podnamespace: defaultlabels:app: nginx spec:containers:- name: nginx-containerimage: nginx:1.21ports:- containerPort: 80多个容器运行示例 apiVersion: v1 kind: Pod metadata:name: linux85-nginx-…...
科目二侧方位停车全流程
科目二侧方位停车是驾考中的重要项目,主要评估驾驶员将车辆准确停放在道路右侧停车位的能力。以下是对科目二侧方位停车的详细解析: 请点击输入图片描述(最多18字) 一、考试要求 车辆需在库前右侧稳定停车,随后一次性…...
2024源鲁杯CTF网络安全技能大赛题解-Round2
排名 欢迎关注公众号【Real返璞归真】不定时更新网络安全相关技术文章: 公众号回复【2024源鲁杯】获取全部Writeup(pdf版)和附件下载地址。(Round1-Round3) Misc Trace 只能说题出的太恶心了,首先获得一…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
