
前面一篇分析了 Muse Sentinel 的实现技术:Muse Sentinel 逆向工程:构建内核级 AI Agent 安全网关
本篇介绍了 sentinel 的实现样例,样例代码请取:sentinel
本地 windows 11 + docker desktop 作为验证环境:

构建镜像可以选取安装了 LLVM 18 和 golang 1.25+ 的 ubuntu 24.04 镜像,基于项目的 docker/Dockerfile 进行构建。
可以使用 docker/compose.yaml 进行部署(需要第 2 步构建的镜像名为 sentinel:latest),部署后显示容器为:

其中 sentinel 容器为特权容器。agent 容器为被治理的无特权容器,用来模拟systemd-nspawn。
进入 sentinel 容器执行:
mkdir -p /sys/kernel/tracing
mount -t tracefs none /sys/kernel/tracing因为这里 sentinel 运行在容器里,需要在容器内部手动挂载 Linux 内核的 tracefs 文件系统,以便使用 ftrace 等内核追踪工具。
然后再执行启动 sentinel 守护进程:
sentinel --config /etc/sentinel/sentinel-verify.yaml
这里需要手动挂载 agent 容器的 cgroup。
docker inspect -f '{{.State.Pid}}' agent
attach-agent.sh 2435
在 agent 容器中访问一个黑白名单外的地址,例如百度(124.237.177.164:80)
demo-agent --target 124.237.177.164:80然后这里会看到:

这里容器已经被冻结,因为一直不会触发重试。注意这里第一次连接没有被授权被取消了,这个是eBPF的限制:eBPF cgroup 钩子的裁决模型——connect() 进入内核时,钩子程序同步地在系统调用路径上运行,必须立刻返回一个裁决(否则内核会被 hang 住),所以顺序永远是:先拒绝 → 冻结 → 再问人 → 人批了 → 重试才通。
然后我们回到 sentinel 守护进程容器的日志可以看到 agent 容器被冻结了:

然后进入 sentinel 容器另一个终端去查看当前 pending 的请求:
sentinel-cli pending
然后执行放行:
sentinel-cli approve req-2846-1793004467808472643回到 agent 容器可以看到:




sentinel 控制面信息输出:

demo-agent 通过硬编码访问/tmp/sentinel_demo_sensitive.txt文件,配置文件将该路径文件加入到敏感文件列表,然后通过 demo-agent 模拟先访问敏感文件,然后再访问 Allow 白名单地址,进入到 agent 容器终端:
demo-agent --taint --target 8.8.8.8:53
查看 sentinel 执行日志:

然后进入 sentinel 终端进行放行:


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。