第 6 章 管理安全策略
6.1. 关于安全策略
Red Hat Advanced Cluster Security for Kubernetes 提供了开箱即用的 默认安全策略,您可以用来防止环境中的高风险服务部署并对运行时安全事件做出响应。您还可以为容器环境 创建自定义 多因素策略。
6.1.1. 策略类别
RHACS 使用策略类别来根据类型和功能对策略进行分组。您可以使用这些类别来组织和搜索策略。
RHACS 提供以下默认策略类别:
- 同学活动
- Cryptocurrency Mining
- DevOps 最佳实践
- 用于互联网安全的 Docker 中心(CIS)
- Kubernetes
- Kubernetes 事件
- 网络工具
- 软件包管理
- 权限
- 安全性最佳实践
- 供应链安全性
- 系统修改
- 漏洞管理
- zero Trust
您可以使用 Policy Management 窗口中的 Policy Categories 选项卡查看现有类别并在 RHACS 门户中创建自己的策略类别。
6.1.1.1. 使用 Policy categories 选项卡创建策略类别
从 3.74 版本开始,RHACS 提供了一种新的方法来创建和管理 Red Hat Advanced Cluster Security Cloud Service 或 RHACS 中的策略类别(如果您启用了 PostgreSQL 数据库)。使用此功能时,策略创建以外的所有策略工作流保持不变。
您还可以使用 PolicyCategoryService
API 对象配置策略类别。如需更多信息,请参阅 RHACS 门户中的 Help
流程
-
在 RHACS 门户中,进入 Platform Configuration
Policy Management。 - 点 Policy categories 选项卡。此选项卡提供现有类别的列表,允许您按类别名称过滤列表。您还可以点 Show all categories,然后选择从显示列表中删除默认或自定义类别的复选框。
- 单击 Create category。
- 输入类别名称并点 Create。
6.1.1.2. 使用 Policy categories 选项卡修改策略类别
从 3.74 版本开始,RHACS 提供了一种新的方法来创建和管理 Red Hat Advanced Cluster Security Cloud Service 或 RHACS 中的策略类别(如果您启用了 PostgreSQL 数据库)。使用此功能时,策略创建以外的所有策略工作流保持不变。
您还可以使用 PolicyCategoryService
API 对象配置策略类别。如需更多信息,请参阅 RHACS 门户中的 Help
流程
-
在 RHACS 门户中,进入 Platform Configuration
Policy Management。 - 点 Policy categories 选项卡。此选项卡提供现有类别的列表,允许您按类别名称过滤列表。您还可以点 Show all categories,然后选择从显示列表中删除默认或自定义类别的复选框。
- 点策略名称来编辑或删除它。无法选择、编辑或删除默认策略类别。
6.1.2. 了解策略和生命周期阶段
在配置策略时,您可以选择适用于您的策略的生命周期阶段,您可以为策略选择多个阶段。
您可以从以下生命周期阶段选择:
- 构建阶段策略: 这些策略适用于 CVE 和 Dockerfile 指令等镜像字段。
- 部署阶段策略: 这些策略可以包含所有构建时策略标准。它们也可以有集群配置中的数据,如以特权模式运行或挂载 Docker 守护进程套接字。
运行时策略扫描包括所有构建时和部署策略标准,以及有关进程在运行时执行的数据。您可以进一步配置运行时策略,以根据以下事件触发策略违反情况:
- Deployment:当事件源包含进程和网络活动时,RHACS 会触发策略违反情况,如在 pod 和 pod 端口转发中执行命令。
- 审计日志 :当事件源与 Kubernetes 审计日志记录匹配时,RHACS 会触发策略违反情况。
6.1.3. 了解规则和策略标准
您可以在 RHACS 中设置规则,并配置要触发策略的数据。此数据也称为 策略条件或 策略 字段。
您可以根据下表中列出的属性配置策略。
在这个表中:
Regular expressions, AND, OR, 和 NOT 列指示您可以使用正则表达式和其他逻辑运算符以及特定的属性。
-
!
用于 Regex (正则表达式)表示您只能对列出的字段使用正则表达式。 -
!
用于 AND,或表示您只能将上述逻辑运算符用于属性。 - Regex / NOT / AND, OR 列中表示属性不支持其中任何一个(regex、negation、logical operators)。
-
- RHACS version 列指示必须使用该属性的 Red Hat Advanced Cluster Security for Kubernetes 的版本。
对于满足以下条件的属性,不能使用运算符
AND
和OR
的组合:-
布尔值
true
和false
最小值-值语义,例如:
- 最低 RBAC 权限
- 创建镜像后的天数
-
布尔值
您不能将
NOT
逻辑运算符用于具有以下内容的属性:-
布尔值
true
和false
-
已使用进行比较(如
<
,>
,<=
,>=
操作符)的数字值。 可以具有多个值的复合条件,例如:
- Dockerfile 行,其中包含指令和参数。
- 环境变量,由名称和值组成。
- 其他含义,包括 Add Capabilities、Drop Capabilities、自镜像创建以来 的天,以及 自镜像上次扫描以来的天。
-
布尔值
属性 | Description | JSON 属性 | 允许的值 | regex,NOT,AND, OR | 阶段 |
---|---|---|---|---|---|
部分:镜像 registry | |||||
镜像 Registry | 镜像 registry 的名称。 | 镜像 Registry | 字符串 |
regex, |
构建, |
镜像名称 |
registry 中镜像的完整名称,如 | 镜像远程 | 字符串 |
regex, |
构建, |
镜像标签 | 镜像的标识符。 | 镜像标签 | 字符串 |
regex, |
构建, |
镜像签名 | 可用于验证镜像签名的签名集成列表。在没有签名或其签名的镜像上创建警报不会被至少一个提供的签名集成验证。 | 镜像签名验证人 | 已配置了镜像签名集成的有效 ID |
!仅限 |
构建, |
部分:镜像内容 | |||||
通用漏洞和暴露(CVE)可修复 | 只有在您要评估的部署中的镜像具有可修复的 CVE 时,这个条件才会产生违反情况。 | 可修复 | 布尔值 | ✕ |
构建, |
Since CVE Was First Discovered in Image | 只有当 RHACS 在特定镜像中发现 CVE 后的指定天数时,此条件才会产生违反情况。 | Since CVE Was First Discovered in Image | 整数 | ✕ |
构建, |
Since CVE Was First Discovered in System | 此条件只有在 RHACS 监视器的所有部署镜像间发现 CVE 超过指定天数时才会产生违反情况。 | Since CVE Was First Discovered in System | 整数 | ✕ |
构建, |
镜像年龄 | 镜像创建日期的最小天数。 | image Age | 整数 | ✕ |
构建, |
镜像扫描年龄 | 自上次扫描镜像以来的最少天数。 | 镜像扫描期限 | 整数 | ✕ |
构建, |
镜像用户 | 匹配 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:使用它来匹配分数大于 >、小于 | CVSS |
<, >, <=, >= or nothing (代表等于)
示例: | AND, OR |
构建, |
重要性 | 根据 CVSS 或供应商的安全漏洞的严重性。可以是 Low、Moderate、Important 或 Critical 之一。 | 重要性 |
<, >, HEKETI, >= or nothing (代表等于)
示例: | AND, OR |
构建, |
固定者 | 修复镜像中标记的漏洞的软件包版本字符串。除了识别漏洞的其他条件(例如使用 CVE 标准)外,还可使用此标准。 | 固定者 | 字符串 |
regex, |
构建, |
CVE | 常见的漏洞和风险,将其与特定 CVE 编号一起使用。 | CVE | 字符串 |
regex, |
构建, |
镜像组件 | 镜像中存在的特定软件组件的名称和版本号。 | 镜像组件 |
key=value
value 是可选的。 如果缺少值,则必须格式为 "key="。 |
regex, |
构建, |
镜像操作系统 |
镜像基本操作系统的名称和版本号。例如, | 镜像操作系统 | 字符串 |
regex, |
构建, |
需要镜像标签 |
确保存在 Docker 镜像标签。如果部署中的任何镜像都没有指定标签,则策略会触发。您可以对 key 和 value 字段使用正则表达式来匹配标签。 | 所需的镜像标签 |
key=value
value 是可选的。 如果缺少值,则必须格式为 "key="。 |
regex, |
构建, |
disallow 镜像标签 | 确保不使用特定的 Docker 镜像标签。如果部署中的任何镜像具有指定标签,策略将触发。您可以对 key 和 value 字段使用正则表达式来匹配标签。只有在与 Docker registry 集成时,"Disallow Image Label policy"条件才可以正常工作。有关 Docker 标签的详情,请查看 Docker 文档 https://docs.docker.com/config/labels-custom-metadata/。 | 禁止的镜像标签 |
key=value
value 是可选的。 如果缺少值,则必须格式为 "key="。 |
regex, |
构建, |
部分:容器配置 | |||||
环境变量 |
根据名称或值检查环境变量。当您创建包含环境变量属性的策略时,您可以选择策略应该匹配的环境变量类型。例如,您可以指定原始值,它们直接在部署 YAML 中提供,或者指定对配置映射、secret、字段或资源请求或限值的值的引用。对于直接在部署 YAML 中指定的 raw 值以外的任何类型,策略规则的对应 | 环境变量 |
RAW=key=value 与部署 YAML 中使用特定键和值直接指定的环境变量匹配。您可以省略
如果配置 YAML 中没有定义环境变量,您可以使用格式
前面的列表首先提供 API 对象标签,然后以括号形式提供用户界面标签。 |
!仅限键和值正则表达式(如果使用 RAW) |
部署, |
容器 CPU 请求 | 检查为给定资源保留的内核数。 | 容器 CPU 请求 |
<, >, HEKETI, >= or nothing (代表等于)
示例: | AND, OR |
部署, |
容器 CPU 限制 | 检查资源允许使用的最大内核数。 | 容器 CPU 限制 | (与容器 CPU 请求相同) | AND, OR |
部署, |
容器内存请求 | 编号,包括请求的几分(以 MB 为单位)。 | 容器内存请求 | (与容器 CPU 请求相同) | AND, OR |
部署, |
容器内存限制 | 检查资源允许使用的最大内存量。 | 容器内存限制 | (与容器 CPU 请求相同) | AND, OR |
部署, |
特权容器 |
检查部署是否以 privileged 模式配置。此条件仅检查对应 Pod 安全上下文 中的 | 特权容器 |
boolean: | ✕ |
部署, |
root 文件系统可写入性 |
检查是否在 | 只读 Root 文件系统 |
boolean: | ✕ |
部署, |
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
value 是可选的。 如果缺少值,则必须格式为 "key="。 |
regex, |
部署, |
所需的标签 | 检查 Kubernetes 中是否存在所需的标签。 | 所需的标签 |
key=value
value 是可选的。 如果缺少值,则必须格式为 "key="。 |
regex, |
部署, |
所需的注解 | 检查 Kubernetes 中是否存在所需的注解。 | 所需的注解 |
key=value
value 是可选的。 如果缺少值,则必须格式为 "key="。 |
regex, |
部署, |
运行时类 |
部署的 | 运行时类 | 字符串 |
regex, |
部署, |
主机网络 |
检查 | 主机网络 | 布尔值 | ✕ |
部署, |
主机 PID | 检查进程 ID (PID)命名空间是否在容器和主机间隔离。这允许不同 PID 命名空间中的进程具有相同的 PID。 | 主机 PID | 布尔值 | ✕ |
部署, |
主机 IPC | 检查主机上的 IPC (POSIX/SysV IPC)命名空间(提供命名共享内存片段、信号和消息队列)是否与容器共享。 | 主机 IPC | 布尔值 | ✕ |
部署, |
命名空间 | 部署所属命名空间的名称。 | 命名空间 | 字符串 |
regex, |
部署, |
Replicas |
部署副本数量。如果使用 | Replicas |
<, >, HEKETI, >= or nothing (代表等于)
示例: |
NOT, |
部署, |
部分:存储 | |||||
卷名称 | 存储的名称。 | 卷名称 | 字符串 |
regex, |
部署, |
卷源 |
指明置备卷的表单。例如: | 卷源 | 字符串 |
regex, |
部署, |
卷目的地 | 挂载卷的路径。 | 卷目的地 | 字符串 |
regex, |
部署, |
卷类型 | 卷的类型。 | 卷类型 | 字符串 |
regex, |
部署, |
挂载卷可重用性 | 挂载为可写的卷。 | 可写挂载卷 | 布尔值 | ✕ |
部署, |
挂载传播 |
检查容器是否以 | 挂载传播 |
其中之一:
NONE |
NOT, |
部署, |
主机挂载 writability | 资源已在具有写入权限的主机上挂载了路径。 | 可写主机挂载 | 布尔值 | ✕ |
部署, |
部分:网络 | |||||
协议 | 协议,如 TCP 或 UDP,供公开端口使用。 | 公开的端口协议 | 字符串 |
regex, |
部署, |
端口 | 部署公开的端口号。 | 公开的端口 |
<, >, HEKETI, >= or nothing (代表等于)
示例: |
NOT, |
部署, |
公开的节点端口 | 部署外部公开的端口号。 | 公开的节点端口 | (与开放端口相同) |
NOT, |
部署, |
端口公开 | 公开该服务的方法,如负载均衡器或节点端口。 | 端口公开方法 |
其中之一:
UNSET |
NOT, |
部署, |
意外的网络流 | 检查检测到的网络流量是部署的网络基准的一部分。 | 意外的网络流 | 布尔值 | ✕ | 仅 运行时 - 网络 |
入口网络策略 | 检查入口 Kubernetes 网络策略是否存在。 | 具有 Ingress Network 策略 | 布尔值 |
regex, |
部署, |
出口网络策略 | 检查出口 Kubernetes 网络策略是否存在。 | 具有 Egress Network 策略 | 布尔值 |
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 资源 |
其中之一:
配置映射 |
!仅限 | 仅 运行时 - 审计日志 |
Kubernetes API Verb |
用于访问资源的 Kubernetes API 动词,如 | Kubernetes API Verb |
其中之一:
CREATE |
!仅限 | 仅 运行时 - 审计日志 |
Kubernetes 资源名称 | 访问的 Kubernetes 资源的名称。 | Kubernetes 资源名称 | 只使用连字符(-)和冒号(:)的字母数字。 |
regex, | 仅 运行时 - 审计日志 |
用户代理 |
用于访问资源的用户代理。例如 | 用户代理 | 字符串 |
regex, | 仅 运行时 - 审计日志 |
源 IP 地址 | 用户访问资源的 IP 地址。 | 源 IP 地址 | IPV4 或 IPV6 地址 |
regex, | 仅 运行时 - 审计日志 |
is Impersonated User | 检查请求是否由服务帐户或其它帐户模拟的用户进行。 | is Impersonated User | 布尔值 | ✕ | 仅 运行时 - 审计日志 |
6.1.4. 关于策略强制
当您在 RHACS 中配置策略时,您可以选择 RHACS 在检测到违反安全策略的条件时如何响应。
RHACS 可以执行不同类型的策略执行,或执行处理违反情况的操作,具体取决于发现违反情况的阶段。在配置策略强制时,您可以在策略中配置强制时选择多个阶段。例如,您可以选择 Build 和 Deploy,以便 RHACS 将构建管道警告到问题,但如果开发人员允许构建成功,则会阻止部署。
在 构建时间强制 中,当镜像与策略标准匹配时,您可以将 RHACS 配置为使持续集成(CI)构建失败。这意味着,当构建中有一个违反了策略的条件时,例如,如果严重性级别有可修复的 CVE,并且您为该条件配置了策略,则构建应该会失败。例如,如果您已将 RHACS 配置为检查镜像或部署,并且集成了 CI/CD 管道,如果 RHACS 检测到一个条件,这意味着策略应该失败,RHACS API 会返回非零退出代码。然后,管道使用该代码失败构建。
在 部署时间强制 中,RHACS 可用于 Kubernetes 准入控制器和 OpenShift Container Platform 准入插件,以便您强制执行安全策略。RHACS 可防止 Kubernetes 或 OpenShift Container Platform 创建或更新工作负载,如部署、守护进程集或作业(与策略条件匹配)。这可用于关闭具有严重问题的部署,即使构建成功也是如此。
6.1.4.1. deploy 阶段的安全策略强制
Red Hat Advanced Cluster Security for Kubernetes 支持对 deploy-time 策略的两种安全策略实施:通过准入控制器和 RHACS Sensor 进行软实施的硬强制。准入控制器会阻止创建或更新违反策略的部署。如果准入控制器被禁用或不可用,Sensor 可以将违反策略的部署缩减为 0
来执行强制。
策略实施可能会影响运行应用程序或开发流程。在启用强制选项前,请通知所有利益相关者,并计划如何响应自动化执行操作。
6.1.4.1.1. 硬实施
硬强制由 RHACS 准入控制器执行。在带有准入控制器强制的集群中,Kubernetes 或 OpenShift Container Platform API 服务器会阻止所有不合规的部署。准入控制器会阻止 CREATE
和 UPDATE
操作。任何满足启用了部署时强制配置的策略的 pod 创建或更新请求将失败。
Kubernetes 准入 Webhook 仅支持 CREATE
、UPDATE
、DELETE
或 CONNECT
操作。RHACS 准入控制器只支持 CREATE
和 UPDATE
操作。kubectl patch
、kubectl set
和 kubectl scale
等操作是 PATCH 操作,而不是 UPDATE 操作。因为 Kubernetes 不支持 PATCH 操作,所以 RHACS 无法对 PATCH 操作执行强制。
要阻止强制,您必须在 RHACS 中为集群启用以下设置:
- Object Creates on Object Creates:此切换在 Dynamic Configuration 部分中控制准入控制服务的行为。您必须在 Static Configuration 部分中打开 Configure Admission Controller Webhook 侦听 Object Creates 切换,才能使它正常工作。
- 对 Object Updates 强制执行 :这会在 Dynamic Configuration 部分中切换控制准入控制服务的行为。您必须在 Static Configuration 部分中打开 Configure Admission Controller Webhook 以侦听 Object Updates 切换,才能使它正常工作。
如果更改了 Static Configuration 设置中的设置,您必须重新部署安全集群才能使这些更改生效。
6.1.4.1.2. 软强制
软强制由 RHACS Sensor 执行。这种强制可防止启动操作。在软强制中,Sensor 将副本扩展到 0,并阻止调度 pod。在此强制中,集群中提供了一个非就绪的部署。
如果配置了软强制,并且 Sensor 停机,则 RHACS 无法执行强制。
6.1.4.1.3. 命名空间排除
默认情况下,RHACS 排除某些管理命名空间,如 stackrox
、kube-system
和 istio-system
命名空间。这样做的原因是,必须部署这些命名空间中的一些项目才能使 RHACS 正常工作。
6.1.4.1.4. 对现有部署进行强制
对于现有部署,当 Kubernetes 事件发生时,策略更改只会导致在下一个条件检测时进行强制。如果对策略进行更改,您必须通过 选择策略管理 并单击 Reassess All 来重新评估策略。无论是否有新的传入的 Kubernetes 事件,此操作会在所有现有部署中应用部署策略。如果违反了策略,则 RHACS 执行执行。