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

编辑

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

编辑

此功能处于测试阶段,可能随时更改。其设计和代码不如正式 GA 功能成熟,按现状提供,不提供任何担保。测试版功能不受正式 GA 功能支持服务水平协议 (SLA) 的约束。

在 Linux 3.17 及更高版本上,Heartbeat 可以利用安全计算模式,也称为 seccomp。Seccomp 限制了进程可以发出的系统调用。具体来说,Heartbeat 可以在进程启动时加载 seccomp BPF 过滤器,从而降低调用特定系统调用的权限。进程加载过滤器后,便无法将其删除。

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

过滤器表示为 Berkeley Packet Filter (BPF) 程序。BPF 程序是根据 Heartbeat 定义的策略生成的。策略也可以通过配置进行自定义。

由于系统调用因架构而异,因此 seccomp 策略是特定于架构的。Heartbeat 包含 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,并且该事件将包含有关进程和系统调用的信息。