跳到主要内容
版本:main

自定义规则

vArmor 支持用户基于 enforcer 的语法,在 EnhanceProtect 和 DefenseInDepth 模式下自定义访问控制规则。其中 AppArmor、BPF 和 NetworkProxy 通过规则限定词(qualifiers)控制规则的处置动作与审计行为;Seccomp 则使用 OCI 规范的 action 语义(如 SCMP_ACT_ERRNO)。

不同 enforcer 识别的规则限定词(qualifiers)集合并不相同,据此可推导出的动作如下表所示:

Enforcer可识别的 Qualifiers可产生的动作
AppArmorallow / deny / audit,规则为原始 AppArmor 文本,由编写者直接写入DENIED / AUDIT
BPFdeny、auditDENIED / AUDIT
NetworkProxyallow、deny、audit,并与 defaultAction 组合DENIED / AUDIT

表中“可产生的动作”指由规则限定词推导出的动作,因此都不含 ALLOWED。ALLOWED 与任何限定词无关,仅在 DefenseInDepth 模式且 allowViolations=true 时,对未被允许清单覆盖的访问放行并记录,详见策略模式的处置动作与审计。

AppArmor enforcer​

AppArmor enforcer 支持用户根据 AppArmor 的语法定制策略。

请参见此 文档 在 .spec.policy.enhanceProtect.appArmorRawRules 或 .spec.policy.defenseInDepth.appArmor.appArmorRawRules 字段中设置自定义规则。请确保每条规则以 ',' 结尾。

示例:

policy:
enforcer: AppArmor
mode: EnhanceProtect
enhanceProtect:
# Audit the actions that violate the built-in rules.
# Any detected violation will be logged to /var/log/varmor/violations.log file in the host.
# It's disabled by default.
auditViolations: true
attackProtectionRules:
- rules:
- disable-chmod
- rules:
- mitigate-sa-leak
targets:
- "/bin/bash"
- "/bin/dash"
- "/bin/sh"
appArmorRawRules:
- rules: |
audit deny /etc/hosts r,
audit deny /etc/shadow r,
- rules: "audit deny /etc/hostname r,"
targets:
- "/bin/bash"

Seccomp enforcer​

Seccomp enforcer 支持用户根据 OCI 规范的语法定制策略。

请参见此 文档 在 .spec.policy.enhanceProtect.syscallRawRules 或 .spec.policy.defenseInDepth.seccomp.syscallRawRules 字段中设置自定义的系统调用规则。

示例:

policy:
enforcer: Seccomp
mode: EnhanceProtect
enhanceProtect:
syscallRawRules:
# disallow chmod +x XXX, chmod 111 XXX, chmod 001 XXX, chmod 010 XXX...
- names:
- fchmodat
action: SCMP_ACT_ERRNO
args:
- index: 2
value: 0x40 # S_IXUSR
valueTwo: 0x40
op: SCMP_CMP_MASKED_EQ
- index: 2
value: 0x8 # S_IXGRP
valueTwo: 0x8
op: SCMP_CMP_MASKED_EQ
- index: 2
value: 1 # S_IXOTH
valueTwo: 1
op: SCMP_CMP_MASKED_EQ

BPF enforcer​

BPF 强制访问控制器支持通过自定义规则限制文件访问、程序执行、网络和挂载等操作。

规则数量与节点容量​

各类规则上限如下,按每份最终生成的 BPF 配置分别计算:

规则类型上限
文件访问64 条
程序执行64 条
网络(socket 与出站规则合计)64 条
挂载:节点支持 bpf_loop64 条
挂载:节点不支持 bpf_loop50 条

Agent 自动检测节点是否支持 bpf_loop 并选择对应的挂载规则上限。策略部署到多个节点时,应满足其中上限较低节点的要求。

规则数量按生成后的条目计数,不是 YAML 中的规则项数。内置规则与自定义规则生成的条目共同占用对应类型的额度;一条配置可能生成多条规则。toServices、toPods 匹配的目标变化也可能增加网络规则条目。capabilities 和 ptrace 配置不适用上述列表条数限制。

每个节点最多同时为 256 个容器启用 BPF 防护。 这是节点上所有 BPF 策略共享的容量,不是每个策略或每个命名空间各有 256 个名额;也不是节点可运行的容器总数上限。

自定义规则语法​

