环境
操作系统:阿里云 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-83-generic x86_64)
软件版本:Filebeat 7.10.2
用户:root
运行
- 下载
从这里下载 filebeat 7.10.2。
- 配置
简单配置一下 filebeat.yml,从标准输入采集,写入到标准输出 :
filebeat.inputs:
- type: stdinoutput.console:pretty: true
- 运行
因为使用 root 用户,根据官方建议添加 --strict.perms=false
参数。
直接运行 ./filebeat -e --strict.perms=false:
出现异常:
runtime/cgo: pthread_create failed: Operation not permitted
SIGABRT: abort
PC=0x7f123c7cc9fc m=3 sigcode=18446744073709551610
分析
网上搜索一下问题,发现有位网友也遇到了同样问题,并且解决了,解决方案是添加如下配置:
seccomp:default_action: allowsyscalls:- action: allownames:- rseq
通过官网文档了解 seccomp:在 Linux 3.17 及更高版本上,Filebeat 使用安全计算模式,也称为 Seccomp。Seccomp 限制进程可以发出的系统调用,默认开启。
结合网友的解决方案,得出初步结论:Filebeat 7.10.2 运行在 Ubuntu 22.04 上时缺少 rseq
系统调用,导致异常。
通过查找 syscall
错误:
goroutine 44 [syscall]:
syscall.Syscall(0x0, 0x0, 0xc00070c000, 0x4000, 0xc000122000, 0x800000, 0x7ffff800000)/usr/local/go/src/syscall/asm_linux_amd64.s:18 +0x5
syscall.read(0x0, 0xc00070c000, 0x4000, 0x4000, 0x0, 0x0, 0x16e3b0e)/usr/local/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
syscall.Read(...)/usr/local/go/src/syscall/syscall_unix.go:189
在官网找到相关问题,因为 glibc >= 2.35
,但 beats 里允许的默认系统调用中没有 rseq 导致的异常。问题已在 7.17.2 版本修复。
验证 glibc 版本,确实为 2.35。
最终得出结论:因为 glibc >= 2.35,但 beats 里允许的默认系统调用中没有 rseq 导致的异常。
总结
通过上面的问题分析,得出有如下 2 种解决办法:
- 关闭 seccomp(不推荐)
- 添加 seccomp 配置,允许 rseq 系统调用
验证
- 关闭 seccomp
filebeat.inputs:
- type: stdinoutput.console:pretty: trueseccomp:enabled: false
但关闭 seccomp,就不能基于最小特权原则限制 filebeat 的系统调用,进而最大限度的减少未知漏洞的影响。
- 添加 seccomp 配置,允许 rseq 系统调用
filebeat.inputs:
- type: stdinoutput.console:pretty: trueseccomp:default_action: allowsyscalls:- action: allownames:- rseq