基于eBPF的微服务网络安全(Cilium 1)

news2025/3/10 22:02:36

一些开源的kubernetes工具已经开始使用eBPF,这些工具大多数与网络,监控和安全相关。

本文不会涵盖eBPF的方方面面,只作为一个入门指南,包括Linux内核的BPF概念,到将该功能加入到微服务环境的优势,以及当前使用到该功能的工具,如Cilium或Weave。

理解eBPF

Berkely Packet Filters,简称BPF,是一个指令集,在1992年由Steven McCanne和Van Jacobso首次引入,通常用于给应用(如tcpdump)提供包过滤功能,并长期保持在Linux内核中。

BPF可以看作是一个简单的虚机,由此抽象出的机器只有少数寄存器,栈空间,一个隐式程序计数器以及一个允许与内核的其余部分共同作用的辅助函数的概念。

内核中的VM负责将bfp字节代码转换为底层可以理解的结构,并提供包过滤功能。

但在此之前,为了执行报文过滤,需要将报文拷贝到用户空间,这样会导致效率低下,而且资源浪费严重。

校验器(verifier)会校验程序是否会触发循环,并保证程序能够停止(不会产生死循环)。

最近几年,Linux社区从内核中移除了经典的BPF(cBPF,功能仅限于报文过滤和监控)解析器,并引入了一个新的指令集,称为eBPF。

扩展的BPF带来了更多的灵活性和可编程性,增加了新的使用场景,如跟踪,外部使用bpf系统调用,安全访问内核内存或快速解析等,并更新了即时(JIT)编译器,为运行在本机上的程序翻译eBPF。

还可以将bpf程序附加到其他内核对象上(cBPF只能附加到socket上用于socket过滤)。可附加到的对象为:Kprobes, Tracepoints, Network schedules, XDP (eXpress Data Path)等,XDP用于与共享数据结构(map)配合使用,可以在用户空间和内核空间之间提供通信,或在不同的BPF程序间共享信息。

创建一个BPF程序

eBPF的一个重要特性是能够使用高级语言(如C)来实现程序。LLVM有一个eBPF后端,用于编辑包含eBPF指令的ELF文件,前端(如clang)可以用于生成程序。

在一个后端转换为字节码后,使用bpf()系统调用加载bpf程序,并校验安全性。JIT会将字节码编译进CPU架构中,并将该程序附加到内核对象上,当这些对象发生事件时会触发程序的执行(例如,当从一个网络接口发送报文时)。

可以参考如下资料编写eBPF程序,:

  • Using clang/LLVM to compile programs
  • Go bindings for creating BPF programs
  • Go library that provides utilities for loading, compiling, and debugging eBPF programs

IPTables下的容器安全策略

历史上,容器的运行时为Docker,通过在容器主机上配置IPTables来实现安全策略以及NAT规则。

下图中进行了5个阶段:

  • connect()系统调用
  • 构造报文
  • 通过vETH对转发报文
  • 在主机上应用iptables
  • 丢弃或转发报文

使用iptables时,可以为每个实例配置策略,但仅限于层3和层4。需要重新构包,且需要按顺序处理iptables表项来对处理需要转发的报文。

eBPF下的容器安全策略

eBPF策略能够在整个协议栈或构包之前应用于系统调用(),而不受使用iptables的限制。由于eBPF附加到了容器网络命名空间中,所有的通信都会被eBPF截获和过滤。

此外还能根据程序级别的动作应用安全策略。对于每个微服务,不仅仅可以在L3和L4配置策略,也可以在L7配置策略,如REST GET/POST/PUT/DELETE或指定特定路径,如/service1, /restricted。

使用eBPF替换iptables

从linux内核贡献者的手上学习为什么内核社区要取代iptables,了解kubernetes 的kube-proxy面临的问题,或为什么在容器中基于IP地址和端口使用策略不是一个好的方式。

一部分使用eBPF特性实现的开源kubernetes工具实现了高性能和低延时,特别用于监控,安全和网络领域。

Cilium:动态网络控制和可视化

Cilium网络项目大量使用了eBPF,为基于容器的系统提供了路由和网络流量的过滤。它可以在不修改内核的前提下动态地生成和应用规则。

