11 | 容器安全:如何使用eBPF增强容器安全?
倪朋飞
你好,我是倪朋飞。
上一讲,我以最常见的网络丢包为例,带你一起梳理了 eBPF 所提供的网络功能特性,并教你使用 bpftrace 开发了一个跟踪内核网络协议栈的 eBPF 程序。虽然 eBPF 起源于网络过滤,并且网络过滤也是 eBPF 应用最为广泛的一个领域,但其实 eBPF 的应用已经远远超出了这一范畴。故障诊断、网络优化、安全控制、性能监控等,都已是 eBPF 的主战场。
随着容器和云原生技术的普及,由于容器天生共享内核的特性,容器的安全和隔离就是所有容器平台头上的“紧箍咒”。因此,如何快速定位容器安全问题,如何确保容器的隔离,以及如何预防容器安全漏洞等,是每个容器平台都需要解决的头号问题。
既然容器是共享内核的,这些安全问题的解决自然就可以从内核的角度进行考虑。除了容器自身所强依赖的命名空间、cgroups、Linux 权限控制 Capabilities 之外,可以动态跟踪和扩展内核的 eBPF 就成为了安全监控和安全控制的主要手段之一。 Sysdig、Aqua Security、Datadog 等业内知名的容器安全解决方案,都基于 eBPF 构建了丰富的安全特性。
那么,到底如何使用 eBPF 来监控容器的安全问题,又如何使用 eBPF 阻止容器中的恶意行为呢?今天,我就带你一起来看看如何借助 eBPF 来增强容器安全。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
eBPF技术在容器安全领域的应用日益广泛。它提供了动态分析内核和应用行为的能力,帮助快速定位安全问题。通过事件触发机制,eBPF可以实时监测各类安全事件,避免漏检问题。同时,eBPF可用于执行安全策略,包括审计和决策执行,阻止非法操作。本文还介绍了如何使用eBPF分析容器安全问题,以及如何跟踪恶意程序的执行。通过实例展示了如何使用bpftrace命令跟踪新创建的进程,以及如何在容器中使用eBPF进行安全监控。文章最后提醒读者,除了充分利用eBPF丰富的特性外,也要特别留意eBPF程序自身的安全性。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《eBPF 核心技术与实战》,新⼈⾸单¥59
《eBPF 核心技术与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- 莫名另外分享一个经验,结构体 nsproxy 的 net 字段(代表进程所在的网络命名空间)在追踪网络包在宿主机 -> 容器传递过程时尤其有用,可以比较清楚的看到网络包从宿主机的网络命名空间传递到容器独立的网络命名空间之中,协助更好的理解容器网络模型。(把网络设备名字也打印出来会更好。) 倪老师文中的示例程序 execsnoop-container.bt 使用了结构体 nsproxy 的 pid_ns_for_children 获取 PID 命名空间,稍微改动了一下,换成 NET 命名空间,把具体的 id 打出来。 输出示例(shell1 执行 docker run ... bash, shell2 追踪 execve 事件,可以看到 bash 进程在一个新的网络命名空间下执行。): shell 1 # docker exec -ti vibrant_jepsen bash root@c340ba5cb9de:/# shell2 # # ./execve.bt Attaching 3 probes... NETNS CONTAINER PPID PID COMM ARGS 4026531993 VM-56-211-centos 799603 181059 bash docker exec -ti vibrant_jepsen bash ... 4026532351 c340ba5cb9de 181078 181083 runc:[2:INIT] bash 具体源码: ====================================== #!/usr/bin/env bpftrace #include <linux/sched.h> #include <linux/nsproxy.h> #include <linux/utsname.h> //#include <linux/pid_namespace.h> #include <net/net_namespace.h> BEGIN { printf("%-12s %-18s %-6s %-6s %-16s %s\n", "NETNS", "CONTAINER", "PPID", "PID", "COMM", "ARGS"); } tracepoint:syscalls:sys_enter_execve, tracepoint:syscalls:sys_enter_execveat { $task = (struct task_struct *)curtask; $netns = $task->nsproxy->net_ns->ns.inum; //$pidns = $task->nsproxy->pid_ns_for_children->ns.inum; $cname = $task->nsproxy->uts_ns->name.nodename; printf("%-12ld %-18s %-6d %-6d %-16s", (uint64)$netns, $cname, curtask->parent->pid, pid, comm); join(args->argv); }
作者回复: 非常棒的示例,谢谢分享👍
2022-02-1014 - 写点啥呢本节课是关于eBPF在安全方面的使用,微博上看到有人发的这个rookit:https://weibo.com/tv/show/1034:4718242451882158?from=old_pc_videoshow,因此我对eBPF如何保证自身安全性很好奇,想请教下老师对于系统来说eBPF是一个两面利器,它自身设计与实现,还有在使用中该如何注意避免引入安全问题呢? 另外像bpf_send_signal辅助函数能够通过信号杀死进程,这是不是一种类似变成语言的unsafe方法,应该在实际中谨慎使用呢? 谢谢老师。
作者回复: 你说的非常正确,eBPF如果被恶意应用利用,也同样会带来不可预料的损失。所以,在系统维护中,还是需要对进程的权限有所限制。比如,不要用root用户运行进程、不要给容器特权或者ADMIN capability等等。
2022-02-094 - 莫名1、曾使用过 sysdig,老版本通过插入内核模块的方式进行安全审计。后来 sysdig 支持了 eBPF driver,主要通过追踪系统调用分析可能的安全隐患。sysdig eBPF driver 实现比较简单,一共十几个 program,统一放在 probe.c 源文件,里面的思路借鉴下还是不错的。 2、觉得需要在 bash 自身上做手脚,比如把 bash 软链接到一个脚本文件,记录下 bash 执行记录,然后 直接 exit。或者修改 bash 配置文件 .bashrc,文件末尾直接 exit。两种方法都有局限性,如果被识破可以很容易绕过去。
作者回复: 1. 谢谢分享sysdig的使用经验! 2. 嗯嗯,这是一种不错的方法。或者考虑极端一些,完全禁止掉Bash(比如所有进程都跑在容器中,容器内不允许安装任何SHELL)。
2022-02-103 - Geek_89541f请问我在阿里云的虚拟机(centos系统,内核版本4.18)中使用ip link加载xdp程序,若指定xdpdrv模式会报错,xdpgeneric可以。这是为啥?虚拟网卡只能使用generic模式吗?这样性能不能满足生产需求。
作者回复: xdpdrv模式需要网卡驱动的支持的,具体的驱动支持情况可以参考 https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md#xdp
2022-02-092 - Bachue Zhou如果运行 bpftrace 找不到 BEGIN symbol,例如出现: ERROR: Could not resolve symbol: /proc/self/exe:BEGIN_trigger 就运行 sudo apt install bpftrace-dbgsym 就行了哈2023-04-09归属地:上海
- 郑海成https://elixir.bootlin.com/linux/v5.13/source/include/linux/sched.h#L657 老师,bootlin这个网站是有什么要求吗?为什么我所有的代码link都显示 "This file does not exist."呢?2022-04-13
收起评论