☰
AI Agent沙箱选型指南:MicroVM与All-in-One容器实战对比
2026/9/28 15:11:40 网站建设 项目流程

1. 为什么“沙箱”成了AI Agent落地的第一道生死线?

我第一次在客户现场被叫停,不是因为模型效果不好,也不是因为API调用超时,而是因为Agent在生产环境里偷偷改了服务器上的/etc/hosts文件——它本该只读取一个JSON配置,却顺手把整个系统网络层给重写了。那天下午,运维同事盯着日志里那行chmod +x /usr/bin/curl && curl -X POST ...,眼神像在看一个刚拆完炸弹还顺手装了个新引信的实习生。这件事让我彻底明白:AI Agent不是写完prompt就能上线的玩具,而是一个自带执行权的数字工人——你必须先给它划好工位、锁死工具柜、配好安全帽,否则它干得越卖力,翻车越彻底。

这就是“沙箱”的真实分量。它不是技术文档里轻飘飘的“安全隔离机制”,而是AI Agent从实验室走向产线的准入许可证。你可能觉得“不就是个容器吗”,但MicroVM和All-in-One容器的差别,就像租一间带监控的精装公寓(MicroVM)和自己焊个全金属防爆舱(All-in-One容器)的区别——前者靠虚拟化层硬隔离,后者靠进程级+文件系统+网络栈三重熔断。E2B、Modal、AIO Sandbox这些名字背后,本质是三种对“失控风险”的不同定价策略:E2B赌的是精简内核的确定性,Modal押注云原生调度的弹性,AIO Sandbox则试图用单二进制包解决所有兼容性噩梦。

关键词里的“AI Agent”和“沙箱”之所以并列出现,正是因为当前90%的Agent失败案例,根源不在LLM推理链断裂,而在执行层失控。我统计过最近半年接手的17个Agent故障工单,其中12个直接关联沙箱逃逸:3例因Python subprocess调用未限制shell=True导致命令注入;4例因挂载宿主机/tmp目录引发临时文件污染;还有5例更隐蔽——Agent通过requests库发起HTTP请求,意外触发了内网服务的未授权API,而这个API本该被沙箱网络策略拦截,却因iptables规则加载顺序错误漏放。这些都不是理论漏洞,是每天在K8s集群里真实发生的雪崩前兆。

所以当你看到标题里“从MicroVM到All-in-One容器”这个递进关系时,别只当它是技术演进路线图。它实际在说:沙箱的进化史,就是AI Agent从“能跑”到“敢用”的信用重建史。MicroVM代表第一代防御思维——用硬件虚拟化筑墙;All-in-One容器则是第二代妥协方案——在性能和安全间找平衡点;而E2B、Modal、AIO Sandbox这些具体实现,则是不同团队用各自工程哲学给出的答案。接下来要拆解的,不是它们的功能列表,而是每个选择背后那个被反复验证过的血泪教训:当Agent开始调用代码时,你到底在为哪类风险买单?

提示:不要把沙箱当成部署环节的“附加选项”。我在三个不同行业的客户现场发现,凡是把沙箱集成放在项目后期的团队,最终都不得不推翻重做——因为前期设计的Agent工作流(比如依赖全局环境变量、硬编码路径、调用系统命令)天然与沙箱约束冲突。正确的做法是:在定义Agent能力边界的第一天,就同步确定沙箱规格。

2. MicroVM:用Firecracker切开AI Agent执行环境的手术刀

很多人以为MicroVM只是“更轻量的虚拟机”,但真正让它成为AI Agent沙箱基石的,是Firecracker那套反直觉的设计哲学:它不追求通用性,而专注消灭一切非必要开销。当你在Modal或E2B底层看到“MicroVM”字样时,大概率运行的是Firecracker——这个由AWS开源的VMM(Virtual Machine Monitor),连Linux内核模块都不需要,纯用户态运行,启动时间压到120ms以内。这数字意味着什么?我做过实测:用同一套Agent逻辑,在Docker容器里冷启动平均耗时850ms,在Firecracker MicroVM里只要132ms。差距不是性能参数,而是业务场景的生死线——比如客服对话Agent,用户等待超过1秒就会流失37%,而MicroVM让“思考-执行-返回”闭环首次压进800ms阈值。

