6.4. 创建自定义策略
除了使用默认策略外,您还可以在 Red Hat Advanced Cluster Security for Kubernetes 中创建自定义策略。
要构建新策略,您可以克隆现有策略或从头开始创建一个新策略。
- 您还可以根据 RHACS 门户中的 Risk 视图中的过滤器标准创建策略。
-
您还可以在策略条件中使用
AND
,OR
, 和NOT
逻辑运算符来创建高级策略。
6.4.1. 从系统策略视图创建安全策略 复制链接链接已复制到粘贴板!
您可以从系统策略视图创建新的安全策略。
流程
-
在 RHACS 门户网站中,进入到 Platform Configuration
Policies。 - 点击 Create policy。
在 Policy details 部分中,输入以下有关您的策略的详细信息:
- 输入策略的 Name。
可选:通过从 Attach notifiers 部分下的可用 Notifiers 选择,将通知程序附加到策略。
注意在转发警报前,您必须将 Red Hat Advanced Cluster Security for Kubernetes 与通知供应商集成,如 Webhook、JIRA、Pageruty、PagerDuty、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 部分,为策略选择 Lifecycle stages 和 Event sources (Runtime lifecycle only)。
选择适用于策略的生命周期阶段,Build, Deploy, 或 Runtime。您可以选择多个阶段。
- 构建时策略适用于镜像字段,如 CVE 和 Dockerfile 指令。
- deploy-time 策略可包括所有构建时策略标准,但它们也可以包含集群配置中的数据,如以特权模式运行或挂载 Docker 套接字。
- 运行时策略可以包含所有构建时间和部署时间策略标准,但它们也可以包含运行时进程执行的数据。
对于 Response 方法,可以选择:
- inform 在违反情况列表中包括违反情况。
或者选择 Inform and enforce to enforce 操作。
选择策略的强制行为。它仅适用于您在配置 Lifecycle Stages 时选择的阶段。选择 ON (enable)来强制执行策略并报告违反情况,OFF (disable)仅报告违反情况。每个生命周期阶段的强制行为都有所不同。
- Build - 当镜像与策略条件匹配时,Red Hat Advanced Cluster Security for Kubernetes 无法构建您的持续集成(CI)。
- Deploy - Red Hat Advanced Cluster Security for Kubernetes 会阻止创建与策略条件匹配的部署。在带有准入控制器强制的集群中,Kubernetes 或 OpenShift Container Platform API 服务器会阻止所有不合规的部署。在其他集群中,Red Hat Advanced Cluster Security for Kubernetes 编辑不合规的部署,以防止调度 pod。
Runtime - Red Hat Advanced Cluster Security for Kubernetes 会终止与策略条件匹配的所有 pod,或阻止 pod 上执行的操作。
警告策略实施可能会影响运行应用程序或开发流程。在启用强制选项前,请通知所有利益相关者,并计划如何响应自动执行操作。
- 点击 Next。
- 在 Policy Criteria 部分中,配置您要触发该策略的属性。
- 点击 Next。
在 Policy scope 部分中,配置以下内容:
- 点 Add inclusion scope 使用 Restrict to 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 列指示您可以使用正则表达式和其他逻辑运算符以及特定的属性。
-
!
在 正则表达式 列中表示您只能对列出的字段使用正则表达式。 -
!
在 AND, OR 列中表示您只能将上述逻辑运算符用于属性。
-
- RHACS 版本 列指示必须使用该属性的 Red Hat Advanced Cluster Security for Kubernetes 版本。
对于满足以下条件的属性,不能使用运算符
AND
和OR
的组合:-
布尔值
true
和false
最低值语义,例如:
- 最低 RBAC 权限
- 自镜像创建以来的天数
-
布尔值
您不能将
NOT
逻辑运算符用于具有以下属性:-
布尔值
true
和false
-
已使用进行比较(如
<
,>
,<=
,>=
操作符)的数字值。 compound 条件可以有多个值,例如:
- Dockerfile 行,其中包含指令和参数。
- 环境变量,由名称和值组成。
- 其他含义,包括 Add Capabilities、Drop Capabilities、自镜像创建后的第一天,以及 自镜像上次扫描以来的日期。
-
布尔值
要使用逻辑运算符 AND
、或
不用于
创建安全策略,您需要 Red Hat Advanced Cluster Security for Kubernetes 版本 3.0.45 或更新版本。但是,在早期版本中,您仍然可以对 Regular 表达式 列中列出的字段使用正则表达式。
属性 | Description | RHACS 版本 | 正则表达式 | 非 | AND, OR | 阶段 |
---|---|---|---|---|---|---|
命名空间 | 命名空间的名称。 | 3.0.51 及更新版本 | ✓ | ✓ | ✓ | 部署 |
镜像 Registry | 镜像 registry 的名称。 | All | ✓ | ✓ | ✓ | 部署 |
镜像远程 |
registry 中镜像的全名,如 | All | ✓ | ✓ | ✓ | 部署 |
镜像标签 | 镜像的标识符。 | All | ✓ | ✓ | ✓ | 部署 |
自镜像创建以来的天数 | 镜像创建日期的天数。 | All | ✕ | ✕ | ✕ | Build |
自镜像上次扫描以来的天数 | 最后一次镜像扫描以来的天数。 | All | ✕ | ✕ | ✕ | Build |
Dockerfile 行 | Dockerfile 中的特定行,包括指令和参数。 | All | ! 只适用于值 | ✕ | ✓ | Build |
镜像没有扫描 | 镜像没有可用的扫描数据。 | All | ✕ | ✕ | ✕ | Build |
CVSS |
通用漏洞评分系统,使用它来匹配分数大于 | All | ✕ | ✕ | ✓ | Build |
修复人 | 修复镜像中标记的漏洞的软件包版本字符串。 | All | ✓ | ✓ | ✓ | Build |
CVE | 常见的漏洞和风险,将其与特定 CVE 编号一起使用。 | All | ✓ | ✓ | ✓ | Build |
镜像组件 | 镜像中存在的特定软件组件的名称和版本号。 | All | ✓ | ✕ | ✓ | Build |
镜像操作系统 | 镜像基础操作系统的名称和版本号。 | 3.0.47 及更新版本 | ✓ | ✓ | ✓ | Build |
环境变量 | 根据名称或值检查环境变量。 | All | ! 只用于键和值 | ✕ | ✓ | 部署 |
不允许注解 | 不允许在指定环境中的 Kubernetes 资源中存在的注解。 | All | ✓ | ✕ | ✓ | 部署 |
不允许的镜像标签 |
检查是否存在不应在使用中的 Docker 镜像标签。如果部署中的任何镜像具有指定标签,则策略会触发。您可以对 | 3.0.40 及更新版本 | ✓ | ✕ | ✓ | 部署 |
所需的镜像标签 |
检查是否存在所需的 Docker 镜像标签。如果部署中的任何镜像没有指定标签,则策略会触发。您可以对 | 3.0.40 及更新版本 | ✓ | ✕ | ✓ | 部署 |
所需的标签 | 检查 Kubernetes 中是否存在所需的标签。 | All | ✓ | ✕ | ✓ | 部署 |
必需注解 | 检查 Kubernetes 中是否存在所需的注解。 | All | ✓ | ✕ | ✓ | 部署 |
卷名称 | 存储的名称。 | All | ✓ | ✓ | ✓ | 部署 |
卷源 |
指明置备卷的表单。例如: | All | ✓ | ✓ | ✓ | 部署 |
卷目的地 | 挂载卷的路径。 | All | ✓ | ✓ | ✓ | 部署 |
卷类型 | 卷的类型。 | All | ✓ | ✓ | ✓ | 部署 |
可写卷 | 挂载为可写的卷。 | All | ✕ | ✕ | ✕ | 部署 |
协议 | 公开端口使用的协议,如 TCP 或 UDP。 | All | ✓ | ✓ | ✓ | 部署 |
端口 | 部署公开的端口号。 | All | ✕ | ✓ | ✓ | 部署 |
Privileged | 特权运行部署。 | All | ✕ | ✕ | ✕ | 部署 |
只读 Root 文件系统 | 使用 root 文件系统运行的容器配置为只读。 | All | ✕ | ✕ | ✕ | 部署 |
drop Capabilities |
必须从容器中丢弃的 Linux 功能。例如 | All | ✕ | ✕ | ✓ | 部署 |
添加功能 | 不得添加到容器中的 Linux 功能,例如能够发送原始数据包或覆盖文件权限。 | All | ✕ | ✕ | ✓ | 部署 |
进程名称 | 部署中执行的进程的名称。 | All | ✓ | ✓ | ✓ | Runtime |
Process Ancestor | 部署中执行进程的任何父进程的名称。 | All | ✓ | ✓ | ✓ | Runtime |
进程参数 | 部署中执行进程的命令参数。 | All | ✓ | ✓ | ✓ | Runtime |
进程 UID | 部署期间执行的进程的 UNIX 用户 ID。 | All | ✕ | ✓ | ✓ | Runtime |
端口公开 | 服务的暴露方法,如负载均衡器或节点端口。 | All | ✕ | ✓ | ✓ | 部署 |
服务帐户 | 服务帐户的名称。 | All | ✓ | ✓ | ✓ | 部署 |
可写主机挂载 | 资源已在主机上挂载了具有写入权限的路径。 | All | ✕ | ✕ | ✕ | 部署 |
执行意外的进程 | 检查进程执行没有在部署锁定的进程基准中列出的部署。 | All | ✕ | ✕ | ✕ | Runtime |
最低 RBAC 权限 |
如果部署的 Kubernetes 服务帐户等于 | All | ✕ | ✓ | ✕ | 部署 |
容器名称 | 容器的名称。 | 3.0.52 及更新版本 | ✓ | ✓ | ✓ | 部署 |
容器 CPU 请求 | 检查为给定资源保留的内核数。 | All | ✕ | ✕ | ✓ | 部署 |
容器 CPU 限制 | 检查允许资源使用的最大内核数。 | All | ✕ | ✕ | ✓ | 部署 |
容器内存请求 | 检查为给定资源保留的内存量。 | All | ✕ | ✕ | ✓ | 部署 |
容器内存限制 | 检查允许资源使用的最大内存量。 | All | ✕ | ✕ | ✓ | 部署 |
Kubernetes 操作 |
Kubernetes 操作的名称,如 | 3.0.55 及更新版本 | ✕ | ✕ |
!仅限 | Runtime |
Kubernetes 资源 |
访问的 Kubernetes 资源的名称,如 | 3.63 及更新版本 | ✕ | ✕ |
!仅限 | Runtime |
Kubernetes 资源名称 | 访问的 Kubernetes 资源的名称。 | 3.63 及更新版本 | ✓ | ✓ |
!仅限 | Runtime |
Kubernetes API Verb |
用于访问资源的 Kubernetes API 动词,如 | 3.63 及更新版本 | ✕ | ✕ |
!仅限 | Runtime |
Kubernetes 用户名 | 访问资源的用户的名称。 | 3.63 及更新版本 | ✓ | ✓ |
!仅限 | Runtime |
Kubernetes 用户组 | 访问资源所属用户的组名称。 | 3.63 及更新版本 | ✓ | ✕ |
!仅限 | Runtime |
用户代理 |
用于访问资源的用户代理。例如, | 3.63 及更新版本 | ✓ | ✓ |
!仅限 | Runtime |
源 IP 地址 | 用户从中访问资源的 IP 地址。 | 3.63 及更新版本 | ✓ | ✓ |
!仅限 | Runtime |
是 Impersonated User | 检查请求是否由服务帐户或某些其他帐户模拟。 | 3.63 及更新版本 | ✕ | ✕ | ✕ | Runtime |
运行时类 | 部署的 RuntimeClass。 | 3.67 及更新版本 | ✓ | ✓ | ✓ | 部署 |
自动挂载服务帐户令牌 | 检查部署配置是否自动挂载服务帐户令牌。 | 3.68 及更新版本 | ✕ | ✕ | ✕ | 部署 |
存活度(Liveness)探测 | 容器是否定义了存活度探测。 | 3.69 及更新版本 | ✕ | ✕ | ✕ | 部署 |
就绪度(Readiness)探测 | 容器是否定义了就绪度探测。 | 3.69 及更新版本 | ✕ | ✕ | ✕ | 部署 |
Replicas | 部署副本数量。 | 3.69 及更新版本 | ✕ | ✓ | ✓ | 部署 |
权限升级 | 在配置了开发时提供警报,以允许容器进程获得比父进程更多的特权。 | 3.70 及更新的版本 | ✕ | ✕ | ✕ | 部署 |
Ingress 网络策略 | 检查入口 Kubernetes 网络策略是否存在。 | 3.70 及更新的版本 | ✕ | ✕ | ✓ | 部署 |
出口网络策略 | 检查出口 Kubernetes 网络策略是否存在。 | 3.70 及更新的版本 | ✕ | ✕ | ✓ | 部署 |
未由可信镜像签名者验证 | 可用于验证镜像签名的签名集成列表。在没有签名或其签名的镜像上创建警报,至少可以由其中一个提供的签名集成来验证。 | 3.70 及更新的版本 | ✕ | ✕ |
!仅限 | 部署 |
如果您使用 Red Hat Advanced Cluster Security for Kubernetes 版本 3.0.44 或更早版本,则您在 Policy criteria 部分指定的策略条件会被"AND"。这意味着,如果所有指定的策略条件都匹配,则违反仅触发。
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 继续创建策略。