2.11. 集成第三方策略控制器
集成第三方策略,在策略模板中创建自定义注解,以指定一个或多个合规标准、控制类别和控制。
您还可以使用来自 policy-collection/community 中的第三方策略。
了解如何集成以下第三方策略:
2.11.1. 集成 Gatekeeper 约束和约束模板
Gatekeeper 是一个验证 webhook,它带有审计功能,可以强制执行基于自定义资源定义的策略,该策略使用 Open Policy Agent (OPA)运行。您可以使用 Gatekeeper operator 策略在集群中安装 Gatekeeper。Gatekeeper 约束可用于评估 Kubernetes 资源合规性。您可以使用 OPA 作为策略引擎,并使用 Rego 作为策略语言。
先决条件: 安装 Gatekeeper 并将 Gatekeeper 策略应用到集群时,需要 Red Hat Advanced Cluster Management for Kubernetes 或 Red Hat OpenShift Container Platform Plus 订阅。只有在最新版本的 Red Hat Advanced Cluster Management 支持的 OpenShift Container Platform 版本(版本 3.11 除外)上支持 gatekeeper。
Gatekeeper 策略使用约束模板(ConstraintTemplates
)和约束编写。查看 Red Hat Advanced Cluster Management 策略中使用 Gatekeeper 约束的以下 YAML 示例:
ConstraintTemplates
和约束: 使用 Red Hat Advanced Cluster Management 策略在 hub 集群上进行多集群发布 Gatekeeper 约束和 Gatekeeper 审计结果聚合。以下示例定义了一个 GatekeeperConstraintTemplate
和 constraint (K8sRequiredLabels
),以确保在所有命名空间中设置了gatekeeper
标签:apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: name: require-gatekeeper-labels-on-ns spec: remediationAction: inform 1 disabled: false policy-templates: - objectDefinition: apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: k8srequiredlabels annotations: policy.open-cluster-management.io/severity: low 2 spec: crd: spec: names: kind: K8sRequiredLabels validation: openAPIV3Schema: properties: labels: type: array items: string targets: - target: admission.k8s.gatekeeper.sh rego: | package k8srequiredlabels violation[{"msg": msg, "details": {"missing_labels": missing}}] { provided := {label | input.review.object.metadata.labels[label]} required := {label | label := input.parameters.labels[_]} missing := required - provided count(missing) > 0 msg := sprintf("you must provide labels: %v", [missing]) } - objectDefinition: apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: ns-must-have-gk annotations: policy.open-cluster-management.io/severity: low 3 spec: enforcementAction: dryrun match: kinds: - apiGroups: [""] kinds: ["Namespace"] parameters: labels: ["gatekeeper"]
- 1
- 因为
remediationAction
被设置为inform
,所以 Gatekeeper 约束的enforcementAction
字段会被覆盖来警告
。这意味着 Gatekeeper 会检测并警告您创建或更新缺少gatekeeper
标签的命名空间。如果策略remediationAction
设置为enforce
,则 Gatekeeper 约束enforcementAction
字段会被覆盖以拒绝
。在这种情况下,此配置可防止任何用户创建或更新缺少gatekeeper
标签的命名空间。 - 2 3
- 可选: 为每个 Gatekeeper 约束或约束模板设置
policy.open-cluster-management.io/severity
注解的严重性值。有效值与其他 Red Hat Advanced Cluster Management 策略类型相同:低
、中
、高
或critical
。
使用前面的策略,您可能会收到以下策略状态消息:
warn - 您必须提供 labels: {"gatekeeper"}(on Namespace default); warn - 您必须提供 labels: {"gatekeeper"}(on Namespace gatekeeper-system)
。当包含 Gatekeeper 约束或ConstraintTemplates
被删除后,限制和ConstraintTemplates
也会从受管集群中删除。要从控制台查看特定受管集群的 Gatekeeper 审计结果,请进入策略模板 结果 页面。如果启用了搜索,请查看失败的审计的 Kubernetes 对象的 YAML。
备注:
- 只有在 Gatekeeper 版本 3.9 或更高版本生成的审计结果时,相关资源 部分才可用。
- Gatekeeper 审计功能默认每分钟运行一次。审计结果会发回到 hub 集群,以便在受管集群的 Red Hat Advanced Cluster Management 策略状态中查看。
policy-gatekeeper-admission
:在 Red Hat Advanced Cluster Management 策略中使用policy-gatekeeper-admission
配置策略来检查 gatekeeper admission webhook 拒绝的 Kubernetes API 请求:apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: policy-gatekeeper-admission spec: remediationAction: inform # will be overridden by remediationAction in parent policy severity: low object-templates: - complianceType: mustnothave objectDefinition: apiVersion: v1 kind: Event metadata: namespace: openshift-gatekeeper-system # set it to the actual namespace where gatekeeper is running if different annotations: constraint_action: deny constraint_kind: K8sRequiredLabels constraint_name: ns-must-have-gk event_type: violation
2.11.1.1. 其他资源
-
如需了解更多详细信息,请参阅
policy-gatekeeper-operator.yaml
。 - 如需了解更多详细信息,请参阅 OPA Gatekeeper 是什么。
- 有关管理其他策略的更多信息,请参阅管理配置策略。
- 有关安全框架的更多主题,请参阅监管。
2.11.2. 策略生成器
Policy Generator 是 Red Hat Advanced Cluster Management for Kubernetes 应用程序生命周期订阅 GitOps 工作流的一部分,它使用 Kustomize 生成 Red Hat Advanced Cluster Management 策略。策略生成器从 Kubernetes 清单 YAML 文件构建 Red Hat Advanced Cluster Management 策略,该文件通过用于配置它的 PolicyGenerator
清单 YAML 文件提供。策略生成器作为 Kustomize 生成器插件实施。有关 Kustomize 的更多信息,请阅读 Kustomize 文档。
如需更多信息,请参阅以下部分:
2.11.2.1. 策略生成器功能
Policy Generator 及其与 Red Hat Advanced Cluster Management 应用程序生命周期订阅 GitOps 工作流的集成简化了 Kubernetes 资源对象的分发到受管 OpenShift Container Platform 集群,并通过 Red Hat Advanced Cluster Management 策略简化 Kubernetes 集群的发布。
使用 Policy Generator 完成以下操作:
- 将任何 Kubernetes 清单文件转换为 Red Hat Advanced Cluster Management 配置策略,包括从 Kustomize 目录创建的清单。
- 在将输入 Kubernetes 清单插入到生成的 Red Hat Advanced Cluster Management 策略前对其进行补丁。
- 生成额外的配置策略,以便您可以通过 Red Hat Advanced Cluster Management for Kubernetes 报告 Gatekeeper 策略违反情况。
- 在 hub 集群上生成策略集。
2.11.2.2. 策略生成器配置结构
策略生成器是一个 Kustomize 生成器插件,它配置了一个 PolicyGenerator
kind 和 policy.open-cluster-management.io/v1
API 版本的清单。
要使用插件,首先在 kustomization.yaml
文件中添加一个 generators
部分。查看以下示例:
generators: - policy-generator-config.yaml
上例中引用的 policy-generator-config.yaml
文件是一个 YAML 文件,其中包含要生成的策略的说明。简单的 PolicyGenerator
配置文件可能类似以下示例:
apiVersion: policy.open-cluster-management.io/v1 kind: PolicyGenerator metadata: name: config-data-policies policyDefaults: namespace: policies policySets: [] policies: - name: config-data manifests: - path: configmap.yaml
configmap.yaml
代表要包含在策略中的 Kubernetes 清单 YAML 文件。另外,您可以设置 Kustomize 目录的路径,或者设置具有多个 Kubernetes 清单 YAML 文件的目录。查看以下示例:
apiVersion: v1 kind: ConfigMap metadata: name: my-config namespace: default data: key1: value1 key2: value2
生成的 Policy
以及生成的 PlacementRule
和 PlacementBinding
可能类似以下示例:
apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: placement-config-data namespace: policies spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: matchExpressions: [] --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: binding-config-data namespace: policies placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: placement-config-data subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: config-data --- apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: annotations: policy.open-cluster-management.io/categories: CM Configuration Management policy.open-cluster-management.io/controls: CM-2 Baseline Configuration policy.open-cluster-management.io/standards: NIST SP 800-53 policy.open-cluster-management.io/description: name: config-data namespace: policies spec: disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: config-data spec: object-templates: - complianceType: musthave objectDefinition: apiVersion: v1 data: key1: value1 key2: value2 kind: ConfigMap metadata: name: my-config namespace: default remediationAction: inform severity: low
2.11.2.3. 策略生成器配置参考表
请注意,每个策略都可以覆盖 policyDefaults
部分中除 namespace
以外的所有字段,每个策略集都可以覆盖 policySetDefaults
部分中的所有字段。
字段 | 可选或必需的 | 描述 |
---|---|---|
| 必填 |
将值设置为 |
| 必填 |
将值设为 |
| 必填 | 用于标识策略资源的名称。 |
| 选填 |
如果多个策略使用相同的放置,则使用此名称为生成的 |
| 必填 |
对于 policies 数组中的条目,这里列出的任何默认值都会被覆盖,但 |
| 必填 | 所有策略的命名空间。 |
| 选填 |
决定在将清单与集群上对象进行比较时的策略控制器行为。您可以使用的值是 |
| 选填 |
在将清单元数据部分与集群中的对象进行比较时,会覆盖 |
| 选填 |
|
| 选填 |
|
| 选填 |
|
| 选填 |
策略在 |
| 选填 |
用于对生成的配置策略设置的注解的键值对。例如,您可以通过定义以下参数来禁用策略模板: |
| 选填 |
复制所有策略的标签和注解,并将它们添加到副本策略中。默认设置为 |
| 选填 |
策略违反的严重性。默认值为 |
| 选填 |
策略是否被禁用,代表不会传播它,因此结果为没有状态。默认值为 |
| 选填 |
策略的补救机制。参数值是 |
| 没有指定命名空间的命名空间对象是必需的 |
决定对象要应用到的受管集群中的命名空间。 |
| 选填 |
使用 |
| 选填 |
决定在删除策略时是否应删除由策略创建或监控的对象。只有策略的补救操作被设置为 |
| 选填 |
应用此策略前必须处于特定合规性状态的对象列表。当 |
| 必填 | 要依赖的对象名称。 |
| 选填 | 要依赖的对象的命名空间。默认为 Policy Generator 设置的策略命名空间。 |
| 选填 |
对象需要处于的合规性状态。默认值为 |
| 选填 |
对象的种类。默认情况下,kind 设置为 |
| 选填 |
对象的 API 版本。默认值为 |
| 选填 |
应用此策略前必须处于特定合规性状态的对象列表。您定义的依赖项会独立于 |
| 必填 | 要依赖的对象名称。 |
| 选填 | 要依赖的对象的命名空间。默认情况下,值设为为 Policy Generator 设置的策略命名空间。 |
| 选填 |
对象需要处于的合规性状态。默认值为 |
| 选填 |
对象的种类。默认值为 |
| 选填 |
对象的 API 版本。默认值为 |
| 选填 |
当 Policy Generator 等待其依赖项达到其所需状态时,绕过合规性状态检查。默认值为 |
| 选填 |
自动生成有关策略的 |
| 选填 |
在策略模板上自动生成 |
| 选填 |
这决定了是否为策略中包含的所有清单生成单一配置策略。如果设置为 |
| 选填 |
将 |
| 选填 |
当策略引用 Kyverno 策略清单时,这决定了在 Kyverno 策略被违反时,是否生成额外的配置策略来接收 Red Hat Advanced Cluster Management 中的策略违反情况。默认值为 |
| 选填 |
策略加入的策略集合的数组。策略设置详情可在 |
| 选填 |
为策略生成放置清单。默认设置为 |
| 选填 |
当一个策略是策略集的一部分时,默认情况下,生成器不会为这个策略生成放置,因为会为策略集生成一个。将 |
| 选填 | 策略的放置配置。这默认为与所有集群匹配的放置配置。 |
| 选填 | 指定一个名称来整合包含相同集群选择器的放置规则。 |
| 选填 |
使用 |
| 选填 |
定义此参数以使用集群中已存在的放置。没有创建 |
| 选填 |
要重复使用现有放置,请指定相对于 |
| 选填 |
|
| 选填 |
|
| 选填 |
|
| 选填 |
策略设置的默认值。为此参数列出的任何默认值都会被 |
| 选填 |
策略的放置配置。这默认为与所有集群匹配的放置配置。有关此字段的描述,请参阅 |
| 选填 |
为策略集合生成放置清单。默认设置为 |
| 必填 |
要创建的策略列表以及覆盖默认值或 |
| 必填 | 要创建的策略的名称。 |
| 必填 |
策略中包含的 Kubernetes 对象清单列表,以及覆盖默认值、此 |
| 必填 |
相对于 |
| 选填 |
应用到路径上清单的 Kustomize 补丁列表。如果有多个清单,补丁需要设置 |
| 选填 |
要创建的策略集合列表,以及覆盖默认值或 |
| 必填 | 要创建的策略的名称。 |
| 选填 | 要创建的策略集的描述。 |
| 选填 |
包括在策略集中的策略列表。如果还指定了 |
2.11.2.4. 其他资源
- 读取 生成策略以安装 GitOps Operator。
- 读到 Policy set controller 以获取更多详细信息。
- 如需更多信息,请参阅 应用 Kustomize。
- 如需了解更多主题,请参阅监管 文档。
-
请参阅
kustomization.yaml
文件示例。 - 请参阅 Kubernetes 标签和选择器 文档。
- 如需更多详细信息,请参阅 Gatekeeper。
- 请参阅 Kustomize 文档。
- 返回集成第三方策略控制器文档。