• 莫名
    2022-02-10
    另外分享一个经验,结构体 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); }
    展开

    作者回复: 非常棒的示例,谢谢分享👍

    
    12
  • 写点啥呢
    2022-02-09
    本节课是关于eBPF在安全方面的使用,微博上看到有人发的这个rookit:https://weibo.com/tv/show/1034:4718242451882158?from=old_pc_videoshow,因此我对eBPF如何保证自身安全性很好奇,想请教下老师对于系统来说eBPF是一个两面利器,它自身设计与实现,还有在使用中该如何注意避免引入安全问题呢? 另外像bpf_send_signal辅助函数能够通过信号杀死进程,这是不是一种类似变成语言的unsafe方法,应该在实际中谨慎使用呢? 谢谢老师。

    作者回复: 你说的非常正确,eBPF如果被恶意应用利用,也同样会带来不可预料的损失。所以,在系统维护中,还是需要对进程的权限有所限制。比如,不要用root用户运行进程、不要给容器特权或者ADMIN capability等等。

    
    4
  • 莫名
    2022-02-10
    1、曾使用过 sysdig,老版本通过插入内核模块的方式进行安全审计。后来 sysdig 支持了 eBPF driver,主要通过追踪系统调用分析可能的安全隐患。sysdig eBPF driver 实现比较简单,一共十几个 program,统一放在 probe.c 源文件,里面的思路借鉴下还是不错的。 2、觉得需要在 bash 自身上做手脚,比如把 bash 软链接到一个脚本文件,记录下 bash 执行记录,然后 直接 exit。或者修改 bash 配置文件 .bashrc,文件末尾直接 exit。两种方法都有局限性,如果被识破可以很容易绕过去。

    作者回复: 1. 谢谢分享sysdig的使用经验! 2. 嗯嗯,这是一种不错的方法。或者考虑极端一些,完全禁止掉Bash(比如所有进程都跑在容器中,容器内不允许安装任何SHELL)。

    
    3
  • Geek_89541f
    2022-02-09
    请问我在阿里云的虚拟机(centos系统,内核版本4.18)中使用ip link加载xdp程序,若指定xdpdrv模式会报错,xdpgeneric可以。这是为啥?虚拟网卡只能使用generic模式吗?这样性能不能满足生产需求。

    作者回复: xdpdrv模式需要网卡驱动的支持的,具体的驱动支持情况可以参考 https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md#xdp

    共 2 条评论
    
  • Bachue Zhou
    2023-04-09 来自上海
    如果运行 bpftrace 找不到 BEGIN symbol,例如出现: ERROR: Could not resolve symbol: /proc/self/exe:BEGIN_trigger 就运行 sudo apt install bpftrace-dbgsym 就行了哈
    
    
  • 郑海成
    2022-04-13
    https://elixir.bootlin.com/linux/v5.13/source/include/linux/sched.h#L657 老师,bootlin这个网站是有什么要求吗?为什么我所有的代码link都显示 "This file does not exist."呢?
    
    