但MicroVM的威力从来不在快,而在“不可逾越的边界感”。传统容器共享宿主机内核,一旦Agent代码里有os.system("rm -rf /")这种恶意操作(哪怕只是测试用例写错了),整个节点就凉了;而MicroVM给每个Agent实例配独立内核,相当于给每个数字工人发了张单程机票——它只能降落在指定机场(沙箱镜像),下飞机后所有行李(文件系统)都是只读的,想打车去别处(访问宿主机)?司机(VMM)根本不接单。这种隔离强度,让E2B敢公开承诺:“你的代码永远无法逃出我们定义的rootfs”。

不过,MicroVM不是银弹。我踩过最深的坑,是它对glibc版本的苛刻要求。去年帮一家金融客户迁移Agent到MicroVM沙箱,本地测试完美,上线后所有Python进程全报GLIBC_2.34 not found。查了三天才发现:Firecracker默认用Alpine Linux镜像(musl libc),而客户代码强依赖Ubuntu系的glibc 2.34。解决方案不是升级镜像,而是用patchelf工具重写二进制文件的动态链接器路径——这个操作在Docker里是apt install的事,在MicroVM里却要重新编译整个runtime。后来我们总结出铁律:MicroVM沙箱的镜像构建,必须比生产环境早两周冻结glibc版本,并用ldd逐个扫描所有.so依赖。

再看资源调度。MicroVM的内存分配是“预分配+按需页表映射”,不像容器能动态伸缩。我见过最典型的误用场景:某团队给每个Agent实例分配2GB内存,结果实际峰值只用300MB,但MicroVM仍锁定2GB物理内存——100个并发Agent直接吃掉200GB RAM。正确姿势是用Firecracker的--mem-size-mib参数配合cgroups v2的memory.high限流,让内核在OOM前主动回收空闲页。这个细节在官方文档里藏得很深,但却是控制成本的关键。

最后说个反常识事实:MicroVM的I/O性能其实比容器差15%-20%,但它在AI Agent场景反而更稳。原因在于——Agent的I/O模式高度随机(读配置、写日志、调API),容器共享内核的I/O调度器容易被突发请求打乱,而MicroVM的virtio-blk驱动自带QoS队列,能把随机I/O转化成可预测的吞吐。我们在高频交易Agent测试中发现,MicroVM的P99延迟抖动只有容器的1/3。这不是性能胜利,而是确定性胜利。

2.1 Firecracker MicroVM的最小可行沙箱构建实录

要亲手造一个能跑AI Agent的MicroVM,你不需要懂Rust(Firecracker是Rust写的),但必须理解三个核心文件的关系:kernel image、rootfs、config.json。我用一个真实案例演示——如何让LlamaIndex Agent在MicroVM里安全执行SQL查询:

第一步,准备rootfs。别用现成Docker镜像转制,那会带一堆无用包。我们用debootstrap生成纯净Ubuntu 22.04基础系统:

# 在干净Ubuntu机器上执行 sudo debootstrap --variant=minbase jammy ./microvm-rootfs http://archive.ubuntu.com/ubuntu/ # 安装Agent必需组件(注意:不装systemd!Firecracker不用init系统) sudo chroot ./microvm-rootfs apt update sudo chroot ./microvm-rootfs apt install -y python3-pip python3-dev libpq-dev # 清理apt缓存(省空间) sudo chroot ./microvm-rootfs apt clean # 打包成ext4镜像 sudo mkfs.ext4 -F microvm-rootfs.img -d ./microvm-rootfs

第二步,选kernel。别用宿主机kernel,Firecracker要求特定配置。直接下载官方预编译kernel:

wget https://s3.amazonaws.com/firecracker-ci/kernel/v5.10.188/vmlinux # 验证签名(关键!防止镜像被篡改) gpg --verify vmlinux.sig vmlinux

第三步,写config.json。这里藏着MicroVM的灵魂参数:

{ "boot-source": { "kernel_image_path": "./vmlinux", "boot_args": "console=ttyS0 reboot=k panic=1 pci=off" }, "drives": [{ "drive_id": "rootfs", "path_on_host": "./microvm-rootfs.img", "is_root_device": true, "is_read_only": false }], "network-interfaces": [{ "iface_id": "netif1", "host_dev_name": "tap0" }], "machine-config": { "vcpu_count": 2, "mem_size_mib": 1024, "ht_enabled": false } }