请参考 BpfRawRules 和以下语法,在 .spec.policy.enhanceProtect.bpfRawRules 中设置自定义规则。

  • File Permission

    权限 / 权限缩写隐含权限说明
    read / r-
    rename
    hard link
    禁止读
    禁止利用 rename oldpath newpath 绕过 oldpath 的读限制
    禁止利用 ln TARGET LINK_NAME 绕过 TARGET 的读限制
    write / w-
    append
    rename
    hard link
    symbol link
    chmod
    chown
    禁止写
    禁止利用 O_APPEND flag 绕过 map_file_to_perms() 实现追加写操作
    禁止利用 rename oldpath newpath 绕过 newpath 的写限制
    禁止利用 ln TARGET LINK_NAME 绕过 LINK_NAME 的写限制
    禁止利用创建软链接(符号链接)绕过目标文件的写限制
    WIP
    WIP
    exec / x-禁止执行
    append / a-禁止追加写
  • File Globbing Syntax

    BPF enfocer 支持根据路径 Pattern 对文件进行匹配,并支持两种匹配模式(精确匹配、通配匹配),匹配 Pattern 的最大长度限制为 64 字节。

    通配符语法样例说明
    *- 仅用于匹配叶子结点的文件名
    - 匹配 dot 文件,但不匹配 . 和 .. 文件
    - 仅支持单个 *,且不支持 ** 和 * 一起出现
    - fi* 代表匹配任意以 fi 开头的文件名
    - *le 代表匹配任意以 le 结尾的文件名
    - *.log 代表匹配任意以 .log 结尾的文件名
    此通配符的行为可能会在后续版本中发生改变
    **- 在多级目录中,匹配零个、一个、多个字符
    - 匹配 dot 文件,但不匹配 . 和 .. 文件
    - 仅支持单个 **,且不支持 ** 和 * 一起出现
    - /tmp/**/33 代表匹配任意以 /tmp 开头,且以 /33 结尾的文件,包含 /tmp/33
    - /tmp/** 代表匹配任意以 /tmp 开头的文件、目录
    - /tm** 代表匹配任意以 /tm 开头的文件、目录
    - /t**/33 代表匹配任意以 /t 开头,以 /33 结尾的文件、目录
  • Network Permission

    • 当前 vArmor 支持对指定的 IP 地址、IP 地址块(CIDR 块)、端口进行外联访问控制。
    • 当指定了 IP 地址、IP 地址块,但未指定端口时,默认对所有端口生效。
    • 具体请参见 NetworkEgressRule。

示例:

policy:
enforcer: BPF
mode: EnhanceProtect
enhanceProtect:
# Audit the actions that violate the mandatory access control rules.
# Any detected violation will be logged to /var/log/varmor/violations.log file in the host.
# It's disabled by default.
auditViolations: true
bpfRawRules:
processes:
- pattern: "**ping"
permissions:
- exec
qualifiers:
- audit
- deny
network:
egresses:
toDestinations:
- ip: fdbd:dc01:ff:307:9329:268d:3a27:2ca7
qualifiers:
- audit
- cidr: 192.168.1.1/24 # 192.168.1.0 to 192.168.1.255
ports:
- port: 80
endPort: 8080
qualifiers:
- audit
sockets:
- protocols:
- "udp"
qualifiers:
- audit

NetworkProxy 强制访问控制器​

完整流程见 NetworkProxy 指南,字段见 NetworkProxyRules。根据模式使用 enhanceProtect.networkProxyRawRules 或 defenseInDepth.networkProxy。

  • L4 规则匹配目标 IP/CIDR 和端口。
  • 明文 HTTP/MITM 规则匹配 Host/authority、路径、方法和目标端口。
  • TLS 透传时,有 hosts 的 HTTP 规则只匹配 SNI/端口,忽略路径与方法;没有 hosts 则不生成 SNI 权限。
  • deny 优先;默认拒绝下,匹配的 L4 allow 可以独立于更窄的 HTTP allow 授权。audit 单独不会放行。

下面的策略片段仅允许指定明文 HTTP 请求并记录审计:

policy:
enforcer: NetworkProxy
mode: EnhanceProtect
enhanceProtect:
networkProxyRawRules:
egress:
defaultAction: deny
httpRules:
- qualifiers: [allow, audit]
match:
hosts: [backend.example.com]
ports: [{port: 80}]
paths: [{prefix: /public/}]
methods: [GET]

HTTPS 路径/方法控制需要 MITM 和应用信任,完整可执行资源见快速开始。

日志同时取决于实际决定和匹配的审计规则。默认允许下静默 deny 无日志;默认拒绝下 allow 无 audit 也无日志。详见审计矩阵。NetworkProxy 使用 DENIED/AUDIT,不产生 ALLOWED。