golang常见类型作为参数的eBPF解析

即将过去的2022年,笔者相当比例的精力都投入在了eBPF上。最初的时候,写了一篇golang 常见类型字节数 ,开启了eBPF+golang的总结性工作。此后陆续整理了一些关于ebpf的使用文章,同时项目也在逐步的推进。eBPF的实际落地有很大的挑战,但是最终还是找到了一些落地的场景。年底了,结合最近的调研工作,笔者整理了这篇文章。既算是对之前文章的呼应,也是对今年整理内容的总结。

eBPF能够提供一种切入服务细节的独特视角。本文即通过实例,对golang常见类型作为函数参数时进行解析,期望读者能够感受这一视角。需要说明的是,本文是基于golang-1.16来整理的。

·7min·李岩
golang常见类型作为参数的eBPF解析

基于ebpf实现的gls

虽然golang并不推荐使用goid来构建gls(goroutine local storage),仍然有着很多的实现gls并使用的尝试。github-gls这里是一个常见的实现,基本表述了golanggls的实现思路:获取goid,基于goid构建一个存储。本文中笔者尝试基于ebpf来构建一个golanggls

基本功能

本文中基于ebpf实现的gls具有如下功能:

  • 基于goid的存储。即map[goid]=value
  • 基于goroutine派生关系设置的value缺省值。即map[goid=1]=121,且goid=1派生goid=2,则map[goid=2]=map[goid=1]=121
    本文建议参照黑魔法-ebpf-对用户空间数据的写入进行理解。
·3min·李岩
基于ebpf实现的gls

黑魔法--用 ebpf 构建用户空间数据的桥梁

在之前的示例中,仅涉及到ebpf对用户空间数据的读取。工程性较强的如:ebpf采集mysql请求信息及ebpf对应用安全的思考也仅是通过urpobe采集用户空间的数据。本文介绍点ebpf的“黑魔法”:将用户空间数据的读取、用户空间数据的写入结合起来,成为用户空间数据交互的桥梁。

·3min·李岩
黑魔法--用 ebpf 构建用户空间数据的桥梁

ebpf采集mysql请求信息及ebpf对应用安全的思考

本文笔者继续介绍ebpf 的应用:使用bpftrace采集mysql连接信息,包括数据库地址、db_nameuser_name。在展示采集操作的同时,附上对ebpf对云时代应用安全的一些思考。

目标

使用bpftrace对一个运行中进程的mysql请求进行采集,目标采集内容包括数据库地址、db_nameuser_name

·4min·李岩
ebpf采集mysql请求信息及ebpf对应用安全的思考

x86_64 寄存器传参方式

·1min·李岩
x86_64 寄存器传参方式

bpftrace 无侵入遍历golang链表

bpftrace 基于 bcc 进行开发的工具,语法简洁、功能强大。用其分析Linux 环境下的程序会很方便。本文构造了一个入参为链表头节点的函数使用场景,通过使用bpftrace无侵入遍历链表成员的方式,介绍bpftrace attach uprobe 的使用。更多使用说明见:bpftrace官网使用文档

·2min·李岩
bpftrace 无侵入遍历golang链表