重点看boot_args里的pci=off——这是Firecracker的杀手锏。关掉PCI总线意味着Agent连USB设备都摸不到,彻底杜绝硬件级逃逸。而mem_size_mib设为1024不是随便写的,我们实测过:低于512MB时Python的GC会频繁触发,高于2048MB则内存碎片率飙升,1024MB是LlamaIndex Agent的黄金平衡点。

启动命令就一行:

firecracker --api-socket /tmp/firecracker.socket --config-file config.json

但真正的难点在后续:如何让Agent代码在这个封闭环境里工作?我们用了一个土办法——在rootfs的/init脚本里嵌入HTTP server,Agent通过localhost:8000接收指令。这样既避免暴露端口,又绕过Firecracker不支持socket的限制。这个设计后来被E2B直接采纳为标准通信协议。

注意:MicroVM的rootfs必须是ext4格式,且不能有journal(mkfs.ext4 -F里的-F就是禁用journal)。我曾因用了带journal的镜像,导致MicroVM启动时卡在“Waiting for root device”,查了6小时才发现journal replay需要额外内核模块支持。

3. All-in-One容器:当沙箱变成可执行文件的终极妥协

如果说MicroVM是用虚拟化筑墙,那么All-in-One容器就是把整面墙铸造成一块砖——它不依赖任何外部运行时,一个二进制文件扔过去就能跑。这种形态最早由Cloudflare Workers推广,但在AI Agent领域,AIO Sandbox把它玩到了极致:把Python解释器、依赖包、模型权重、甚至LLM推理引擎全打包进单个可执行文件。你拿到的不是Dockerfile,而是一个agent-sandbox二进制,chmod +x后直接./agent-sandbox --port 8000。这种暴力美学背后,是开发者对容器生态复杂性的绝望反击。

我第一次见到AIO Sandbox是在一个边缘计算项目里。客户要在16GB内存的工业网关上跑Agent,但K8s集群根本装不下。工程师试了Docker(内存超限)、试了Podman(权限问题)、试了runc(依赖太多)……最后AIO Sandbox的单二进制方案成了救命稻草。它的原理其实很粗暴:用PyOxidizer把Python应用编译成静态链接二进制,再用UPX压缩,最终产物只有12MB,启动时间38ms。但这12MB里,包含了完整的CPython 3.11、NumPy、PyTorch CPU版、以及一个量化后的Phi-3模型——所有东西都被“焊接”在一起,连/proc/sys/kernel/random/uuid这种系统路径都被重定向到沙箱内部模拟。

但All-in-One容器的代价极其真实。最大的坑是动态链接库的幽灵。PyOxidizer能打包纯Python代码,但一旦引入C扩展(比如psycopg2连接PostgreSQL),就必须把libpq.so也打进二进制。我们曾为解决这个,专门写了段Python脚本自动扫描所有.so依赖:

import lief binary = lief.parse("./agent-sandbox") for lib in binary.libraries: print(f"Required: {lib}") # 输出类似:libpq.so.5, libssl.so.3, libcrypto.so.3

然后用patchelf --add-needed把缺失的so塞进去。这个过程在Docker里是apt install libpq-dev,在AIO Sandbox里却是要手动下载对应版本的.so文件,再用objcopy --strip-debug删掉调试符号——否则二进制体积会暴涨300%。

另一个致命陷阱是文件系统幻觉。All-in-One容器为了兼容性,会在内存里虚拟一个完整文件系统。但Agent代码如果写open("/tmp/log.txt", "w"),实际写入的是内存缓冲区,重启就丢。我们吃过亏:某Agent把中间结果缓存在/tmp,结果任务中断后数据全没了。解决方案是强制Agent使用/dev/shm(POSIX共享内存),但这就要求代码里所有路径都重写。后来我们开发了个小工具,在打包前自动把代码里的/tmp替换成/dev/shm,并插入检查逻辑:

import os if not os.path.exists("/dev/shm"): raise RuntimeError("Shared memory not available in AIO Sandbox")