上述例子中的L3/L4策略仅允许app2通过80端口访问app1,不允许app3访问app1。

 
[{
endpointSelector: {matchLabels:{id:app1}},
ingress:[{
fromEndpoints:[
{matchLabels:{id:app2}}
],
toPorts:[{
ports:[{ports:80, protocol:tcp}]
}]
}]
}]

我们也可以在调用层采用更严格的安全策略,例如限制能够访问/public路径,但不能访问/restricted 路径。

Cilium如何工作

每个主机运行一个代理,将网络策略定义转换为BPF程序(而非管理iptables)。这些程序会被加载到内核中,然后附加到容器的虚拟以太网设备上,当执行这些程序时,会对每个发送和接收的报文应用这些规则。

由于BPF运行在Linux内核中,因此,能够在不修改应用代码或容器配置的前提下使用和更新Cilium的安全策略。

更多参见:

  • API-aware Networking andSecurity
  • Component overview
  • 如果要了解Cilium 如何使用eBPF,可以参考BPF and XDP reference guide

TIPS:

  • Cilium 对系统的要求比较高,例如内核的版本要求Linux kernel >= 4.9.17,更多参加官方文档

  • 受限于eBPF比较新,且需要的内核版本较高,因此目前还没有被kubernetes大规模推广,但该网络方案是一个大趋势。目前calico已经支持eBPF模式(不建议生产使用),且阿里云的Terway插件也是基于eBPF。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的JAVA-Web进阶--Maven

1.Maven功能 依赖管理和项目构建 2.Maven仓库 3.Maven项目构建 4.Maven依赖管理 依赖配置 依赖冲突 理解:层级指的是dependency的每一个包的树状图的深度,每一个包都向右延伸一个树状图,层级越深优先级越低,层级越浅&#xff0…

020-spring-整合web

引入web包。通过 ContextLoaderListener 在启动的时候加载spring.xml 加载spring.xml 之后&#xff0c;把dao层等对象放在容器中 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.…

Kotlin Multiplatform 新纪元:klibs.io 与鸿蒙支持解锁跨平台开发新潜力

Kotlin Multiplatform 新纪元:klibs.io 与鸿蒙支持解锁跨平台开发新潜力 在软件开发日益多元化的今天,Kotlin Multiplatform(KMP) 正凭借其跨平台代码复用能力迅速成为开发者的首选工具之一。2024年,KMP生态系统的库数量激增了35%,标志着这一领域的强劲增长。然而,随着…

Qt从入门到入土(七)-实现炫酷的登录注册界面(下)

前言 Qt从入门到入土&#xff08;六&#xff09;-实现炫酷的登录注册界面&#xff08;上&#xff09;主要讲了如何使用QSS样式表进行登录注册的界面设计&#xff0c;本篇文章将介绍如何对登录注册界面进行整体控件的布局&#xff0c;界面的切换以及实现登录、记住密码等功能。…

【阅读笔记】《基于区间梯度的联合双边滤波图像纹理去除方法》

一、联合双边滤波背景 联合双边滤波&#xff08;Joint Bilateral Filter, JBF&#xff09;是一种图像处理技术&#xff0c;它在传统的双边滤波&#xff08;Bilateral Filter, BF&#xff09;基础上进行了改进&#xff0c;通过引入一个引导图&#xff08;guidance image&#x…

Dockerfile基础指令

1.FROM 基于基准镜像&#xff08;建议使用官方提供的镜像作为基准镜像&#xff0c;相对安全一些&#xff09; 举例&#xff1a; 制作基准镜像&#xff08;基于centos:lastest&#xff09; FROM cenots 不依赖于任何基准镜像 FROM scratch 依赖于9.0.22版本的tomcat镜像 FROM…

Linux实验报告9-进程管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)列出当前系统中的所有进程,如何观察进程的优先级? (2)查看当前终端运行的 bash 进程的 PID,在当前终端启动 vim 编辑器并让其在后台执行,然后列出在当前终端中执行的进程的家族树。 (3)请自行挂载U盘或光盘,然后…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;数据基础知识”活动&#xff0c;了解有关云环境和数据服务中核心数据库概念的基础知识。通过本次免费的介绍性活动&#xff0c;你将提升在关系数据、非关系数据、大数据和分析方面的技能。 活动时间&#xff1a;01 月 07 日…

