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

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 Server6443基于HTTP的安全端口
API Server8080不安全的HTTP端口
Kubelet10248用于检查Kubelet健康状态的HTTP端口
Kubelet10250面向API Server提供服务的HTTPS端口
Dashboard8001提供HTTP服务的端口
etcd2379客户端与服务端之间通信的端口
etcd2380不同服务端实例之间通信的端口

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 是日也&#xff0c;天朗气清&#xff0c;惠风和畅。仰观宇宙之大&#xff0c;俯察论文论坛&#xff0c;所以游目骋怀&#xff0c;足以极视听之娱&#xff0c;信可乐也。 夫人之相与&#xff0c;俯仰一世&#xff0c;或取诸怀抱&#xff0c;悟言一室之内&#xff1b;或因寄所…...

全国计算机技术与软件专业技术资格(水平)考试 上半年2023年3月13日开始,下半年2023年8月14日开始

根据2023年计算机技术与软件专业技术资格(水平)考试工作计划,可以得知,2023年软考报名时间——上半年2023年3月13日开始,下半年2023年8月14日开始。 点击查看:人力资源社会保障部办公厅关于2023年度专业技术人员职业资格考试工作计划及有关事项的通知 点击查看:2023年度…...

大数据框架之Hadoop:MapReduce(六)Hadoop企业优化

一、MapReduce 跑的慢的原因 MapReduce程序效率的瓶颈在于两点&#xff1a; 1、计算机性能 CPU、内存、磁盘、网络 2、IO操作优化 数据倾斜Map和Reduce数设置不合理Map运行时间太长&#xff0c;导致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软件开发好学吗?学完好找工作吗?

互联网高速发展的当下&#xff0c;Java语言无处不在&#xff1a;手机APP、Java游戏、电脑应用&#xff0c;都有它的身影。作为最热门的开发语言之一&#xff0c;Java在编程圈的地位不可撼动。可是&#xff0c;听名字就很专业的样子。Java语言到底好学吗&#xff1f;刚入坑编程圈…...

【独家C】华为OD机试提供C语言题解 - 优秀学员统计

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明优秀…...

数据仓库、数据中台、数据湖都是什么?

相信很多人都在最近的招聘市场上看到过招聘要求里提到了数据仓库、数据中台&#xff0c;甚至还有数据湖&#xff0c;这些层出不穷的概念让人困扰。今天我就来跟大家讲一讲数据仓库、数据中台以及数据湖的概念及区别。 数据库 在了解数据仓库、数据中台以及数据湖之前&#xff…...

0099 MySQL02

1.简单查询 查询一个字段 select 字段名 from 表名; 查询多个字段&#xff0c;使用“&#xff0c;”隔开 select 字段名,字段名 from 表名; 查询所有字段 1.把每个字段都写上 select 字段名,字段名,字段名.. from 表名; 2.使用*(效率低&#xff0c;可读性差) select *…...

应急响应-ubuntu系统cpu飙高

这里写目录标题一、排查过程二、处置过程三、溯源总结一、排查过程 1、查看CPU使用情况 top -c2、查看异常进程的具体参数 ps -aux3、通过微步查询域名信息 4、查看异常进程的监听端口 netstat -anlpt5、查找服务器内的异常文件 ls cat run.sh cat mservice.sh6、查看脚本…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...