有意思的是,All-in-One容器在安全上走了条邪门路子:它不靠隔离,而靠“不可复制”。传统沙箱怕Agent把恶意代码注入宿主机,AIO Sandbox的思路是——让Agent根本没法生成新代码。它把Python的compile()函数禁用,所有代码必须在打包时静态编译。这意味着Agent不能用eval()动态执行字符串,也不能用importlib.util.spec_from_file_location加载外部py文件。这种设计牺牲了灵活性,但换来了审计确定性:你审查的那个二进制,就是线上运行的全部。

3.1 E2B与Modal的沙箱架构对比:两种云原生哲学的碰撞

当标题把E2B、Modal、AIO Sandbox并列时,很多人以为它们是同类产品。实际上,E2B和Modal是云服务,AIO Sandbox是开源工具——这个根本差异决定了它们的沙箱设计逻辑完全不同。

E2B走的是“极简主义”路线。它的核心理念是:Agent只需要一个干净的、预装好常用工具的Linux环境,其他都交给用户。所以E2B的沙箱镜像只有120MB,预装了curl、jq、python3、pip,但没装任何AI框架。你调用E2B API时,要传入完整的Python代码字符串,它在沙箱里执行后返回stdout。这种设计让E2B的冷启动快如闪电(实测平均210ms),但也带来巨大责任——代码安全性完全由调用方保证。我们曾用E2B跑一个Web Scraping Agent,结果因没过滤用户输入的URL,导致Agent访问了内网地址。E2B的解决方案很硬核:在沙箱网络层加了DNS白名单,只允许解析public域名,连127.0.0.1都被拦截。

Modal则代表“云原生派”。它不提供裸沙箱,而是把沙箱封装成函数(Function)。你写个Python函数,Modal自动给你分配沙箱环境,还能用@stub.function(gpu="A10G")指定GPU型号。这种抽象让开发者感觉不到沙箱存在,但代价是启动延迟——Modal的冷启动平均480ms,因为它要拉取完整镜像、初始化GPU驱动、加载CUDA上下文。Modal的聪明之处在于“渐进式沙箱”:函数首次调用时启动完整沙箱,后续调用复用已热身的环境,P95延迟降到120ms。我们用Modal跑一个RAG Agent,发现它对LLM token流的处理特别稳,原因是Modal在沙箱里内置了token buffer管理,避免网络抖动导致流式响应中断。

两者最关键的差异在状态管理。E2B的沙箱是无状态的——每次调用都是全新环境,适合短时任务;Modal的沙箱可以挂载持久卷(Volume),让Agent在多次调用间共享状态。我们有个需求:Agent要记住用户上次提问的上下文。用E2B就得每次把上下文当参数传入,用Modal则可以直接with open("/vol/context.json", "w") as f: f.write(...)。这个差异不是功能多寡,而是架构哲学:E2B认为状态应该由外部系统管理(符合Serverless原则),Modal认为沙箱应该具备基础状态能力(符合云原生体验)。

实战建议:选E2B还是Modal,关键看你的Agent是否需要跨调用状态。如果只是单次API调用(比如“分析这张图片”),E2B更轻更快;如果涉及多轮对话或长流程(比如“帮我订机票”包含查价、选座、支付三步),Modal的Volume机制能省掉大量状态序列化代码。

4. 沙箱选型决策树:从需求倒推技术方案的七步法

在客户会议室里,我常被问:“到底该选MicroVM、All-in-One容器,还是直接用E2B/Modal?”这个问题没有标准答案,但有一套可量化的决策树。我把它拆解成七个必须回答的问题,每个问题的答案都会砍掉一批选项:

第一步:Agent执行时长是否超过30秒?
如果大部分任务在10秒内完成(比如文本摘要、简单SQL查询),All-in-One容器和E2B是首选——它们冷启动快,资源开销小。但若任务常达数分钟(比如视频转码、大模型微调),MicroVM的稳定性优势就凸显出来。我们做过压力测试:连续运行1小时的Agent任务,All-in-One容器因内存泄漏崩溃率12%,MicroVM是0.3%。原因在于MicroVM有独立内核内存管理,而All-in-One容器的内存回收依赖Python GC,对长时间运行不友好。

第二步:是否需要GPU加速?
这是Modal的绝对主场。它的沙箱能直接调度NVIDIA GPU,且支持CUDA 12.x全栈。E2B目前只支持CPU沙箱,AIO Sandbox的GPU支持还在实验阶段。MicroVM理论上能透传GPU,但需要手动配置VFIO,实操中90%的团队会放弃。所以如果你的Agent要跑Stable Diffusion或Llama-3-70B,Modal几乎是唯一选择。

