2.4. 集成第三方策略控制器
集成第三方策略,在策略模板中创建自定义注解,以指定一个或多个合规标准、控制类别和控制。
您还可以使用来自 policy-collection/community 中的第三方策略。
了解如何集成以下第三方策略:
2.4.1. 集成 gatekeeper 约束和约束模板
Gatekeeper 是一个验证 webhook,它强制执行基于自定义资源定义(CRD)的策略,该策略与 Open Policy Agent(OPA)一起运行。您可以使用 gatekeeper operator 策略在集群中安装 gatekeeper。Gatekeeper 策略可用于评估 Kubernetes 资源合规性。您可以使用 OPA 作为策略引擎,并使用 Rego 作为策略语言。
gatekeeper 策略在 Red Hat Advanced Cluster Management 中作为 Kubernetes 配置策略创建。Gatekeeper 策略包括约束模板(ConstraintTemplates
)和 Constraints
、审计模板和准入模板。如需更多信息,请参阅 Gatekeeper 上游存储库。
Red Hat Advanced Cluster Management 支持 Gatekeeper 版本 3.3.0,并在 Red Hat Advanced Cluster Management gatekeeper 策略中应用以下约束模板:
ConstraintTemplates
和约束: 使用policy-gatekeeper-k8srequiredlabels
策略在受管集群上创建 gatekeeper 约束模板。apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: policy-gatekeeper-k8srequiredlabels spec: remediationAction: enforce # will be overridden by remediationAction in parent policy severity: low object-templates: - complianceType: musthave objectDefinition: apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: k8srequiredlabels spec: crd: spec: names: kind: K8sRequiredLabels validation: # Schema for the `parameters` field 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]) } - complianceType: musthave objectDefinition: apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: ns-must-have-gk spec: match: kinds: - apiGroups: [""] kinds: ["Namespace"] namespaces: - e2etestsuccess - e2etestfail parameters: labels: ["gatekeeper"]
audit 模板: 使用
policy-gatekeeper-audit
定期检查并评估为检测现有错误配置而强制执行的门管理器策略的现有资源。apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: policy-gatekeeper-audit spec: remediationAction: inform # will be overridden by remediationAction in parent policy severity: low object-templates: - complianceType: musthave objectDefinition: apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: ns-must-have-gk status: totalViolations: 0
Admission 模板: 使用
policy-gatekeeper-admission
检查由 gatekeeper admission webhook 创建的错误配置: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
如需了解更多详细信息,请参阅 policy-gatekeeper-sample.yaml
。
2.4.2. 策略生成器
策略生成器是 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 文档。
此 Red Hat Advanced Cluster Management 版本捆绑的策略生成器版本为 v1.9.0。
2.4.2.1. 策略生成器功能
策略生成器及其与 Red Hat Advanced Cluster Management 应用程序生命周期 订阅 GitOps 工作流的集成简化了 Kubernetes 资源对象的分发到受管 OpenShift 集群,并通过 Red Hat Advanced Cluster Management 策略简化了 Kubernetes 集群的分发。特别是,使用策略生成器完成以下操作:
- 将任何 Kubernetes 清单文件转换为 Red Hat Advanced Cluster Management 配置策略,包括从 Kustomize 目录创建的清单。
- 在将输入 Kubernetes 清单插入到生成的 Red Hat Advanced Cluster Management 策略前对其进行补丁。
- 生成额外的配置策略,以便能够通过 Red Hat Advanced Cluster Management for Kubernetes 报告 Gatekeeper 和策略违反情况。
- 在 hub 集群上生成策略集。如需了解更多详细信息,请参阅策略设置控制器。
如需更多信息,请查看以下主题:
2.4.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 文件,其中包含要生成的策略的说明。简单的策略生成器配置文件可能类似以下示例:
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 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
如需了解更多详细信息,请参阅 policy-generator-plugin
存储库。
2.4.2.3. 生成用于安装 Operator 的策略
Red Hat Advanced Cluster Management 策略的一个常见用途是在一个或多个受管 OpenShift 集群上安装 Operator。查看以下不同安装模式和所需资源的示例。
2.4.2.3.1. 安装 OpenShift GitOps 的策略
本例演示了如何生成一个策略,以使用策略生成器安装 OpenShift GitOps。OpenShift GitOps 操作器 提供所有命名空间 安装模式。首先,需要按照以下示例创建名为 openshift-gitops-subscription.yaml
的订阅
清单文件。
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-gitops-operator namespace: openshift-operators spec: channel: stable name: openshift-gitops-operator source: redhat-operators sourceNamespace: openshift-marketplace
要固定到 Operator 的特定版本,您可以添加以下参数和值: spec.startingCSV: openshift-gitops-operator.v<version>
。将 <version>
替换为您的首选版本。
接下来,需要名为 policy-generator-config.yaml
的策略生成器配置文件。以下示例显示了一个策略,它将在所有 OpenShift 受管集群上安装 OpenShift GitOps:
apiVersion: policy.open-cluster-management.io/v1 kind: PolicyGenerator metadata: name: install-openshift-gitops policyDefaults: namespace: policies placement: clusterSelectors: vendor: "OpenShift" remediationAction: enforce policies: - name: install-openshift-gitops manifests: - path: openshift-gitops-subscription.yaml
所需的最后一个文件是 kustomization.yaml
文件。kustomization.yaml
文件需要以下配置:
generators: - policy-generator-config.yaml
生成的策略可能类似以下文件:
apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: placement-install-openshift-gitops namespace: policies spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: matchExpressions: - key: vendor operator: In values: - OpenShift --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: binding-install-openshift-gitops namespace: policies placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: placement-install-openshift-gitops subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: install-openshift-gitops --- 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 name: install-openshift-gitops namespace: policies spec: disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: install-openshift-gitops spec: object-templates: - complianceType: musthave objectDefinition: apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-gitops-operator namespace: openshift-operators spec: channel: stable name: openshift-gitops-operator source: redhat-operators sourceNamespace: openshift-marketplace remediationAction: enforce severity: low
所有输入来自 OpenShift Container Platform 文档中的策略,并由策略生成器生成。查看 OpenShift Container Platform 文档中的以下 YAML 输入示例:
如需了解更多详细信息,请参阅 了解 OpenShift GitOps 和 Operator 文档。
2.4.2.3.2. 安装 Compliance Operator 的策略
对于使用 命名空间安装模式的 Operator,如 Compliance Operator,还需要 OperatorGroup
清单。本例演示了安装 Compliance Operator 的生成的策略。
首先,必须创建一个带有 Namespace
、Subscription
和名为 compliance-operator.yaml
的 OperatorGroup
清单的 YAML 文件。以下示例将这些清单安装到 compliance-operator
命名空间中:
apiVersion: v1 kind: Namespace metadata: name: openshift-compliance --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: compliance-operator namespace: openshift-compliance spec: channel: release-0.1 name: compliance-operator source: redhat-operators sourceNamespace: openshift-marketplace --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: compliance-operator namespace: openshift-compliance spec: targetNamespaces: - compliance-operator
接下来,需要名为 policy-generator-config.yaml
的策略生成器配置文件。以下示例显示了在一个 OpenShift 受管集群上安装 Compliance Operator 的单一策略:
apiVersion: policy.open-cluster-management.io/v1 kind: PolicyGenerator metadata: name: install-compliance-operator policyDefaults: namespace: policies placement: clusterSelectors: vendor: "OpenShift" remediationAction: enforce policies: - name: install-compliance-operator manifests: - path: compliance-operator.yaml
所需的最后一个文件是 kustomization.yaml
文件。kustomization.yaml
文件中需要以下配置:
generators: - policy-generator-config.yaml
因此,生成的策略类似于以下文件:
apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: placement-install-compliance-operator namespace: policies spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: matchExpressions: - key: vendor operator: In values: - OpenShift --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: binding-install-compliance-operator namespace: policies placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: placement-install-compliance-operator subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: install-compliance-operator --- 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 name: install-compliance-operator namespace: policies spec: disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: install-compliance-operator spec: object-templates: - complianceType: musthave objectDefinition: apiVersion: v1 kind: Namespace metadata: name: openshift-compliance - complianceType: musthave objectDefinition: apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: compliance-operator namespace: openshift-compliance spec: channel: release-0.1 name: compliance-operator source: redhat-operators sourceNamespace: openshift-marketplace - complianceType: musthave objectDefinition: apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: compliance-operator namespace: openshift-compliance spec: targetNamespaces: - compliance-operator remediationAction: enforce severity: low
如需了解更多详细信息,请参阅 Compliance Operator 文档。
2.4.2.4. 在 OpenShift GitOps (ArgoCD) 上安装策略生成器
基于 ArgoCD 的 OpenShift GitOps 也可用于通过 GitOps 使用策略生成器生成策略。由于 OpenShift GitOps 容器镜像中没有预安装策略生成器,因此需要进行一些自定义。为了继续操作,预计在 Red Hat Advanced Cluster Management hub 集群中安装了 OpenShift GitOps Operator,并确保登录到 hub 集群。
为了使 OpenShift GitOps 在运行 Kustomize 时可以访问策略生成器,需要初始容器将 Red Hat Advanced Cluster Management Application Subscription 容器镜像中的策略生成器二进制文件复制到 OpenShift GitOps 容器,该运行 Kustomize。如需了解更多详细信息,请参阅在部署 pod 前使用初始容器执行任务。另外,OpenShift GitOps 必须被配置为在运行 Kustomize 时提供 --enable-alpha-plugins
标志。使用以下命令开始编辑 OpenShift GitOps argocd
对象:
oc -n openshift-gitops edit argocd openshift-gitops
然后,修改 OpenShift GitOps argocd
对象使其包含以下额外的 YAML 内容。当发布新的 Red Hat Advanced Cluster Management 主版本且您要将策略生成器更新至更新的版本时,您需要更新 registry.redhat.io/rhacm2/multicluster-operators-subscription-rhel8
镜像,供 Init 容器用于较新的标签。查看以下示例,将 <version>
替换为 2.6 或您所需的 Red Hat Advanced Cluster Management 版本:
apiVersion: argoproj.io/v1alpha1 kind: ArgoCD metadata: name: openshift-gitops namespace: openshift-gitops spec: kustomizeBuildOptions: --enable-alpha-plugins repo: env: - name: KUSTOMIZE_PLUGIN_HOME value: /etc/kustomize/plugin initContainers: - args: - -c - cp /etc/kustomize/plugin/policy.open-cluster-management.io/v1/policygenerator/PolicyGenerator /policy-generator/PolicyGenerator command: - /bin/bash image: registry.redhat.io/rhacm2/multicluster-operators-subscription-rhel8:v<version> name: policy-generator-install volumeMounts: - mountPath: /policy-generator name: policy-generator volumeMounts: - mountPath: /etc/kustomize/plugin/policy.open-cluster-management.io/v1/policygenerator name: policy-generator volumes: - emptyDir: {} name: policy-generator
现在,OpenShift GitOps 可以使用策略生成器,OpenShift GitOps 必须被授予在 Red Hat Advanced Cluster Management hub 集群中创建策略的访问权限。创建以下 ClusterRole
资源,名为 openshift-gitops-policy-admin
,它有权创建、读取、更新和删除策略和放置。您的 ClusterRole
可能类似以下示例:
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: openshift-gitops-policy-admin rules: - verbs: - get - list - watch - create - update - patch - delete apiGroups: - policy.open-cluster-management.io resources: - policies - placementbindings - verbs: - get - list - watch - create - update - patch - delete apiGroups: - apps.open-cluster-management.io resources: - placementrules - verbs: - get - list - watch - create - update - patch - delete apiGroups: - cluster.open-cluster-management.io resources: - placements - placements/status - placementdecisions - placementdecisions/status
另外,创建一个 ClusterRoleBinding
对象来授予 OpenShift GitOps 服务帐户对 openshift-gitops-policy-admin
ClusterRole
的访问权限。ClusterRoleBinding
可能类似以下资源:
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: openshift-gitops-policy-admin subjects: - kind: ServiceAccount name: openshift-gitops-argocd-application-controller namespace: openshift-gitops roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: openshift-gitops-policy-admin
2.4.2.5. 策略生成器配置参考表
请注意,每个策略可覆盖 policyDefaults
部分中除 namespace
以外的所有字段。
字段 | 可选或必需的 | 描述 |
---|---|---|
| 必需 |
将值设置为 |
| 必需 |
将值设为 |
| 必需 | 用于标识策略资源的名称。 |
| 选填 |
如果多个策略使用相同的放置,则使用此名称为生成的 |
| 必需 |
对于 policies 数组中的条目,这里列出的任何默认值都会被覆盖,但 |
| 必需 | 所有策略的命名空间。 |
| 选填 |
决定在将清单与集群上对象进行比较时的策略控制器行为。您可以使用的值是 |
| 选填 |
在将清单元数据部分与集群中的对象进行比较时,会覆盖 |
| 选填 |
|
| 选填 |
|
| 选填 |
|
| 选填 |
策略在 |
| 选填 |
用于对生成的配置策略设置的注解的键值对。例如,您可以通过定义以下参数来禁用策略模板: |
| 选填 |
策略违反的严重性。默认值为 |
| 选填 |
策略是否被禁用,代表不会传播它,因此结果为没有状态。默认值为 |
| 选填 |
策略的补救机制。参数值是 |
| 没有指定命名空间的命名空间对象是必需的 |
决定对象要应用到的受管集群中的命名空间。 |
| 选填 |
使用 |
| 选填 |
这决定了是否为策略中包含的所有清单生成单一配置策略。如果设置为 |
| 选填 |
当策略引用违反 gatekeeper 策略清单时,这决定了是否应生成额外的配置策略以便在 Red Hat Advanced Cluster Management 中接收策略违反情况。默认值为 |
| 选填 |
策略加入的策略集合的数组。策略设置详情可在 |
| 选填 |
当一个策略是策略集的一部分时,默认情况下,生成器不会为这个策略生成放置,因为会为策略集生成一个。将 |
| 选填 | 策略的放置配置。这默认为与所有集群匹配的放置配置。 |
| 选填 | 指定一个名称来整合包含相同集群选择器的放置规则。 |
| 选填 |
定义此参数以使用集群中已存在的放置。没有创建 |
| 选填 |
要重复使用现有的放置,请指定相对于 |
| 选填 |
通过以以下格式 |
| 选填 |
要使用集群中已存在的放置规则,请在此处指定其名称。 |
| 选填 |
要重复使用现有放置规则,请指定相对于 |
| 选填 |
使用以下格式定义集群选择器来指定放置规则,即 |
| 必需。 |
要创建的策略列表以及覆盖默认值或 |
| 必需 | 要创建的策略的名称。 |
| 必需 | 策略中包含的 Kubernetes 对象清单列表。 |
| 必需 |
相对于 |
| 选填 |
决定在将清单与集群上对象进行比较时的策略控制器行为。参数值为 |
| 选填 |
应用到路径上清单的 Kustomize 补丁程序。如果有多个清单,补丁需要设置 |
| 选填 |
要创建的策略集合列表。要在策略集中包含策略,请使用 |
| 必需 | 要创建的策略的名称。 |
| 选填 | 要创建的策略集的描述。 |
| 选填 |
包括在策略集中的策略列表。如果还指定了 |
| 选填 |
策略设置的放置配置。这默认为与所有集群匹配的放置配置。请参阅 |
返回集成第三方策略控制器文档,或者参阅监管文档了解更多主题。