头图

环境

操作系统:阿里云 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-83-generic x86_64)

软件版本:Filebeat 7.10.2

用户:root

运行

  1. 下载

这里下载 filebeat 7.10.2。

  1. 配置

简单配置一下 filebeat.yml,从标准输入采集,写入到标准输出 :

filebeat.inputs:
- type: stdin

output.console:
  pretty: true
  1. 运行

因为使用 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: allow
  syscalls:
  - action: allow
    names:
    - 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 种解决办法:

  1. 关闭 seccomp(不推荐)
  2. 添加 seccomp 配置,允许 rseq 系统调用

验证

  1. 关闭 seccomp
filebeat.inputs:
- type: stdin

output.console:
  pretty: true

seccomp:
  enabled: false

但关闭 seccomp,就不能基于最小特权原则限制 filebeat 的系统调用,进而最大限度的减少未知漏洞的影响。

  1. 添加 seccomp 配置,允许 rseq 系统调用
filebeat.inputs:
- type: stdin

output.console:
  pretty: true

seccomp:
  default_action: allow
  syscalls:
  - action: allow
    names:
    - rseq


极限实验室
9 声望2 粉丝

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。