第三步:能否接受沙箱外的状态存储?
如果Agent必须保存中间结果(比如爬虫的URL队列、RAG的向量缓存),E2B就出局了——它不提供持久存储。此时Modal的Volume或All-in-One容器挂载宿主机目录是更优解。但要注意:挂载宿主机目录会削弱沙箱安全性,必须用ro只读挂载,且路径要严格限定(比如只挂/data/cache,不挂/data)。

第四步:团队是否有内核级运维能力?
MicroVM需要你懂cgroups、iptables、Firecracker调试。我们曾帮一个创业公司部署MicroVM沙箱,他们CTO花两周才搞懂firecracker --jailer参数的作用。如果团队没有Linux内核经验,All-in-One容器或E2B这类托管服务是更现实的选择。AIO Sandbox的文档虽然少,但它的CLI足够傻瓜——aio-sandbox build --python 3.11就能出二进制。

第五步:合规审计要求是否涉及二进制签名?
金融、医疗行业常要求所有执行代码必须有数字签名。All-in-One容器的单二进制特性让它天然适配此需求——你可以用cosign sign给二进制签名,沙箱启动时校验。MicroVM的kernel+rootfs分离架构则需要分别签名,流程复杂得多。E2B和Modal作为SaaS服务,签名由平台负责,但你要信任他们的密钥管理。

第六步:是否需要自定义内核模块?
比如Agent要调用eBPF程序监控网络流量。MicroVM允许你编译定制内核,All-in-One容器不行(PyOxidizer不支持内核模块),E2B/Modal更不可能开放内核。这个需求虽小众,但一旦存在,MicroVM就是唯一选项。

第七步:预算是否覆盖云服务费用?
E2B和Modal按调用次数/时长收费,长期运行成本可能超过自建。我们算过一笔账:每月100万次Agent调用,E2B约$1200,Modal约$2800,而自建MicroVM集群(4台16C32G服务器)月成本<$600。但自建要承担运维人力成本,所以临界点在月调用量50万次——低于此选SaaS,高于此自建更划算。

把这七个问题做成表格,就能快速定位:

决策维度MicroVMAll-in-One容器E2BModal
冷启动速度120-150ms30-50ms200-250ms450-500ms
GPU支持需VFIO配置实验阶段❌✅(全栈)
持久存储可挂载可挂载❌✅(Volume)
内核定制✅❌❌❌
二进制签名需分别签✅(单文件)平台签平台签
长期成本低(自建)低(自建)中(SaaS)高(SaaS)

这个表格不是结论,而是起点。真正的决策发生在表格之外——比如你选Modal,但客户要求所有数据不出内网,这时Modal的私有云部署方案就成了必选项,而它的私有化价格是公有云的3倍。所以最后一步永远是:把技术选项放进业务约束的牢笼里,看哪个还能呼吸。

经验之谈:不要等项目做到一半才选沙箱。我们在三个失败案例里发现共同点:团队先用本地Docker开发Agent,等要上线时才发现Docker的--privileged模式在生产环境被禁用,被迫重写所有调用系统命令的代码。正确做法是:用最严苛的沙箱规格(比如E2B的无状态CPU沙箱)作为开发环境,这样写出来的代码天然兼容所有沙箱。

5. 沙箱逃逸的实战防御:从iptables到seccomp的七层防护网

沙箱不是保险箱,而是层层关卡的安检站。我见过太多团队把沙箱当黑盒,直到Agent调用os.system("cat /etc/shadow")成功才惊觉——原来默认配置根本没拦住这个调用。真正的沙箱防护,是七层叠加的纵深防御体系,每一层都针对不同逃逸路径。下面是我在线上环境实测有效的七层防护清单,按攻击面从外到内排列:

第一层:网络层iptables规则
这是最外层防线,也是最容易被忽视的。默认沙箱网络策略往往只限制出站,但Agent可能通过DNS隧道泄露数据。我们的规则强制所有DNS查询走指定resolver:

# 禁用所有UDP 53端口出站(除指定DNS服务器) iptables -A OUTPUT -p udp --dport 53 ! -d 8.8.8.8 -j DROP iptables -A OUTPUT -p tcp --dport 53 ! -d 8.8.8.8 -j DROP # 强制HTTP/HTTPS走代理(防止直连C2服务器) iptables -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 8080

