使用 Linux Secure Computing Mode (seccomp)
此功能处于 Beta 版,可能会发生更改。其设计和代码的成熟度不如正式 GA 功能,且按原样提供,不附带任何保证。Beta 功能不受正式 GA 功能的支持 SLA 的约束。
在 Linux 3.17 及更高版本中,Auditbeat 可以利用安全计算模式,也称为 seccomp。Seccomp 限制了进程可以发出的系统调用。具体来说,Auditbeat 可以在进程启动时加载一个 seccomp BPF 过滤器,该过滤器会丢弃调用特定系统调用的权限。一旦过滤器被进程加载,就无法将其移除。
内核暴露了大量 Auditbeat 未使用的系统调用。通过安装 seccomp 过滤器,您可以限制暴露给 Auditbeat 的总内核表面积(最小权限原则)。这可以最大程度地减少在进程中可能发现的未知漏洞的影响。
过滤器表示为 Berkeley Packet Filter (BPF) 程序。BPF 程序是基于 Auditbeat 定义的策略生成的。策略也可以通过配置进行自定义。
由于系统调用因架构而异,seccomp 策略是特定于架构的。Auditbeat 为 amd64 和 386 架构包含了一个白名单 seccomp 策略。您可以在 此处 查看这些策略。
seccomp 策略可以通过配置策略进行自定义。这是一个黑名单策略示例,它禁止 execve、execveat、fork 和 vfork 系统调用。
seccomp:
default_action: allow
syscalls:
- action: errno
names:
- execve
- execveat
- fork
- vfork
- 如果进程调用的系统调用不匹配以下名称之一,则允许该调用。
- 如果进程调用的系统调用与以下名称之一匹配,则会向调用方返回错误。这被称为黑名单策略。
- 这些是被禁止的系统调用。
这些是 seccomp 策略的配置选项。
启用- 在 Linux 上,此选项默认启用。要禁用 seccomp 过滤器加载,请将此选项设置为
false。 default_action- 当没有定义的系统调用匹配时要采取的默认操作。有关操作的完整列表,请参阅 action。这是必需的。
syscalls- 此列表中的每个对象都必须包含一个
action和一个系统调用names列表。列表必须至少包含一项。 names- 系统调用名称列表。系统调用名称必须对运行时体系结构存在,否则将记录错误,并且不会安装过滤器。至少必须定义一个系统调用。
action-
当执行
names中列出的任何系统调用时要采取的操作。这是必需的。这些是可用的操作值。可用的操作取决于内核版本。errno- 系统调用将向调用方返回EPERM(权限被拒绝)。trace- 内核将通知ptrace跟踪器。如果没有跟踪器,则系统调用会因ENOSYS(函数未实现)而失败。trap- 内核将向调用线程发送SIGSYS信号,并且不会执行系统调用。Go 运行时将退出。kill_thread- 内核将立即终止该线程。其他线程将继续执行。kill_process- 内核将终止该进程。在 Linux 4.14 及更高版本中可用。log- 内核将在执行系统调用之前将其记录下来。在 Linux 4.14 及更高版本中可用。(这不会记录到 Beat 的日志中。)allow- 内核将允许执行该系统调用。
您可以使用 Auditbeat 报告系统上发生的任何 seccomp 违规。内核为每次违规生成一个事件,Auditbeat 报告该事件。event.action 值将是 violated-seccomp-policy,并且该事件将包含有关进程和系统调用的信息。