Kubernetes的网络架构及其安全风险
本博客地址:https://security.blog.csdn.net/article/details/129137821
一、常见的Kubernetes网络架构
如图所示:
说明:
1、集群由多个节点组成。
2、每个节点上运行若干个Pod。
3、每个节点上会创建一个CNI网桥(默认设备名称为cni0)。
4、每个Pod存在于自己的网络命名空间中,通过虚拟网卡对Veth Pair设备与外界通信。
5、Veth Pair设备将创建两张虚拟网卡,分别位于Pod所在的网络命名空间中(对应图中 Pod内部的eth0)和节点根网络命名空间中(对应图中每个节点上方根网络命名空间内的各个veth,如veth1056db9f),互为对端(Veth Peer),对于Veth Pair设备的两张虚拟网卡来说,从其中一张网卡发出的数据包,将直接出现在另一张网卡上。
6、每个Pod的eth0网卡的对端veth网卡“插”在cni0网桥上。
7、同一节点上的各Pod可以借助cni0网桥互相通信,不同节点之间需要借助额外的网络插件进行通信,如Flannel。
8、CoreDNS是整个Kubernetes集群的DNS服务器。
二、Kubernetes下pod间的网络通信
如果一个pod想要发送ARP包,需要具有CAP_NET_RAW权限,在容器中,对于一个具有root权限的用户来说,默认是具有该权限的,查看方式如下:
Kubernetes以服务资源kube-dns的形式提供集群级别的DNS服务,所有pod的DNS服务器IP地址正是kube-dns服务的地址:
当这个Pod向kube-dns服务发起DNS查询请求时,查询请求会经过Kubernetes配置的iptables规则,最终被发送到服务后端的CoreDNS Pod中:
# 执行命令
iptables -t nat -L
而Pod的IP地址则是:
Pod内的eth0网卡的对端被连接到cni0网桥上。此时该对端就成为了cni0网桥的一个接口。当Pod向外发出ARP请求时,该请求会被网桥转发给其他接口,这样一来其他Pod就能够收到ARP请求,其中网卡MAC地址与ARP请求相符的Pod就会发送ARP响应,该响应同样会被网桥转发给最初发出ARP请求的Pod。这就是Kubernetes内部同一个节点上的ARP请求响应流程。
假设一个Pod需要访问example.com,那么它首先必须知道该域名对应的IP,因此它需要发出一个DNS查询请求。默认情况下,Pod的DNS策略为ClusterFirst,也就是说,这个Pod会向集群DNS服务kube-dns发起请求。
DNS请求实际上是一个UDP报文,从我们上面的截图可知,kube-dns服务的IP为10.2.0.10,而该Pod的IP为10.244.2.11,两者不在同一子网。因此该UDP报文会被Pod发送给默认网关,也就是cni0。之后,节点iptables对该报文进行DNAT处理,将目的地改为10.244.0.7, 也就是CoreDNS Pod的IP地址。
之后,cni0通过查询自己维护的MAC地址表,找到10.244.0.7对应的MAC地址,然后将报文发到网桥的对应端口上。CoreDNS Pod收到报文后,向上级DNS服务器查询example.com的IP,收到结果后向该Pod发出DNS响应。
至此,这个Pod知道了example.com对应的IP。该Pod就可以向example.com对应的IP发出基于TCP的HTTP请求了
三、容器编排平台(Kubernetes)面临的风险
容器技术和编排管理系统是云原生生态的两大核心部分,前者负责执行,后者负责控制和管理,共同构成云原生技术有机体。
Kubernetes架构图如下:
上图是一个常见的Kubernetes集群,由一个Master节点和三个Worker节点组成,Pod之间借助CNI插件Flannel实现通信。Kubernetes自身的系统Pod(kube-system命名空间内的Pod)主要运行在Master节点上,除此之外,每个Worker节点上也分别有一个Flannel Pod和kube-proxy Pod;所有业务Pod分布在三个Worker节点上。另外,每个节点上还有一个Kubelet服务,负责管理容器。
1、在Kubernetes环境中,容器基础设施存在的风险
● 镜像面临的风险:主要是不安全的第三方组件、恶意镜像、敏感信息泄露(例如将敏感配置信息打包进镜像的情况)等;
● 活动容器面临的风险:主要是不安全的容器应用、不受限制的资源共享、不安全的配置与挂载等;
● 网络存在的风险:主要是由于集群通常由多个节点组成,因此集群网络风险的影响范围要比单宿主机运行容器的网络风险更大;
● 其他风险:除此外,还有容器管理程序接口、宿主机操作系统、容器软件漏洞等安全风险;
2、Kubernetes组件接口存在的风险
Kubernetes中组件众多,绝大多数组件以基于HTTP或HTTPS的API形式提供服务。其中,我们日常接触比较多的服务及其端口如下所示:
组件 | 默认端口 | 说明 |
---|---|---|
API Server | 6443 | 基于HTTP的安全端口 |
API Server | 8080 | 不安全的HTTP端口 |
Kubelet | 10248 | 用于检查Kubelet健康状态的HTTP端口 |
Kubelet | 10250 | 面向API Server提供服务的HTTPS端口 |
Dashboard | 8001 | 提供HTTP服务的端口 |
etcd | 2379 | 客户端与服务端之间通信的端口 |
etcd | 2380 | 不同服务端实例之间通信的端口 |
● API Server:默认情况下,API Server在8080和6443两个端口上提供服务。其中,8080端口提供的是没有TLS加密的HTTP服务。保留该端口主要是为了方便测试以及集群初启动。然而在生产环境开放8080端口,即使绑定本地环回地址(localhost)也是很危险的。如果将该端口暴露在互联网上,那么任何网络可达的攻击者都能够通过该端口直接与API Server交互,继而控制整个集群。
● Kubelet:默认配置下,Kubelet在10250端口开放上述API服务,另外还监听10248端口,以供其他组件检查Kubelet的运行状态。这里10248端口的服务相对简单,不存在特别的风险,但10250端口在默认情况下,API Server在访问Kubelet的API时需要使用客户端证书,相对来说是比较安全的。但是如果出现以下任一情况:
1)攻击者通过某种方式窃取了API Server访问Kubelet的客户端证书。
2)用户为了方便起见,将Kubelet的--anonymous-auth
参数设置为true,且authorization.mode设置为AlwaysAllow。
则网络可达的攻击者都能够直接与Kubelet进行交互,从而实现对其所在节点的控制。
● Dashboard:默认情况下,我们需要先执行kubectl proxy,然后才能通过本地8001端口访问Dashboard。但是,如果直接将Dashboard端口映射在宿主机节点上,或者在执行kubectl proxy时指定了额外地址参数,那么所有能够访问到宿主机的用户,包括攻击者,都将能够直接访问Dashboard。
另外,默认情况下Dashboard需要登录认证,但是,如果用户在Dashboard的启动参数中添加了--enable-skip-login
选项,那么攻击者就能够直接点击Dashboard界面的“跳过”按钮,无须登录便可直接进入Dashboard。
● etcd:etcd启动后监听2379和2380两个端口,前者用于客户端连接,后者用于多个etcd实例之间的对端通信。在多节点集群中,为了实现高可用,etcd往往在节点IP上(非本地IP)监听,以实现多节点之间的互通,这可能允许外部攻击者访问etcd。
默认情况下,两个端口提供的服务都需要相应证书才能访问(禁止匿名访问),这为etcd的安全性提供了保障。如果攻击者窃取了证书,或者用户将etcd设置为允许匿名访问,那么攻击者就可能直接访问etcd并窃取数据
3、集群网络存在的风险
为了实现集群Pod间相互通信,在安装部署Kubernetes后,我们往往还要额外安装一个网络插件,常见的网络插件有Flannel、Calico和Cilium等。
在没有其他网络隔离策略和Pod安全策略的默认情况下,由于Pod与Pod之间彼此可连通,且Pod内的root用户具有CAP_NET_RAW权限,集群内部可能发生网络探测、嗅探、拒绝服务和中间人攻击等网络攻击。
4、访问控制机制存在的风险
如果访问控制过于宽松,高权限账户可能会被滥用,从而对Kubernetes自身及正在运行的容器产生威胁;除此之外,如果允许针对Kubernetes的未授权访问,攻击者可能借此直接获得集群管理员权限。另外,即使认证和授权机制在容器环境创建初期遵循了最小权限等安全原则,随着时间的推移和环境的更新变动,角色与权限可能会变得混乱,从而为攻击者提供可乘之机。
5、其他风险
其他风险主要是Kubernetes软件安全漏洞
四、Kubernetes下Pod通信的中间人攻击
对于Pod通信的中间人攻击,我们的前提是其中一个Pod已被攻击者攻入且具有root权限。
具体的网络示意如图所示,攻击者的Pod为节点1左下方的Web APP Pod(我们将其命名为attacker Pod),受害者Pod为节点1右下方的Backend Pod(我们将其命名为victim Pod)
攻击流程:
1、首先获得各种网络参数,包括attacker Pod自身的MAC和IP地址、Kubernetes集群DNS服务的IP地址、同节点上CoreDNS Pod的MAC和IP地址、CNI网桥的MAC和IP地址。
2、在attacker Pod中启动一个HTTP服务器,监听80端口,对于任何HTTP请求均回复一行字符串“F4ke Website”,作为攻击成功的标志。
3、攻击者在attacker Pod中启动一个ARP欺骗程序,持续向cni0网桥发送ARP响应帧,不断声明CoreDNS Pod的IP对应的MAC地址应该是attacker Pod的MAC地址。
4、在attacker Pod中启动一个DNS劫持程序,等待接收DNS请求。
5、根据设定,victim Pod向example.com发起HTTP请求,为了获得example.com的IP地址,victim Pod需要向DNS服务器发起请求,为了找到DNS服务器的MAC地址,victim Pod需要先向cni0网桥发送ARP请求,然而由于attacker Pod在第3步不断地向cni0网桥发送ARP响应帧,因此victim Pod会收到响应,被告知CoreDNS Pod的IP对应attacker Pod的MAC地址。
6、一旦第3步生效,victim Pod向attacker Pod发来DNS请求,则DNS劫持程序首先判断该请求针对的域名是否为目标域名example.com。如否,则将请求转发给真正的CoreDNS Pod,接收CoreDNS Pod的响应包,并转发给victim Pod;如是,则伪造DNS响应包,声明example.com对应的IP地址是attacker Pod自己的IP,将这个响应包发送给victim Pod。
7、顺利的话,victim Pod接下来将向attacker Pod发送http://example.com的HTTP请求,因此第2步中attacker Pod中设置的HTTP服务器将向victim回复预设字符串“F4ke Website”,victim Pod以为“F4ke Website”正是自己需要的内容。
防御措施:
禁用CAP_NET_RAW权限即可
相关文章:
Kubernetes的网络架构及其安全风险
本博客地址:https://security.blog.csdn.net/article/details/129137821 一、常见的Kubernetes网络架构 如图所示: 说明: 1、集群由多个节点组成。 2、每个节点上运行若干个Pod。 3、每个节点上会创建一个CNI网桥(默认设备名称…...
Blob分析+特征+(差分)
Blob分析特征0 前言1 概念2 方法2.1 图像采集2.2 图像分割2.3 特征提取3 主要应用场景:0 前言 在缺陷检测领域,halcon通常有6种处理方法,包括Blob分析特征、Blob分析特征差分、频域空间域、光度立体法、特征训练、测量拟合,本篇博…...
Flink 提交模式
Flink的部署方式有很多,支持Local,Standalone,Yarn,Docker,Kubernetes模式等。而根据Flink job的提交模式,又可以分为三种模式: 模式1:Application Mode Flink提交的程序,被当做集群内部Application,不再需要Client端做繁重的准备工作。(例如执行main函数,生成JobG…...
网络总结知识点(网络工程师必备)三
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 前言 51.什么是ARP代理?...
测开:前端基础-css
一、CSS介绍和引用 1.1 css概述 层叠样式表,是一种样式表语言,用来描述HTML和XML文档的呈现。 CSS 用于简化HTML标签,把关于样式部分的内容提取出来,进行单独的控制,使结构与样式分离开发。 CSS 是以HTML为基础&…...
Java学习记录之JDBC
JDBC JDBC 是 Java Database Connectivity 的缩写,是允许Java 程序访问并操作关系型数据库数据的一套 应用程序接口。本身就是一种规范,它提供的接口有一套完整的,可移植的访问底层数据库的程序。 JDBC 的架构 JDBC API支持两层和三层处理…...
矩阵翻硬币
题目描述 小明先把硬币摆成了一个 n 行 m 列的矩阵。 随后,小明对每一个硬币分别进行一次 Q 操作。 对第 x 行第 y 列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转。...
【C语言跬步】——指针数组和数组指针(指针进阶)
一.指针数组和数组指针的区别 1.指针数组是数组,是一种存放指针的数组; 例如: int* arr[10]; 2.数组指针是指针,是一种指向数组的指针,存放的是数组的地址; 例如: int arr[5]; int (p)[5]&a…...
第十四届蓝桥杯模拟赛第三期(Python)
写在前面 包含本次模拟赛的10道题题解能过样例,应该可以AC若有错误,欢迎评论区指出本次题目除了最后两题有些难度,其余题目较为简单,我只将代码和结果给出,如果不能理解欢迎私信我,我会解答滴。start 2022…...
css-盒模型
巧妙运用margin负值盒模型和怪异盒模型(border padding 包含在内)display: block 能让textarea input 水平尺寸自适应父容器? – 不能 * {box-sizing: border-box; // bs: bb }<textarea/> 是替换元素,尺寸由内部元素决定,不受display水平影响. 当然可以直接设置宽度10…...
Linux | 调试器GDB的详细教程【纯命令行调试】
文章目录一、前言二、调试版本与发布版本1、见见gdb2、程序员与测试人员3、为什么Release不能调试但DeBug可以调试❓三、使用gdb调试代码1、指令集汇总2、命令演示⌨ 行号显示⌨ 断点设置⌨ 查看断点信息⌨ 删除断点⌨ 开启 / 禁用断点⌨ 运行 / 调试⌨ 逐过程和逐语句⌨ 打印 …...
wifi芯片大市场和个人小生活
3.3 是日也,天朗气清,惠风和畅。仰观宇宙之大,俯察论文论坛,所以游目骋怀,足以极视听之娱,信可乐也。 夫人之相与,俯仰一世,或取诸怀抱,悟言一室之内;或因寄所…...
全国计算机技术与软件专业技术资格(水平)考试 上半年2023年3月13日开始,下半年2023年8月14日开始
根据2023年计算机技术与软件专业技术资格(水平)考试工作计划,可以得知,2023年软考报名时间——上半年2023年3月13日开始,下半年2023年8月14日开始。 点击查看:人力资源社会保障部办公厅关于2023年度专业技术人员职业资格考试工作计划及有关事项的通知 点击查看:2023年度…...
大数据框架之Hadoop:MapReduce(六)Hadoop企业优化
一、MapReduce 跑的慢的原因 MapReduce程序效率的瓶颈在于两点: 1、计算机性能 CPU、内存、磁盘、网络 2、IO操作优化 数据倾斜Map和Reduce数设置不合理Map运行时间太长,导致Reduce等待过久小文件过多大量的不可分块的超大文件Spill次数过多Merge次…...
Spring File Storage的详细文档
快速入门配置pom.xml引入依赖<dependencies><!-- spring-file-storage 必须要引入 --><dependency><groupId>cn.xuyanwu</groupId><artifactId>spring-file-storage</artifactId><version>0.7.0</version></dependen…...
Java软件开发好学吗?学完好找工作吗?
互联网高速发展的当下,Java语言无处不在:手机APP、Java游戏、电脑应用,都有它的身影。作为最热门的开发语言之一,Java在编程圈的地位不可撼动。可是,听名字就很专业的样子。Java语言到底好学吗?刚入坑编程圈…...
【独家C】华为OD机试提供C语言题解 - 优秀学员统计
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明优秀…...
数据仓库、数据中台、数据湖都是什么?
相信很多人都在最近的招聘市场上看到过招聘要求里提到了数据仓库、数据中台,甚至还有数据湖,这些层出不穷的概念让人困扰。今天我就来跟大家讲一讲数据仓库、数据中台以及数据湖的概念及区别。 数据库 在了解数据仓库、数据中台以及数据湖之前ÿ…...
0099 MySQL02
1.简单查询 查询一个字段 select 字段名 from 表名; 查询多个字段,使用“,”隔开 select 字段名,字段名 from 表名; 查询所有字段 1.把每个字段都写上 select 字段名,字段名,字段名.. from 表名; 2.使用*(效率低,可读性差) select *…...
应急响应-ubuntu系统cpu飙高
这里写目录标题一、排查过程二、处置过程三、溯源总结一、排查过程 1、查看CPU使用情况 top -c2、查看异常进程的具体参数 ps -aux3、通过微步查询域名信息 4、查看异常进程的监听端口 netstat -anlpt5、查找服务器内的异常文件 ls cat run.sh cat mservice.sh6、查看脚本…...
MDK软件使用技巧
本文主要汇总MDK软件使用技巧 一、字体大小及颜色修改 第一步点击工具栏的这个小扳手图标 进去后显示如下,先设置 Encoding 为:Chinese GB2312(Simplified),然后设置 Tab size 为:4 以更好的支持简体中文,否则&…...
3 333333
全部 答对 答错 单选题 1. 一个项目来取代目前公司的文件存储系统已经获批。外部供应商提供硬件,内部团队开发软件。这个团队是自组织的,由一般的专家组成。团队建议迭代地与供应商合作,但供应商表示拒绝。因此,只有软件将被迭代…...
1528. 重新排列字符串
1528. 重新排列字符串https://leetcode.cn/problems/shuffle-string/ 难度简单52收藏分享切换为英文接收动态反馈 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。 返回重新…...
【8】【用户操作日志】操作日志SpringBootStarter
操作日志 此版本操作日志主要就是通过AOP拦截器实现的,整体主要分为AOP拦截器、自定义函数、日志上下文、扩展接口;组件提供了6个扩展点,自定义函数、日志上下文、用户信息获取,日志保存,自定义异常获取,入…...
【游戏逆向】寻路函数隐藏检测点分析
案例: 某游戏出现调用寻路函数失败异常崩溃。 基本情况分析: 在刚登陆游戏的时候直接调用寻路函数崩溃。 手动寻路以后再调用寻路不崩溃。(排除了函数编写错误的可能) 猜测可能检测方法: 有某一个标志位(全局类型)在游戏刚登陆的时候没…...
【Zabbix实战之运维篇】Zabbix监控Docker容器配置方法
【Zabbix实战之运维篇】Zabbix监控Docker容器配置方法 一、检查Zabbix监控平台状态1.检查Zabbix各组件容器状态2.奸诈Zabbix-server状态二、下载监控模板1.进入Zabbix官网下载页面2.查看下载模板三、创建一个测试容器1.创建一个测试容器2.检查测试容器状态3.访问测试web服务四、…...
这款 Python 工具进行数据分析及数据可视化真的很棒啊
前言 大家好,今天我们以全国各地区衣食住行消费数据为例,来分析2022年中国统计年鉴数据,统计全国各地人民的消费地图,看看: 哪个省份的人最能花钱 哪个省份的人最舍得花钱 哪个省份的人最抠门 全国各地区人民在吃、穿…...
visual Studio Code常用快捷键
1、向上/向下移动代码行 alt 下箭头/上箭头 2、向上/向下复制一行代码 shiftalt 下箭头/上箭头 3、选定多个相同的单词 ctrl d 4、全局替换 ctrl h 5、快速定位到某一行 ctrl g 6、放大缩小整个编辑器界面 ctrl / - 7、添加多个光标 Ctrl Alt 上箭头/下箭头…...
基础(一)十六进制转八进制
试题 基础练习 十六进制转八进制 资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 给定n个十六进制正整数,输出它们对应的八进制数。输入格式 输入的第…...
梯度提升算法决策过程的逐步可视化
梯度提升算法是最常用的集成机器学习技术之一,该模型使用弱决策树序列来构建强学习器。这也是XGBoost和LightGBM模型的理论基础,所以在这篇文章中,我们将从头开始构建一个梯度增强模型并将其可视化。 梯度提升算法介绍 梯度提升算法&#x…...
平顶山城市住房城乡建筑网站/seo系统培训课程
2019独角兽企业重金招聘Python工程师标准>>> 1、什么是plist文件? 在做iOS开发时,我们应该经常会用到plist文件,那么什么是plist文件呢?它全名是Property List,属性列表文件,它是一种用来存储串…...
东莞手机网站制作/陕西seo顾问服务
有一批价格分别为p1,p2, p3 … pn的n种商品, 你手中持有金钱为money,如何购买商品使剩余的钱最少,求最少剩多少? 示例一: 输入 p[150, 200, 350], money 250 输出:50 示例二: 输入…...
怎样把域名和做的网站连接/十大室内设计网站
1.用annotation配置文件开发要明确告诉Spring框架我们是注解开发 版本spring-context 5.0.2 配置ApplicationContext.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xs…...
b2b免费信息平台/青岛官网seo
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1106Problem Description输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0…...
哈尔滨做平台网站平台公司/网站搜索排名靠前
Java压缩解压缩文件的方法有,第一中借助java jdk自带的ZipOutputStream和ZipInputStream。 第二种,借助第三方jar, 例如Apache Commons Compress和Ant。 下面以Ant为例详细介绍。 前提,需要将Ant的ant.jar和ant-launcher.jar添加…...
做宣传单赚钱的网站/本地服务推广平台哪个好
过渡Transition过渡组效果的目标都是让本图层以各种形态逐渐消失,直至完全显示出下方图层或指定图层。除“光圈擦除”之外的所有过渡效果都有“过渡完成”属性。当此属性为 100% 时,过渡完成,自身变得完全透明,底层图层将显现出来…...