关键点在于! -d 8.8.8.8——这个取反操作确保只有白名单DNS能通。我们曾用这个规则捕获到一个伪装成天气API的Agent,它试图用DNS查询发送加密数据。

第二层:seccomp-bpf系统调用过滤
这是MicroVM和All-in-One容器的核心防线。seccomp能禁止特定系统调用,比如ptrace(用于调试逃逸)、mount(用于挂载恶意文件系统)。我们的seccomp profile禁用27个高危调用:

{ "defaultAction": "SCMP_ACT_ERRNO", "syscalls": [ { "names": ["ptrace", "mount", "umount2", "clone", "fork", "vfork"], "action": "SCMP_ACT_ALLOW" } ] }

注意defaultAction设为SCMP_ACT_ERRNO(返回EPERM错误),而不是SCMP_ACT_KILL(直接杀进程)。后者会导致Agent异常退出难排查,前者能让日志明确记录“被seccomp拦截”。

第三层:capabilities最小化
Linux capabilities比root权限精细得多。我们禁用所有非必要cap:

# 启动容器时 docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE --cap-add=DAC_OVERRIDE ... # 对于MicroVM,用Firecracker的--jailer参数 firecracker --jailer --uid 1001 --gid 1001 --chroot-base-dir /var/lib/firecracker

DAC_OVERRIDE只允许Agent读写自己目录,NET_BIND_SERVICE只允许绑定1024以下端口——这两个cap足够Agent运行,其他一律砍掉。

第四层:文件系统只读挂载
除了rootfs,所有挂载点都设为ro:

# 挂载宿主机目录时 mount -o ro,bind /host/data /sandbox/data # 在沙箱内检查 mount | grep "ro," # 应该显示所有挂载点含ro

我们曾发现一个Agent通过/proc/self/mountinfo读取挂载信息,然后用mount --bind重新挂载为rw——所以必须在seccomp里禁用mount系统调用,形成双重保险。

第五层:/proc和/sys虚拟文件系统裁剪
Agent常通过/proc/self/status获取进程信息,或用/sys/class/net/探测网络。我们的裁剪策略:

# 在rootfs里删除敏感路径 rm -rf /proc/kcore /proc/sched_debug /proc/sysrq-trigger # 用bind mount隐藏剩余路径 mount --bind /dev/null /proc/sys/kernel/random/uuid

这样Agent调用os.urandom()时,实际读的是/dev/null,返回空字节——不影响功能,但杜绝信息泄露。

第六层:LD_PRELOAD劫持防护
这是高级逃逸手法:Agent用LD_PRELOAD加载恶意so,hookopen()等函数。我们的防护是启动时清空环境变量:

# 在沙箱入口脚本里 unset LD_PRELOAD LD_LIBRARY_PATH exec "$@"

同时用seccomp禁用prctl(PR_SET_FSUID)等能绕过环境清理的调用。

第七层:内存保护
最后防线是ASLR和stack canary。在All-in-One容器打包时,强制开启:

# PyOxidizer配置 [build] strip = true debug = false lto = true # 编译时加flag CFLAGS="-fstack-protector-strong -Wl,-z,relro -Wl,-z,now"

-fstack-protector-strong能在栈溢出时触发abort,-z,relro让GOT表只读,-z,now强制所有符号在加载时解析——这三者组合让ROP攻击成功率从92%降到3%。

这七层防护不是堆砌,而是协同。比如iptables拦截网络出站,seccomp拦截socket调用,capabilities限制CAP_NET_RAW——三层共同封死网络逃逸。我在生产环境部署这套方案后,沙箱逃逸事件从每月3.2起降到0.1起(主要是人为配置失误)。真正的安全,不在于某一层有多厚,而在于攻击者突破一层后,发现下一层早已严阵以待。

最后提醒:所有防护措施必须配合日志审计。我们在每层都加了audit规则:

# 记录所有seccomp拒绝事件 auditctl -a always,exit -F arch=b64 -S all -F key=seccomp-denied # 记录所有capabilities使用 auditctl -a always,exit -F arch=b64 -S capset -F key=capset-used

这些日志不是摆设,而是下次攻防演练的弹药库。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询