笔记本电脑驱动下载并安装

自己的电脑是鸡哥家的&#xff0c;经常出现没有声音、炸麦、麦克风没有音频输入等问题 最快的解决办法就是更新驱动 但是现在市面上好多驱动检测安装软件都已经开始收费了&#xff08;xx人生、xx精灵&#xff09;很恶心 所以不妨自己寻找驱动并重新安装 1.驱动下载 最好是去…

手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电

手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中&#xff0c;我们论述了局域网SIP坐席通过手机外呼出去时&#xff0c;手机中主副卡的呼叫调度策略。 但…

人工智能及深度学习的一些题目(二)

1、【单选题】 不属于语音识别预处理的步骤是哪个&#xff1f; 去重 2、HSV&#xff0c;H是色调&#xff0c;S是饱和度&#xff0c;V是亮度。 3、【填空题】 语音信号预处理中&#xff08; 预加重 &#xff09;的目的是为了对语音的高频部分进行加重&#xff0c;去除口唇辐射的…

关于今天发现的一个bug

一个输入框&#xff0c;定义只能输入0-100的数字 经过测试没有问题。 在回归的时候偶然发现&#xff0c;在输入数字7&#xff0c;点击保存以后&#xff0c;再次打开&#xff0c;发现竟然显示 经过查资料发现&#xff1a; // 关于js失精算法你都遇到哪些&#xff0c;让我们一起来…

力扣-数据结构-7【算法学习day.78】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

oscp备战系列-Kioptrix2014

文章目录 一、信息收集二、漏洞探测三、漏洞利用四、后渗透 一、信息收集 主机探测 nmap 192.168.30.0/24 -sP端口及版本探测 nmap 192.168.30.199 -sV可以看到开放了80&#xff0c;8080端口&#xff0c;采用apache 2.2.21 mod_ssl2.2.21 openssl0.9.8q WebDAV2 php5.3.8 O…

SonarQube相关的maven配置及使用

一、maven 全局配置 <settings><pluginGroups><pluginGroup>org.sonarsource.scanner.maven</pluginGroup></pluginGroups><profiles><profile><id>sonar</id><activation><activeByDefault>true</acti…

mac系统vsCode中使用Better Comments在.vue文件里失效

问题&#xff1a;关于Better Comments默认在html、TS、JS中有效&#xff0c;在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments&#xff08;注释高亮&#xff09;在vue文件里失效的问题 关于Better Comments电脑的配置路径&#xff1a; Windows系统&…

Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方

在Java 的Maven项目中&#xff0c;可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe&#xff0c;但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe&#xff0c;比如&#xff1a; 因为不需要经常运行 OpenRewrite&#xff0c;所以不想在pom.xml 加入不常使用的插件…

命令行之巅:Linux Shell编程的至高艺术(上)

文章一览 前言一、shell概述1.1 shell的特点和类型1.1.1 **shell的特点&#xff1a;**1.1.2 常用shell类型 1.2 shell脚本的建立和执行1.2.1 建立shell脚本1.2.2 执行shell脚本的方式1.2.3 shell程序实例 二、shell变量与算数运算2.1 简单shell变量2.1.1 简单变量定义和赋值2.1…

深度学习:基于MindSpore NLP的数据并行训练

什么是数据并行&#xff1f; 数据并行&#xff08;Data Parallelism, DP&#xff09;的核心思想是将大规模的数据集分割成若干个较小的数据子集&#xff0c;并将这些子集分配到不同的 NPU 计算节点上&#xff0c;每个节点运行相同的模型副本&#xff0c;但处理不同的数据子集。…

Docker Run使用方法及参数详细说明

Docker Run使用方法及参数详细说明 基本语法常用参数使用示例总结Docker Run是Docker中最基本的命令之一,用于创建并启动一个新的容器。通过Docker Run,用户可以基于指定的镜像创建一个容器实例,并且可以配置容器的各种参数,如网络设置、存储选项等。下面将详细介绍Docker …