使用 Linux 安全计算模式 (seccomp)

编辑

使用 Linux 安全计算模式 (seccomp)编辑

此功能处于 Beta 阶段,可能会发生变化。其设计和代码比正式 GA 功能还不成熟,按“现状”提供,不提供任何担保。Beta 功能不受正式 GA 功能的支持 SLA 的约束。

在 Linux 3.17 及更高版本上,Metricbeat 可以利用安全计算模式,也称为 seccomp。Seccomp 限制了进程可以发出的系统调用。具体来说,Metricbeat 可以在进程启动时加载 seccomp BPF 过滤器,以降低调用特定系统调用的权限。一旦过滤器被进程加载,就不能再将其删除。

内核公开了许多 Metricbeat 未使用的系统调用。通过安装 seccomp 过滤器,您可以限制暴露给 Metricbeat 的总内核表面积(最小特权原则)。这将最大程度地减少在进程中可能发现的未知漏洞的影响。

该过滤器表示为伯克利数据包过滤器 (BPF) 程序。BPF 程序是根据 Metricbeat 定义的策略生成的。该策略也可以通过配置进行自定义。

Seccomp 策略是特定于架构的,因为系统调用因架构而异。Metricbeat 包含针对 amd64 和 386 架构的“白名单”seccomp 策略。您可以查看这些策略 此处

Seccomp 策略配置编辑

可以通过配置策略自定义 seccomp 策略。这是一个禁止 execveexecveatforkvfork 系统调用的示例“黑名单”策略。

seccomp:
  default_action: allow 
  syscalls:
  - action: errno 
    names: 
    - execve
    - execveat
    - fork
    - vfork

如果进程调用的系统调用与下面列出的名称不匹配,则允许调用该系统调用。

如果进程调用的系统调用与下面列出的名称匹配,则向调用者返回错误。这被称为“黑名单”策略。

以下是正在禁止的系统调用。

以下是 seccomp 策略的配置选项。

enabled
在 Linux 上,此选项默认情况下处于启用状态。要禁用 seccomp 过滤器加载,请将此选项设置为 false
default_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 报告系统上发生的任何 seccomp 违规行为。内核为每次违规行为生成一个事件,Auditbeat 会报告该事件。该 event.action 值将为 violated-seccomp-policy,并且该事件将包含有关进程和系统调用的信息。