6.4. 创建自定义策略
除了使用默认策略外,您还可以在 Red Hat Advanced Cluster Security for Kubernetes 中创建自定义策略。
要构建新策略,您可以克隆现有策略或从头开始创建一个新策略。
- 您还可以根据 RHACS 门户中的 Risk 视图中的过滤器标准创建策略。
-
您还可以在策略条件中使用
AND
,OR
, 和NOT
逻辑运算符来创建高级策略。
6.4.1. 从系统策略视图创建安全策略
您可以从系统策略视图创建新的安全策略。
流程
-
在 RHACS 门户中,进入到 Platform Configuration
Policy Management。 - 点击 Create policy。
在 Policy details 部分中,输入以下有关您的策略的详细信息:
- 输入策略的 Name。
可选:通过从 Attach notifiers 部分下的可用 Notifiers 选择,将通知程序附加到策略。
注意在转发警报前,您必须将 RHACS 与通知供应商(如 Webhook、JIRA、Pageruty、Spluty、Splunk 等)集成。
-
选择 此策略的严重性级别,可以是
Critical
、High
、Medium
或Low
。 - 选择您要 应用到 此策略的策略类别。有关创建类别的详情,请参考本文档后面的"创建和管理策略类别"。
- 在 Description 字段中输入策略详情。
- 在 Rationale 字段中输入有关为什么策略存在的解释。
- 在 Guidance 字段中输入步骤来解决此策略的违反情况。
可选:在 MITRE ATT&CK 部分中,选择您需要为策略指定的 tactics and the techniques。
- 单击 Add tactic,然后从下拉列表中选择 tactic。
- 点 Add Technology,为所选 tactic 添加技术。您可以为 tactic 指定多种技术。
- 点击 Next。
在 Policy behavior 部分中,执行以下步骤:
选择适用于 您的策略 的生命周期阶段: Build、deploy或 Runtime。您可以选择多个阶段。
- 构建时策略适用于镜像字段,如 CVE 和 Dockerfile 指令。
- deploy-time 策略可包括所有构建时策略标准,但它们也可以包含集群配置中的数据,如以特权模式运行或挂载 Docker 套接字。
- 运行时策略可以包含所有构建时间和部署时间策略标准,但它们也可以包含运行时进程执行的数据。
可选:如果您选择了 Runtime 生命周期阶段,请选择以下 事件源 之一:
- Deployment :当事件源包括进程和网络活动、pod exec 和 pod 端口转发时,RHACS 会触发策略违反情况。
- 当事件源与 Kubernetes 审计日志记录匹配时,RHACS 会触发策略违反情况。
对于 Response 方法,请选择以下选项之一:
- inform :在违反列表中包括违反情况。
- inform 和 enforce :强制操作。
可选:如果您选择了 Inform and enforce,在 Configure enforcement behavior 中,使用每个生命周期选择策略的强制行为。它仅适用于您在配置生命周期阶段时所选择的 阶段。每个生命周期阶段的强制行为都有所不同。
- Build - 当镜像与策略条件匹配时,RHACS 无法构建您的持续集成(CI)。
- Deploy - RHACS 块创建与策略条件匹配的部署。在带有准入控制器强制的集群中,Kubernetes 或 OpenShift Container Platform API 服务器会阻止所有不合规的部署。在其他集群中,RHACS 编辑不合规部署,以防止调度 pod。
Runtime - 当 pod 中的事件与策略条件匹配时,RHACS 会删除所有 pod。
警告策略实施可能会影响运行应用程序或开发流程。在启用强制选项前,请通知所有利益相关者,并计划如何响应自动执行操作。
- 点击 Next。
在 Policy Criteria 部分中,配置您要触发该策略的属性。
单击策略字段并将它拖到 Policy Section 中,以添加条件。
注意可用的策略字段取决于您为策略选择的生命周期阶段。例如,在为运行时生命周期创建策略时,
Kubernetes 访问策略
或Networking
下的条件可用,但为构建生命周期创建策略时不可用。有关策略条件的更多信息,请参阅"附加资源"部分中的"策略标准"部分,包括有关条件及其可用的生命周期阶段的信息。-
可选:点 Add condition 来添加包括会触发策略的额外条件的策略部分(例如,为了触发一个旧的、稳定的镜像,您可以配置
image tag
不是latest
或image age
并指定自一个镜像构建后的需要经过的最少天数)。
- 点击 Next。
在 Policy scope 部分中,配置以下内容:
- 点 Add inclusion scope 使用 Restrict by scope 仅对特定集群、命名空间或标签启用此策略。您可以添加多个范围,并为命名空间和标签在 RE2 语法中使用正则表达式。
- 点 Add excluded scope 来使用 Exclude by scope 来排除您指定的部署、集群、命名空间和标签。该策略不适用于您选择的实体。您可以添加多个范围,并为命名空间和标签在 RE2 语法中使用正则表达式。但是,您不能使用正则表达式来选择部署。
对于 Excluded Images (仅限构建生命周期), 请选择您不想触发违反的所有镜像。
注意Excluded Images 设置仅在使用 Build 生命周期阶段检查持续集成系统中的镜像时适用。如果您使用此策略检查 Deploy 生命周期阶段中运行的部署,或检查在 Runtime 生命周期阶段中的运行时活动时,则不会生效。
- 点击 Next。
- 在 Review policy 部分中,预览策略违反情况。
- 点击 Save。
其他资源
6.4.2. 从 risk 视图创建安全策略
在风险视图中评估部署的风险时,当您应用本地页面过滤时,您可以根据您使用的过滤标准创建新的安全策略。
流程
- 进入 RHACS 门户并从导航菜单中选择 Risk。
- 应用您要为其创建策略的本地页面过滤条件。
- 选择 New Policy 并填写所需字段以创建新策略。
其他资源
6.4.3. 策略标准
在 Policy Criteria 部分中,您可以配置要触发策略的数据。
您可以根据下表中列出的属性来配置策略。
在这个表中:
Regular expressions, AND, OR, 和 NOT 列指示您可以使用正则表达式和其他逻辑运算符以及特定的属性。
-
!
用于 Regex (正则表达式)表示您只能对列出的字段使用正则表达式。 -
!
对于 AND,或 OR 表示您只能将上述逻辑运算符用于属性。 - Regex / NOT / AND, OR column 指示属性不支持任何这些(regex、Negation、logical operators)。
-
- RHACS 版本 列指示必须使用该属性的 Red Hat Advanced Cluster Security for Kubernetes 版本。
对于满足以下条件的属性,不能使用运算符
AND
和OR
的组合:-
布尔值
true
和false
最低值语义,例如:
- 最低 RBAC 权限
- 自镜像创建以来的天数
-
布尔值
您不能将
NOT
逻辑运算符用于具有以下属性:-
布尔值
true
和false
-
已使用进行比较(如
<
,>
,<=
,>=
操作符)的数字值。 compound 条件可以有多个值,例如:
- Dockerfile 行,其中包含指令和参数。
- 环境变量,由名称和值组成。
- 其他含义,包括 Add Capabilities、Drop Capabilities、自镜像创建后的第一天,以及 自镜像上次扫描以来的日期。
-
布尔值
属性 | Description | JSON 属性 | 允许的值 | regex,NOT,AND, OR | 阶段 |
---|---|---|---|---|---|
部分:镜像 registry | |||||
镜像 Registry | 镜像 registry 的名称。 | 镜像 Registry | 字符串 |
regex, |
构建, |
镜像名称 |
registry 中镜像的全名,如 | 镜像远程 | 字符串 |
regex, |
构建, |
镜像标签 | 镜像的标识符。 | 镜像标签 | 字符串 |
regex, |
构建, |
镜像签名 | 可用于验证镜像签名的签名集成列表。在没有签名或其签名的镜像上创建警报,至少可以由其中一个提供的签名集成来验证。 | 镜像签名验证者 | 已配置镜像签名集成的有效 ID |
!仅限 |
构建, |
部分:镜像内容 | |||||
CVE 可修复 | 只有您在评估的部署中的镜像具有可修复的 CVE 时,此条件才会导致违反情况。 | 可修复 | 布尔值 | ✕ |
构建, |
自 CVE Was First Discovered In images 中的 daysSince | 只有当 RHACS 在特定镜像中发现 CVE 后超过指定天数时,此条件才会导致违反情况。 | 自 CVE Was First Discovered In images 中的 daysSince | 整数 | ✕ |
构建, |
因 CVE Was First Discovered in System 的 day Since CVE Was | 只有由于 RHACS 在 RHACS 监控的所有部署的镜像中发现 CVE,所以这个条件才会超过指定天数。 | 因 CVE Was First Discovered in System 的 day Since CVE Was | 整数 | ✕ |
构建, |
镜像年龄 | 镜像创建日期起的最小天数。 | 镜像期限 | 整数 | ✕ |
构建, |
镜像扫描年龄 | 镜像上次扫描后的最小天数。 | 镜像扫描期限 | 整数 | ✕ |
构建, |
镜像用户 | 匹配 Dockerfile 中的 USER 指令。详情请查看 https://docs.docker.com/engine/reference/builder/#user。 | 镜像用户 | 字符串 |
regex, |
构建, |
Dockerfile 行 | Dockerfile 中的特定行,包括指令和参数。 | Dockerfile 行 | 其中一个: LABEL, RUN, CMD, EXPOSE, ENV, ADD, COPY, ENTRYPOINT,VOLUME, USER, WORKDIR, ONBUILD |
!正则表达式只适用于值 |
构建, |
镜像扫描状态 | 检查镜像是否已扫描。 | 未扫描的镜像 | 布尔值 | ✕ |
构建, |
CVSS |
通用漏洞评分系统,使用它来匹配分数大于 | CVSS |
<, >, <=, >= 或 nothing (represents equal to)
示例: | AND, OR |
构建, |
重要性 | 基于 CVSS 或供应商的严重性。可以是 Low, Moderate, Important 或 Critical 之一。 | 重要性 |
<, >, criu, >= or nothing (represents equal to)
示例: | AND, OR |
构建, |
修复人 | 修复镜像中标记的漏洞的软件包版本字符串。除了识别漏洞的其他条件外,也可以使用此条件,例如使用 CVE 条件。 | 修复人 | 字符串 |
regex, |
构建, |
CVE | 常见的漏洞和风险,将其与特定 CVE 编号一起使用。 | CVE | 字符串 |
regex, |
构建, |
镜像组件 | 镜像中存在的特定软件组件的名称和版本号。 | 镜像组件 |
key=value
值是可选的。 如果缺少值,则必须采用 "key=". |
regex, |
构建, |
镜像操作系统 |
镜像基础操作系统的名称和版本号。例如, | 镜像操作系统 | 字符串 |
regex, |
构建, |
需要镜像标签 |
确保存在 Docker 镜像标签。如果部署中的任何镜像没有指定标签,则策略会触发。您可以对 key 和 value 字段使用正则表达式来匹配标签。 | 所需的镜像标签 |
key=value
值是可选的。 如果缺少值,则必须采用 "key=". |
regex, |
构建, |
不允许镜像标签 | 确保不使用特定的 Docker 镜像标签。如果部署中的任何镜像具有指定标签,则策略会触发。您可以对 key 和 value 字段使用正则表达式来匹配标签。只有与 Docker registry 集成时,"Disallow Image Label 策略"条件才有效。有关 Docker 标签的详情,请参阅 Docker 文档 https://docs.docker.com/config/labels-custom-metadata/。 | 不允许的镜像标签 |
key=value
值是可选的。 如果缺少值,则必须采用 "key=". |
regex, |
构建, |
部分:容器配置 | |||||
环境变量 | 根据名称或值检查环境变量。 | 环境变量 |
RAW=key=value,将部署配置中直接指定的环境变量与特定的键和值匹配。 如果配置中没有直接定义环境变量,则可以使用 SOURCE=KEY 格式,其中 SOURCE 是 SECRET_KEY、CONFIG_MAP_KEY、FIELD 或 RESOURCE_FIELD 之一。在这种情况下,条件只能匹配键而不是值。 |
!正则表达式只适用于键和值(如果使用 RAW) |
部署, |
容器 CPU 请求 | 检查为给定资源保留的内核数。 | 容器 CPU 请求 |
<, >, numpy, >= 或 nothing (代表等于)
示例: | AND, OR |
部署, |
容器 CPU 限制 | 检查允许资源使用的最大内核数。 | 容器 CPU 限制 | (与容器 CPU 请求相同) | AND, OR |
部署, |
容器内存请求 | 检查为给定资源保留的内存量。 | 容器内存请求 | (与容器 CPU 请求相同) | AND, OR |
部署, |
容器内存限制 | 检查允许资源使用的最大内存量。 | 容器内存限制 | (与容器 CPU 请求相同) | AND, OR |
部署, |
特权容器 | 特权运行部署。 | 特权容器 | 布尔值 | ✕ |
部署, |
根文件系统写入性 | 使用 root 文件系统运行的容器配置为只读。 | 只读 Root 文件系统 | 布尔值 | ✕ |
部署, |
seccomp 配置集类型 | 容器允许的 seccomp 配置集类型。 | seccomp 配置集类型 |
其中之一:
UNCONFINED | ✕ |
部署, |
权限升级 | 在配置了开发时提供警报,以允许容器进程获得比父进程更多的特权。 | 允许权限升级 | 布尔值 | ✕ |
部署, |
drop Capabilities |
必须从容器中丢弃的 Linux 功能。在不丢弃指定功能时提供警报。例如,如果配置了 |
drop Capabilities |
其中之一:
ALL | 和 |
部署, |
添加功能 |
不得添加到容器中的 Linux 功能,例如发送原始数据包或覆盖文件权限的能力。在添加指定功能时提供警报。例如,如果使用 | 添加功能 |
AUDIT_CONTROL | 或者 |
部署, |
容器名称 | 容器的名称。 | 容器名称 | 字符串 |
regex, |
部署, |
Apparmor Profile | 容器中使用的应用程序 Armor ("AppArmor")配置集。 | Apparmor Profile | 字符串 |
regex, |
部署, |
存活度(Liveness)探测 | 容器是否定义了存活度探测。 | 存活度(Liveness)探测 | 布尔值 | ✕ |
部署, |
就绪度(Readiness)探测 | 容器是否定义了就绪度探测。 | 就绪度(Readiness)探测 | 布尔值 | ✕ |
部署, |
部分:部署元数据 | |||||
不允许注解 | 不允许在指定环境中的 Kubernetes 资源中存在的注解。 | 不允许注解 |
key=value
值是可选的。 如果缺少值,则必须采用 "key=". |
regex, |
部署, |
所需的标签 | 检查 Kubernetes 中是否存在所需的标签。 | 所需的标签 |
key=value
值是可选的。 如果缺少值,则必须采用 "key=". |
regex, |
部署, |
必需注解 | 检查 Kubernetes 中是否存在所需的注解。 | 必需注解 |
key=value
值是可选的。 如果缺少值,则必须采用 "key=". |
regex, |
部署, |
运行时类 |
部署的 | 运行时类 | 字符串 |
regex, |
部署, |
主机网络 |
检查 | 主机网络 | 布尔值 | ✕ |
部署, |
主机 PID | 检查在容器和主机间是否隔离了进程 ID (PID)命名空间。这允许不同 PID 命名空间中的进程具有相同的 PID。 | 主机 PID | 布尔值 | ✕ |
部署, |
主机 IPC | 检查主机上的 IPC (POSIX/SysV IPC)命名空间(提供命名共享内存片段、semaphores 和消息队列)的隔离是否与容器共享。 | 主机 IPC | 布尔值 | ✕ |
部署, |
命名空间 | 部署所属的命名空间的名称。 | 命名空间 | 字符串 |
regex, |
部署, |
Replicas | 部署副本数量。 | Replicas |
<, >, criu, >= 或 nothing (代表等于)
示例: |
NOT, |
部署, |
部分:存储 | |||||
卷名称 | 存储的名称。 | 卷名称 | 字符串 |
regex, |
部署, |
卷源 |
指明置备卷的表单。例如: | 卷源 | 字符串 |
regex, |
部署, |
卷目的地 | 挂载卷的路径。 | 卷目的地 | 字符串 |
regex, |
部署, |
卷类型 | 卷的类型。 | 卷类型 | 字符串 |
regex, |
部署, |
挂载的卷不稳定 | 挂载为可写的卷。 | 可写挂载的卷 | 布尔值 | ✕ |
部署, |
挂载传播 |
检查容器是否在双向中 | 挂载传播 |
其中之一:
NONE |
NOT, |
部署, |
主机挂载不稳定 | 资源已在主机上挂载了具有写入权限的路径。 | 可写主机挂载 | 布尔值 | ✕ |
部署, |
部分: Networking | |||||
协议 | 公开端口使用的协议,如 TCP 或 UDP。 | 公开端口协议 | 字符串 |
regex, |
部署, |
端口 | 部署公开的端口号。 | 公开端口 |
<, >, criu, >= 或 nothing (代表等于)
示例: |
NOT, |
部署, |
公开的节点端口 | 部署外部公开的端口号。 | 公开的节点端口 | (与公开端口相同) |
NOT, |
部署, |
端口公开 | 服务的暴露方法,如负载均衡器或节点端口。 | 端口公开方法 |
其中之一:
UNSET |
NOT, |
部署, |
期望的意外网络流 | 检查检测到的网络流量是否是部署的网络基准的一部分。 | 期望的意外网络流 | 布尔值 | ✕ | 仅 运行时 - 网络 |
Ingress 网络策略 | 检查入口 Kubernetes 网络策略是否存在。 | 具有 Ingress 网络策略 | 布尔值 |
regex, |
部署, |
出口网络策略 | 检查出口 Kubernetes 网络策略是否存在。 | 具有 Egress 网络策略 | 布尔值 |
regex, |
部署, |
部分:进程活动 | |||||
进程名称 | 部署中执行的进程的名称。 | 进程名称 | 字符串 |
regex, | 仅 运行时 - 进程 |
Process Ancestor | 部署中执行进程的任何父进程的名称。 | Process Ancestor | 字符串 |
regex, | 仅 运行时 - 进程 |
进程参数 | 部署中执行进程的命令参数。 | 进程参数 | 字符串 |
regex, | 仅 运行时 - 进程 |
进程 UID | 部署期间执行的进程的 UNIX 用户 ID。 | 进程 UID | 整数 |
NOT, | 仅 运行时 - 进程 |
执行意外的进程 | 检查进程执行没有在部署锁定的进程基准中列出的部署。 | 执行意外的进程 | 布尔值 | ✕ | 仅 运行时 - 进程 |
部分:Kubernetes 访问 | |||||
服务帐户 | 服务帐户的名称。 | 服务帐户 | 字符串 |
regex, |
部署, |
自动挂载服务帐户令牌 | 检查部署配置是否自动挂载服务帐户令牌。 | 自动挂载服务帐户令牌 | 布尔值 | ✕ |
部署, |
最低 RBAC 权限 |
如果部署的 Kubernetes 服务帐户等于 | 最低 RBAC 权限 |
其中之一:
DEFAULT | 非 |
部署, |
部分:Kubernetes 事件 | |||||
Kubernetes 操作 |
Kubernetes 操作的名称,如 | Kubernetes 资源 |
其中之一:
PODS_EXEC |
!仅限 | 仅 运行时 - Kubernetes 事件 |
Kubernetes 用户名 | 访问资源的用户的名称。 | Kubernetes 用户名 | 仅限连字符(-)和冒号(:)的字母数字字符 |
regex, | 仅 运行时 - Kubernetes 事件 |
Kubernetes 用户组 | 访问资源所属用户的组名称。 | Kubernetes 用户组 | 仅限连字符(-)和冒号(:)的字母数字字符 |
regex, | 仅 运行时 - Kubernetes 事件 |
Kubernetes 资源 |
访问的 Kubernetes 资源的名称,如 | Kubernetes 资源 |
其中之一:
SECRETS |
!仅限 | 仅 运行时 - 审计日志 |
Kubernetes API Verb |
用于访问资源的 Kubernetes API 动词,如 | Kubernetes API Verb |
其中之一:
CREATE |
!仅限 | 仅 运行时 - 审计日志 |
Kubernetes 资源名称 | 访问的 Kubernetes 资源的名称。 | Kubernetes 资源名称 | 仅限连字符(-)和冒号(:)的字母数字字符 |
regex, | 仅 运行时 - 审计日志 |
用户代理 |
用于访问资源的用户代理。例如, | 用户代理 | 字符串 |
regex, | 仅 运行时 - 审计日志 |
源 IP 地址 | 用户从中访问资源的 IP 地址。 | 源 IP 地址 | IPV4 或 IPV6 地址 |
regex, | 仅 运行时 - 审计日志 |
是 Impersonated User | 检查请求是否由服务帐户或某些其他帐户模拟。 | 是 Impersonated User | 布尔值 | ✕ | 仅 运行时 - 审计日志 |
6.4.3.1. 为策略条件添加逻辑条件
您可以使用 drag-and-drop 策略字段面板指定策略标准的逻辑条件。
先决条件
- 您必须使用 Red Hat Advanced Cluster Security for Kubernetes 版本 3.0.45 或更新版本。
流程
在 Policy Criteria 部分中,选择 Add a new condition 来添加新策略部分。
- 您可以点 Edit 图标重命名 policy 部分。
- Drag out a policy 字段 部分列出了多个类别中的可用策略标准。您可以扩展和折叠这些类别,以查看策略标准属性。
- 将属性拖到 Drop a policy 字段 到 policy 部分的区域。
根据您选择的属性的类型,您可以获得不同的选项来配置所选属性的条件。例如:
-
如果您选择了带有布尔值
Read-Only Root Filesystem
的属性,您会看到READ-ONLY
和WRITABLE
选项。 如果您选择了带有复合值
环境变量的属性
,您会看到输入Key
、Value
和Value From
字段的值的选项,以及一个图标,以为可用选项添加更多值。- 要组合一个属性的多个值,请点 Add 图标。
-
您也可以点策略部分中列出的逻辑运算符
AND
或OR
,以在AND
和OR
运算符之间进行切换。在 Operator 间的切换只在策略部分内工作,而不是在两个不同的策略部分之间工作。
-
如果您选择了带有布尔值
-
您可以通过重复这些步骤来指定多个
AND
和OR
条件。为添加的属性配置条件后,点 Next 继续创建策略。