跳到主要内容
版本:v0.6

对比测试

本测试模拟真实场景,对不同的 enforcer 进行对比测试。我们使用 Phoronix Test Suite (PTS),针对一些常见负载(Redis、Apache 等)进行了一系列自动化性能测试。

测试环境

  • 集群版本 v1.26.10-vke.18
  • 节点数 3
  • 节点主机默认启用 AppArmor & BPF LSM
  • 节点规格 ecs.g3i.xlarge (4vCPU 16GiB)

测试场景

在本轮测试中,我们对 AppArmor、BPF 这两种 enforcer 进行横向对比测试,每个 enforcer 都选取三种典型场景,包括 AlwaysAllow、RuntimeDefault、EnhanceProtect,每个场景的 policy 如下所示:

  • Init 基准测试

    不应用任何策略。

  • AlwaysAllow

    使用 AlwaysAllow Mode 进行测试,不开启任何 rule。

  • RuntimeDefault

    使用 RuntimeDefault Mode 进行测试,不开启任何 rule。

  • EnhanceProtect

    使用 EnhanceProtect Mode 进行测试,开启如下 rules。

    • disable-cap-privileged
    • disallow-umount
    • disallow-access-procfs-root
    • mitigate-disk-device-number-leak
    • mitigate-sa-leak
    • mitigate-overlayfs-leak
    • Mitigate-host-ip-leak
    • Disallow-metadata-service
    • cgroups-lxcfs-escape-mitigation
    • runc-override-mitigation

此外,我们也对 Seccomp enforcer 进行了测试,开启了 4 条 Seccomp 内置规则(该测试仅供参考)。 所有测试用到的 policy 文件均可在 test/perf/policy 目录下找到。

测试步骤

我们编写了一个 bash 脚本用于实现自动化测试,该脚本主要完成如下任务:

  • 在 Kubernetes 集群中创建和删除 Pod。
  • 应用和移除不同的安全策略。
  • 初始化测试配置,安装测试工具,运行 Phoronix 测试套件。
  • 记录测试结果。

特别地,对于 Init、 BPF 和 Seccomp 模式,我们使用了不同的 Pod 配置,例如通过设置 container.apparmor.security.beta.kubernetes.io/phoronix: unconfined 来确保禁用 AppArmor,避免运行时组件默认开启的 AppArmor Profile 影响测试结果。

您可以在 test/perf/policy 目录下找到 Pod 定义和 Phoronix 运行配置。您可以在 test/perf 目录下找到自动化测试脚本。此外我们针对 sysbench 和 unixbench 也编写了单独的测试脚本,如果您感兴趣也可以自行进行测试。

测试结果

  • EnhanceProtect: BPF 的性能相比 AppArmor 下降了约 1.2%。
  • RuntimeDefault: BPF 的性能相比 AppArmor 下降了约 0.6%。
  • AlwaysAllow: BPF 的性能相比 AppArmor 下降了约 0.1%。

image

测试结果表明,虽然 BPF 相对于 AppArmor 在不同场景下通常表现出轻微的性能下降,但差异相对较小。这表明 BPF 是 AppArmor 的可行替代方案,在安全应用中具有可接受的性能损耗。

下面是各项的详细测试结果:

Phoronix-Apache

Requests Per Second-Higher is better

Test ScenarioApache Concurrent Requests 4Apache Concurrent Requests 20Apache Concurrent Requests 100Apache Concurrent Requests 200Apache Concurrent Requests 500Apache Concurrent Requests 1000
NoProtect16838.617073.816961.7816619.6514029.1911944.99
AlwaysAllow AppArmor16469.4116505.8416764.1416312.6913750.2411729.78
AlwaysAllow BPF16452.9416489.3316747.3816296.3813736.4911718.05
RuntimeDefault AppArmor16376.5416067.0916461.3916242.6913385.8711599.9
RuntimeDefault BPF16360.1616051.0216444.9316226.4513372.4811588.3
Enhance AppArmor15833.4315802.8416385.1916101.5113276.1611429.32
Enhance BPF15817.615787.0416368.816085.4113262.8811417.89
Seccomp14882.4315035.1215454.2415312.2512870.2811162.86

Phoronix-GIMP

Time Usage-Lower is better

Test ScenarioGIMP Resize TimesGIMP RotateTimesGIMP Auto-Levels TimesGIMP Unsharp-Mask Times
NoProtect16.61611.84216.54319.888
AlwaysAllow AppArmor16.67211.95116.65820.04
AlwaysAllow BPF16.87212.09416.85820.28
RuntimeDefault AppArmor16.73711.97716.73420.221
RuntimeDefault BPF16.76212.04416.88720.289
Enhance AppArmor16.85511.95816.81420.312
Enhance BPF16.87612.10116.94720.411
Seccomp16.91512.86318.08221.096

Phoronix-Redis

Requests Per Second-Higher is better

Test ScenarioGET Connection 50SETConnection 50GETConnection 500SET Connection 500LPOPConnection 500
NoProtect23565171612305194451416140232298349
AlwaysAllow AppArmor23368921610689193603516051862287682
AlwaysAllow BPF23228701601025192441815955552273956
RuntimeDefault AppArmor23160041610480195758615981562281477
RuntimeDefault BPF23021081600817194584015885672267788
Enhance AppArmor23144581597515192952815896302252763
Enhance BPF23005711587930191795115800932239246
Seccomp22804761596606187522915470452316358

Phoronix-Sysbench

Higher is better

Test ScenarioSysbenchRam/MemorySysbenchCPU
NoProtect4189.512831.65
AlwaysAllow AppArmor4030.552821.5
AlwaysAllow BPF4026.5192818.679
RuntimeDefault AppArmor4023.672818.7
RuntimeDefault BPF4019.6462815.881
Enhance AppArmor3939.252808.13
Enhance BPF3935.3112805.322
Seccomp4138.072832.87