2.6. 管理安全策略


使用监管仪表板创建、查看和管理安全策略和策略违反情况。您可以通过 CLI 和控制台为您的策略创建 YAML 文件。

2.6.1. 监管页面

Governance 页面中显示以下标签页:

  • 概述

    Overview 选项卡中查看以下概述卡: Policy set violations,Policy violations,Clusters,Categories, Controls, 和 Standards

  • 策略集合

    创建和管理 hub 集群策略集。

  • 策略(policy)

    创建和管理安全策略。策略列表列出了以下策略详情:Name, Namespace, Status, Remediation, Policy set, Cluster violations, Source, AutomationCreated

    您可以编辑、启用或禁用,将补救设置为 inform 或 enforce,或通过选择 Actions 图标来删除策略。您可以通过选择要展开行的下拉箭头来查看特定策略的类别和标准。

    选择多个策略并点击 Actions 按钮来完成批量操作。您还可以点 Filter 按钮自定义您的策略表。

当您在表列表中选择一个策略时,控制台中会显示以下信息标签页:

  • Details :选择 Details 选项卡来查看策略详情和放置详情。在 Placement 表中,Compliance 列提供了查看所显示集群的合规性的链接。
  • Results :选择 Results 选项卡来查看与放置关联的所有集群的表列表。

    Message 列中,点 View details 链接来查看模板详情、模板 YAML 和相关资源。您还可以查看相关的资源。点 View history 链接查看违反消息以及最后一次报告的时间。

2.6.2. 监管自动化配置

如果为特定策略配置了自动化,您可以选择自动化来查看更多详情。查看以下自动化调度频率选项的描述:

  • Manual run:手动将此自动化设置为运行一次。在自动化运行后,它将设置为 disabled注:您只能在禁用调度频率时选择 Manual run 模式。
  • Run once mode:违反策略时,自动化将运行一次。在自动化运行后,它将设置为 disabled。在将自动化设置为禁用后,您必须继续手动运行自动化。当使用 once mode 时,target_clusters 的额外变量会自动提供违反策略的集群列表。Ansible Automation Platform Job 模板需要为 EXTRA VARIABLES 段(也称为 extra_vars)启用 PROMPT ON LAUNCH
  • 运行 everyEvent 模式 :违反策略时,每个受管集群的唯一策略都会运行自动化。使用 DelayAfterRunSeconds 参数在同一集群中重启自动化前设置最小秒数。如果策略在延迟期内违反多次,并保持在违反的状态,则自动化会在延迟期后运行一次。默认值为 0 秒,它仅适用于 everyEvent 模式。当您运行 everyEvent 模式时,target_clusters 和 Ansible Automation Platform 作业模板的额外变量与 once mode 相同。
  • Disable automation:当调度的自动化被设置为禁用时,在更新设置前不会运行自动化。

Ansible Automation Platform 作业的 extra_vars 中会自动提供以下变量:

  • policy_name:在 hub 集群上启动 Ansible Automation Platform 作业的不合规根策略的名称。
  • policy_namespace: root 策略的命名空间。
  • hub_cluster :hub 集群的名称,它由集群 DNS 对象中的值决定。
  • policy_sets :此参数包含根策略的所有关联的策略集名称。如果策略不在策略集中,policy_set 参数为空。
  • policy_violations :此参数包含不合规集群名称的列表,值是每个不合规集群的策略 status 字段。

查看以下主题以了解更多有关创建和更新您的安全策略的信息。

2.6.3. 为监管配置 Ansible Automation Platform

Red Hat Advanced Cluster Management for Kubernetes 监管可与 Red Hat Ansible Automation Platform 集成,以创建策略违反自动化。您可以从 Red Hat Advanced Cluster Management 控制台配置自动化。

2.6.3.1. 先决条件

  • Red Hat OpenShift Container Platform 4.5 或更高版本
  • 已安装 Ansible Automation Platform 版本 3.7.3 或更高版本。最佳实践是安装最新支持的 Ansible Automation Platform 版本。如需了解更多详细信息,请参阅 Red Hat Ansible Automation Platform 文档
  • 从 Operator Lifecycle Manager 安装 Ansible Automation Platform Resource Operator。在 Update Channel 部分中,选择 stable-2.x-cluster-scoped。选择 All namespaces on the cluster (default) 安装模式。

    注: 在运行 Ansible Automation Platform 作业模板时,请确保 Ansible Automation Platform 作业模板是幂等的。如果没有 Ansible Automation Platform Resource Operator,您可以在 Red Hat OpenShift Container Platform OperatorHub 页面中找到它。

有关安装和配置 Red Hat Ansible Automation Platform 的更多信息,请参阅设置 Ansible 任务

2.6.3.2. 从控制台创建策略违反自动化

登录到 Red Hat Advanced Cluster Management hub 集群后,从导航菜单中选择 Governance,然后点 Policies 选项卡来查看策略表。

单击 Automation 列中的 Configure,为特定策略配置自动化。当策略自动化面板出现时,您可以创建自动化。在 Ansible credential 部分中,单击下拉菜单来选择 Ansible 凭据。如果您需要添加凭证,请参阅管理凭证概述

:此凭证复制到与策略相同的命名空间中。该凭据供创建用于启动自动化的 AnsibleJob 资源使用。控制台的 Credentials 部分中的 Ansible 凭据更改会被自动更新。

选择了凭据后,单击 Ansible 作业下拉列表来选择作业模板。在 Extra variables 部分,添加来自 PolicyAutomationextra_vars 部分中的参数值。选择自动化的频率。您可以选择 Run once modeRun everyEvent modeDisable automation

选择 Submit 保存您的策略违反自动化。当您从 Ansible 作业详情侧面板选择 View Job 链接时,链接会将您定向到 Search 页面上的作业模板。成功创建自动化后,它会显示在 Automation 列中。

注: 当您删除具有关联策略自动化的策略时,策略自动化会在清理过程中自动删除。

您的策略违反自动化是从控制台创建的。

2.6.3.3. 通过 CLI 创建策略违反自动化

完成以下步骤,通过 CLI 配置策略违反自动化:

  1. 在终端中,使用 oc login 命令登录到 Red Hat Advanced Cluster Management hub 集群。
  2. 查找或创建您要向其添加自动化的策略。请注意策略名称和命名空间。
  3. 使用以下示例创建 PolicyAutomation 资源,作为指南:

    apiVersion: policy.open-cluster-management.io/v1beta1
    kind: PolicyAutomation
    metadata:
      name: policyname-policy-automation
    spec:
      automationDef:
        extra_vars:
          your_var: your_value
        name: Policy Compliance Template
        secret: ansible-tower
        type: AnsibleJob
      mode: disabled
      policyRef: policyname
  4. 上例中的 Automation 模板名称是 Policy Compliance Template。更改该值,使其与您的任务模板名称匹配。
  5. extra_vars 部分中,添加您需要传递给 Automation 模板的任何参数。
  6. 将模式设置为 onceeveryEventdisabled
  7. policyRef 设置为您的策略的名称。
  8. 在与包含 Ansible Automation Platform 凭据的 PolicyAutomation 资源相同的命名空间中创建一个 secret。在上例中,secret 名称为 ansible-tower。使用应用程序生命周期中的示例来查看如何创建 secret。
  9. 创建 PolicyAutomation 资源。

    备注:

    • 可以通过在 PolicyAutomation 资源中添加以下注解来立即运行策略自动化:

      metadata:
        annotations:
          policy.open-cluster-management.io/rerun: "true"
    • 当策略为 once 模式时,当策略不合规时自动化将运行。添加名为 target_clustersextra_vars 变量,值是每个受管集群名称的数组,其中的策略不合规。
    • 当策略处于 everyEvent 模式且 DelayAfterRunSeconds 超过定义的时间值时,策略不合规,且自动化会针对每个策略违反。

2.6.4. 使用 GitOps 部署策略

您可以使用监管框架在一组受管集群中部署一组策略。您可以通过添加到开源社区的 policy-collection,贡献并使用软件仓库中的策略。如需更多信息,请参阅贡献自定义策略。来自开源社区的、位于 stablecommunity 目录中的策略会进一步根据 NIST Special Publication 800-53 进行组织。

继续阅读以了解使用 GitOps 通过 Git 存储库自动化和跟踪策略更新和创建的最佳做法。

先决条件:开始之前,请务必 fork policy-collection 存储库。

2.6.4.1. 自定义本地存储库

通过将 stablecommunity 策略整合到单个文件夹中,自定义您的本地存储库。删除您不想使用的策略。完成以下步骤以自定义您的本地存储库:

  1. 在存储库中创建一个新目录,以存放您要部署的策略。确保您位于 GitOps 的主要默认分支的本地 policy-collection 存储库中。运行以下命令:

    mkdir my-policies
  2. 将所有 stablecommunity 策略复制到您的 my-policies 目录中。首先,如果 stable 文件夹包含 community 中可用内容的副本,则首先从社区策略开始。运行以下命令:

    cp -R community/* my-policies/
    
    cp -R stable/* my-policies/

    现在,您在一个父目录结构中已有所有策略,您可以在 fork 中编辑策略。

    提示:

    • 最佳做法是删除您不打算使用的策略。
    • 从以下列表中了解策略和策略定义:

      • 用途:了解策略的作用。
      • 补救操作:该策略是否仅告知您合规,还是强制执行策略并进行更改?请参阅 spec.remediationAction 参数。如果强制进行更改,请确保您了解功能预期。记得检查哪些策略支持执行。如需更多信息,请参阅 Validate 部分。

        :策略的 spec.remediationAction 设置覆盖单个 spec.policy-templates 中设置的任何补救操作。

      • placement:策略部署到哪些群集?默认情况下,大多数策略都以带有 environment: dev 标签的集群为目标。有些策略可能针对 OpenShift Container Platform 集群或其他标签。您可以更新或添加附加标签来包括其他集群。如果没有特定值,策略会应用到所有集群。您还可以创建策略的多个副本并为每个副本自定义,如果您想要使用一组集群配置的一种策略,并为另一组集群配置另一种方式。

2.6.4.2. 提交到您的本地存储库

在您对目录所做的更改满意后,提交您的更改并将其推送到 Git,以便集群可以访问它们。

:本示例用于显示如何将策略与 GitOps 搭配使用的基础知识,因此您可能具有不同的工作流来对分支进行更改。

完成以下步骤:

  1. 在终端中运行 git status,以查看您之前创建的目录中的最近更改。将您的新目录添加到要使用以下命令提交的更改列表中:

    git add my-policies/
  2. 提交更改并自定义您的消息。运行以下命令:

    git commit -m “Policies to deploy to the hub cluster”
  3. 将更改推送到用于 GitOps 的已分叉存储库的分支。运行以下命令:

    git push origin <your_default_branch>master

您的更改已提交。

2.6.4.3. 在集群中部署策略

在推送更改后,您可以将策略部署到 Red Hat Advanced Cluster Management for Kubernetes 安装中。在部署后,您的 hub 集群连接到 Git 存储库。对 Git 存储库所选分支的任何其他更改都会反映在集群中。

: 默认情况下,通过 GitOps 部署的策略使用 merge reconcile 选项。如果要使用 replace 协调选项,将 apps.open-cluster-management.io/reconcile-option: replace 注解添加到 Subscription 资源。如需了解更多详细信息,请参阅应用程序生命周期

deploy.sh 脚本在 hub 集群中创建 ChannelSubscription 资源。频道连接到 Git 仓库,订阅指定要通过频道传递给集群的数据。因此,在您的 hub 上会创建指定子目录中定义的所有策略。在订阅创建策略后,Red Hat Advanced Cluster Management 会根据定义的放置规则分析策略,并在与策略应用到的每个受管集群关联的命名空间中创建额外的策略资源。

该策略随后从 hub 集群上对应的受管集群命名空间中复制到受管集群。因此,Git 仓库中的策略推送到具有与策略放置规则中定义的 clusterSelector 匹配的所有受管集群。

完成以下步骤:

  1. policy-collection 文件夹中运行以下命令来更改目录:

    cd deploy
  2. 请确定将命令行界面(CLI)配置为使用以下命令在正确的集群中创建资源:

    oc cluster-info

    命令的输出显示集群的 API 服务器详情,其中安装了 Red Hat Advanced Cluster Management。如果没有显示正确的 URL,请将 CLI 配置为指向正确的集群。如需更多信息,请参阅使用 OpenShift CLI

  3. 创建一个命名空间,创建您的策略以控制访问和组织策略。运行以下命令:

    oc create namespace policy-namespace
  4. 运行以下命令将策略部署到集群中:

    ./deploy.sh -u https://github.com/<your-repository>/policy-collection -p my-policies -n policy-namespace

    your-repository 替换为您的 Git 用户名或存储库名称。

    deploy.sh 脚本的完整参数列表使用以下语法:

    ./deploy.sh [-u <url>] [-b <branch>] [-p <path/to/dir>] [-n <namespace>] [-a|--name <resource-name>]

    查看每个参数的以下解释:

    • URL:从主 policy-collection 存储库派生的存储库的 URL。默认 URL 为 https://github.com/stolostron/policy-collection.git
    • 分支:要指向的 Git 存储库的分支。默认分支为 main
    • 子目录路径:为包含要使用的策略而创建的子目录路径。在前面的示例中,我们使用了 my-policies 子目录,但您也可以指定您想要从哪个文件夹开始。例如,您可以使用 my-policies/AC-Access-Control。默认文件夹为 stable
    • Namespace:在 hub 集群中创建资源和策略的命名空间。这些说明使用 policy-namespace 命名空间。默认命名空间是 policies
    • 名称前缀: ChannelSubscription 资源的前缀。默认为 demo-stable-policies

运行 deploy.sh 脚本后,有权访问存储库的任何用户都可以提交更改到分支,该分支会将更改推送到集群上执行策略。

注:要使用订阅部署策略,请完成以下步骤:

  1. open-cluster-management:subscription-admin ClusterRole 绑定到创建订阅的用户。
  2. 如果您在订阅中使用允许列表,请包含以下 API 条目:

        - apiVersion: policy.open-cluster-management.io/v1
          kinds:
            - "*"
        - apiVersion: policy.open-cluster-management.io/v1beta1
          kinds:
            - "*"
        - apiVersion: apps.open-cluster-management.io/v1
          kinds:
            - PlacementRule
        - apiVersion: cluster.open-cluster-management.io/v1beta1
          kinds:
            - Placement

2.6.4.4. 从控制台验证 GitOps 策略部署

从控制台验证您的更改是否已应用于您的策略。您还可以从控制台对策略进行更多更改,但当 订阅 与 Git 存储库协调时,会恢复更改。完成以下步骤:

  1. 登录您的 Red Hat Advanced Cluster Management 集群。
  2. 在导航菜单中选择 Governance
  3. 查找您在表中部署的策略。使用 GitOps 部署的策略在 Source 列中具有 Git 标签。单击该标签,以查看 Git 存储库的详细信息。
2.6.4.4.1. 通过 CLI 验证 GitOps 策略部署

完成以下步骤:

  1. 检查以下策略详情:

    • 为什么一个特定的策论在所分发的集群中合规或不合规?
    • 策略是否应用到正确的集群?
    • 如果此策略没有分发到任何集群,为什么?
  2. 识别您创建或修改的 GitOps 部署策略。GitOps 部署的策略可以通过自动应用的注解来标识。GitOps 部署的策略的注解类似以下路径:

    apps.open-cluster-management.io/hosting-deployable: policies/deploy-stable-policies-Policy-policy-role9
    
    apps.open-cluster-management.io/hosting-subscription: policies/demo-policies
    
    apps.open-cluster-management.io/sync-source: subgbk8s-policies/demo-policies

    GitOps 注解可用于查看哪一订阅创建了该策略。您还可以在策略中添加自己的标签,以便可以编写基于标签选择策略的运行时查询。

    例如,您可以使用以下命令在策略中添加标签:

    oc label policies.policy.open-cluster-management.io <policy-name> -n <policy-namespace> <key>=<value>

    然后,您可以使用以下命令查询带有标签的策略:

    oc get policies.policy.open-cluster-management.io -n <policy-namespace> -l <key>=<value>

使用 GitOps 部署了您的策略。

2.6.5. 支持配置策略中的模板

配置策略支持将 Golang 文本模板包含在对象定义中。这些模板在 hub 集群或目标受管集群的运行时使用与该集群相关的配置解决。这可让您使用动态内容定义配置策略,并通知或强制实施为目标集群自定义的 Kubernetes 资源。

2.6.5.1. 前提条件

  • 模板语法必须符合 Golang 模板语言规范,并且从解析的模板生成的资源定义必须是有效的 YAML。如需更多与 Package 模板相关的信息,请参阅 Golang 文档。模板验证中的任何错误都将识别为策略违反情况。当您使用自定义模板功能时,这些值会在运行时被替换。

2.6.5.2. 模板功能

模板功能(如特定于资源和通用的 lookup 模板功能)可用于引用 hub 集群上的 Kubernetes 资源(使用 {{hub …​ hub}} 分隔符)或受管集群(使用 {{ …​ }} 分隔符)。如需了解更多详细信息,请参阅配置策略中的 hub 集群模板 支持。特定于资源的功能用于方便使用,并使资源内容更易于访问。如果您使用通用的函数 lookup,则最好熟悉正在查找的资源的 YAML 结构。除了这些功能外,还提供 base64encbase64 enc、indentautoindenttoInttoBool 等实用程序功能。

要将模板符合 YAML 语法,必须使用引号或块字符(|>)在策略资源中以字符串的形式设置模板。这会导致解析的模板值也是字符串。要覆盖此功能,请考虑使用 toInttoBool 作为模板中的最终功能,以启动进一步处理,强制将值解释为整数或布尔值。

继续阅读以查看支持的一些自定义模板功能的描述和示例:

2.6.5.2.1. fromSecret 功能

fromSecret 功能返回 secret 中给定 data 键的值。查看该功能的以下语法:

func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)

使用此功能时,请输入 Kubernetes Secret 资源的命名空间、名称和数据键。在 hub 集群模板中使用函数时,您必须使用用于策略的同一命名空间。如需了解更多详细信息,请参阅配置策略中的 hub 集群模板 支持。

注: 当您将此功能与 hub 集群模板搭配使用时,输出会使用 protect 功能自动加密

如果目标集群上不存在 Kubernetes Secret 资源,则会出现策略违反的情况。如果目标集群上不存在 data 键,则该值将变为空字符串。查看在目标集群上强制执行 Secret 资源的以下配置策略。PASSWORD data 键的值是引用目标集群上 secret 的模板:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
      apiVersion: v1
      data:
        USER_NAME: YWRtaW4=
        PASSWORD: '{{ fromSecret "default" "localsecret" "PASSWORD" }}'
      kind: Secret
      metadata:
        name: demosecret
        namespace: test
      type: Opaque
  remediationAction: enforce
  severity: low
2.6.5.2.2. fromConfigMap 功能

fromConfigMap 功能返回 ConfigMap 中给定 data 键的值。查看该功能的以下语法:

func fromConfigMap (ns string, configmapName string, datakey string) (dataValue string, err Error)

使用此功能时,请输入 Kubernetes ConfigMap 资源的命名空间、名称和数据键。您必须使用 hub 集群模板中的功能用于策略的同一命名空间。如需了解更多详细信息,请参阅配置策略中的 hub 集群模板 支持。如果目标集群上不存在 Kubernetes ConfigMap 资源,则会出现策略违反的情况。如果目标集群上不存在 data 键,则该值将变为空字符串。查看在目标受管集群中强制执行 Kubernetes 资源的以下配置策略。log-file data 键的值是一个模板,它从 ConfigMap 获得 log-file 的值,从 default 命名空间获得 log-configlog-level 被设置为 data 键 log-level

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromcm-lookup
  namespace: test-templates
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: demo-app-config
        namespace: test
      data:
        app-name: sampleApp
        app-description: "this is a sample app"
        log-file: '{{ fromConfigMap "default" "logs-config" "log-file" }}'
        log-level: '{{ fromConfigMap "default" "logs-config" "log-level" }}'
  remediationAction: enforce
  severity: low
2.6.5.2.3. fromClusterClaim 功能

fromClusterClaim 功能返回 ClusterClaim 资源中的 Spec.Value 的值。查看该功能的以下语法:

func fromClusterClaim (clusterclaimName string) (dataValue string, err Error)

使用此功能时,输入 Kubernetes ClusterClaim 资源的名称。如果 ClusterClaim 资源不存在,您会收到策略违反情况。查看在目标受管集群上强制执行 Kubernetes 资源的配置策略示例。platform 数据键的值是一个模板,它检索 platform.open-cluster-management.io 集群声明的值。同样,它从 ClusterClaim 获取产品版本的值:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-clusterclaims
  namespace: default
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: sample-app-config
        namespace: default
      data:
        # Configuration values can be set as key-value properties
        platform: '{{ fromClusterClaim "platform.open-cluster-management.io" }}'
        product: '{{ fromClusterClaim "product.open-cluster-management.io" }}'
        version: '{{ fromClusterClaim "version.openshift.io" }}'
  remediationAction: enforce
  severity: low
2.6.5.2.4. lookup 功能

lookup 功能将 Kubernetes 资源作为 JSON 兼容映射返回。如果请求的资源不存在,则返回空映射。如果资源不存在,并且值提供给另一个模板功能,您可能会得到以下错误: invalid value; expected string

注: 使用默认 模板功能,因此为后续模板功能提供了正确的类型。请参阅 开源社区功能 部分。

查看该功能的以下语法:

func lookup (apiversion string, kind string, namespace string, name string) (value string, err Error)

使用功能时,输入 Kubernetes 资源的 API 版本、类型、命名空间和名称。您必须在 hub 集群模板中使用与策略相同的命名空间。如需了解更多详细信息,请参阅配置策略中的 hub 集群模板 支持。查看在目标受管集群上强制执行 Kubernetes 资源的配置策略示例。metrics-url 数据键的值是一个模板,它从 default 命名空间中获取 v1/Service Kubernetes metrics 资源,并设置为查询的资源中的 Spec.ClusterIP 的值:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-lookup
  namespace: test-templates
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: demo-app-config
        namespace: test
      data:
        # Configuration values can be set as key-value properties
        app-name: sampleApp
        app-description: "this is a sample app"
        metrics-url: |
          http://{{ (lookup "v1" "Service" "default" "metrics").spec.clusterIP }}:8080
  remediationAction: enforce
  severity: low
2.6.5.2.5. base64enc 功能

base64enc 功能返回以 base64 编码的输入 data string 值。查看该功能的以下语法:

func base64enc (data string) (enc-data string)

使用这个功能时,输入字符串值。查看以下使用 base64enc 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    data:
      USER_NAME: '{{ fromConfigMap "default" "myconfigmap" "admin-user" | base64enc }}'
2.6.5.2.6. base64dec 功能

base64dec 功能返回一个以 base64 解码的输入的 enc-data string 值。查看该功能的以下语法:

func base64dec (enc-data string) (data string)

使用这个功能时,输入字符串值。查看以下使用 base64enc 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    data:
      app-name: |
         "{{ ( lookup "v1"  "Secret" "testns" "mytestsecret") .data.appname ) | base64dec }}"
2.6.5.2.7. indent 功能

indent 功能会返回经过 padded 的 data string。查看该功能的以下语法:

func indent (spaces  int,  data string) (padded-data string)

使用这个功能时,输入带有特定空格数的数据字符串。查看以下使用 indent 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    data:
      Ca-cert:  |
        {{ ( index ( lookup "v1" "Secret" "default" "mycert-tls"  ).data  "ca.pem"  ) |  base64dec | indent 4  }}
2.6.5.2.8. autoindent 功能

autoindent 函数的作用类似于 indent 函数,它根据模板前面的空格数自动决定前导空格的数量。查看以下使用 autoindent 函数的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    data:
      Ca-cert:  |
        {{ ( index ( lookup "v1" "Secret" "default" "mycert-tls"  ).data  "ca.pem"  ) |  base64dec | autoindent }}
2.6.5.2.9. toInt 功能

toInt 函数处理并返回输入值的整数值。另外,如果这是模板中的最后一个功能,也会进一步处理源内容。这是为了确保该值由 YAML 解释为整数。查看该功能的以下语法:

func toInt (input interface{}) (output int)

使用这个功能时,输入需要转换为整数的数据。查看以下使用 toInt 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    spec:
      vlanid:  |
        {{ (fromConfigMap "site-config" "site1" "vlan")  | toInt }}
2.6.5.2.10. toBool 功能

toBool 函数将输入字符串转换为布尔值,并返回布尔值。另外,如果这是模板中的最后一个功能,也会进一步处理源内容。这是为了确保该值被 YAML 解释为布尔值。查看该功能的以下语法:

func toBool (input string) (output bool)

使用此功能时,请输入需要转换为布尔值的字符串数据。查看以下使用 toBool 函数的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    spec:
      enabled:  |
        {{ (fromConfigMap "site-config" "site1" "enabled")  | toBool }}
2.6.5.2.11. protect 功能

通过 protect 功能,您可以在 hub 集群策略模板中对字符串进行加密。评估策略时,它将在受管集群上自动解密。查看以下使用 protect 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    spec:
      enabled:  |
        {{hub (lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}

在前面的 YAML 示例中,定义了使用 lookup 功能的现有 hub 集群策略模板。在受管集群命名空间中的复制策略上,值可能类似以下语法 :$ocm_encrypted:okrrBqt72oI+3WT/0vxeI3vGa+wpLD7Z0ZxFMLvL204=

使用的每个加密算法是 256 位密钥的 AES-CBC。对于每个受管集群,每个加密密钥都需要是唯一的,每 30 天自动轮转。

这样可确保您的解密的值永不会存储在受管集群的策略中。

要强制立即轮转,在 hub 集群上删除 policy-encryption-key Secret 上的 policy.open-cluster-management.io/last-rotated 注解。然后,会重新处理策略以使用新的加密密钥。

2.6.5.2.12. toLiteral 功能

toLiteral 函数会在处理模板字符串后删除任何引号。您可以使用此功能将 JSON 字符串从 ConfigMap 字段转换为清单中的 JSON 值。运行以下功能从 key 参数值中删除引号:

key: '{{ "[\"10.10.10.10\", \"1.1.1.1\"]" | toLiteral }}'

使用 toLiteral 功能后,会显示以下更新:

key: ["10.10.10.10", "1.1.1.1"]
2.6.5.2.13. 开源社区功能

另外,Red Hat Advanced Cluster Management 还支持 sprig 开源项目中包含的以下模板功能:

  • cat
  • contains
  • default
  • empty
  • fromJson
  • hasPrefix
  • hasSuffix
  • join
  • list
  • lower
  • mustFromJson
  • quote
  • replace
  • semver
  • semverCompare
  • split
  • splitn
  • ternary
  • trim
  • until
  • untilStep
  • upper

如需了解更多详细信息,请参阅 Sprig Function 文档

2.6.5.3. 在配置策略中支持 hub 集群模板

除了动态地自定义目标集群的受管集群模板外,Red Hat Advanced Cluster Management 还支持 hub 集群模板,以使用 hub 集群中的值定义配置策略。这个组合减少了在每个目标集群或策略定义中创建硬编码配置值的需求。

hub 集群模板基于 Golang 文本模板规格,{{hub … hub}} 分隔符表示配置策略中的 hub 集群模板。

为安全起见,hub 集群模板中的特定于资源和通用查询功能都仅限于 hub 集群上策略的命名空间。查看 hub 和受管集群模板的比较以了解更多详情。

重要: 如果您使用 hub 集群模板传播 secret 或其他敏感数据,则敏感数据存在于 hub 集群上的受管集群命名空间和发布该策略的受管集群中。模板内容在策略中扩展,策略不会由 OpenShift Container Platform ETCD 加密支持加密。要解决此问题,请使用 fromSecret,它会自动从 Secret 中加密值,或使用 protect 加密其他值。

2.6.5.3.1. 模板处理

配置策略定义可以包含 hub 集群和受管集群模板。hub 集群模板首先在 hub 集群中处理,然后将带有已解析 hub 集群模板的策略定义传播到目标集群。在受管集群中,ConfigurationPolicyController 处理策略定义中的任何受管集群模板,然后强制执行或验证完全解析的对象定义。

2.6.5.3.2. 重新处理的特殊注解

hub 集群模板会在策略创建过程中或更新引用的资源时解析到引用资源中的数据。

如果您需要手动启动更新,请使用特殊注解 policy.open-cluster-management.io/trigger-update 来指示模板引用的数据的更改。对特殊注解值的任何更改都会自动启动模板处理。另外,引用资源的最新内容会在传播以在受管集群上处理的策略定义中读取和更新。使用此注解的方法是每次递增值。

2.6.5.4. 对象模板处理

使用 YAML 字符串表示设置对象模板。object-template-raw 参数是一个可选参数,它支持高级模板用例,如 if-else 和 range 功能。以下示例定义了将 species-category: mammal 标签添加到 default 命名空间中的任何 ConfigMap 中,其 name 键等于 Sea Otter

object-templates-raw: |
  {{- range (lookup "v1" "ConfigMap" "default" "").items }}
  {{- if eq .data.name "Sea Otter" }}
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: {{ .metadata.name }}
        namespace: {{ .metadata.namespace }}
        labels:
          species-category: mammal
  {{- end }}
  {{- end }}

注: 虽然 spec.object-templatesspec.object-templates-raw 是可选的,但必须设置两个参数字段之一。

2.6.5.4.1. 绕过模板处理

您可能会创建一个策略,其中包含不是由 Red Hat Advanced Cluster Management 处理的模板。默认情况下,Red Hat Advanced Cluster Management 会处理所有模板。

要绕过 hub 集群的模板处理,必须将 {{ template content }} 改为 {{ `{{ template content }}` }}

另外,您还可以在 PolicyConfigurationPolicy 部分添加以下注解:policy.open-cluster-management.io/disable-templates: "true"。当包含此注解时,则不需要以前的临时解决方案。为 ConfigurationPolicy 绕过模板处理。

如需 hub 集群和受管集群模板的比较,请参阅下表:

2.6.5.4.2. hub 集群和受管集群模板的比较
表 2.13. 比较表
模板hub 集群受管集群(managed cluster)

Syntax

golang 文本模板规格

golang 文本模板规格

Delimiter

{{hub … hub}}

{{ … }}

Context

.ManagedClusterName 变量在运行时解析为传播策略的目标集群的名称。

没有上下文变量

Access control

您只能引用与 Policy 资源相同的命名空间中的命名空间 Kubernetes 对象。

您可以引用集群中的任何资源。

Functions

组模板功能,支持对 Kubernetes 资源和字符串操作的动态访问。如需更多信息,请参阅模板功能。有关查询限制,请参阅 Access control 行。

hub 集群上的 fromSecret 模板功能将生成的值作为加密字符串存储在受管集群命名空间中。

等效的调用可能使用以下语法:{{hub "(lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}

组模板功能,支持对 Kubernetes 资源和字符串操作的动态访问。如需更多信息,请参阅模板功能

Function output storage

在与受管集群同步前,模板功能的输出存储在 hub 集群上每个适用的受管集群命名空间中的 Policy 资源对象中。这意味着,对 hub 集群上的 Policy 资源对象具有读取访问权限的模板功能的任何敏感结果,以及受管集群中的 ConfigurationPolicy 资源对象的读取访问权限。另外,如果启用了 etcd 加密,则 PolicyConfigurationPolicy 资源对象不会被加密。使用返回敏感输出的模板功能(如从机密中)时,最好仔细考虑这一点。

模板功能的输出不存储在策略相关的资源对象中。

Processing

在 hub 集群的运行时,处理会在复制策略传播到集群的过程中进行。只有在创建或更新模板时,策略中的策略和 hub 集群模板才会在 hub 集群中处理。

处理发生在受管集群上的 ConfigurationPolicyController 中。策略定期处理,利用所引用资源中的数据自动更新解析的对象定义。

Processing errors

hub 集群模板中的错误显示为策略应用到的受管集群中的违反情况。

受管集群模板中的错误会在发生违反情况的特定目标集群中以违反的形式显示。

2.6.6. 管理安全策略

创建一个安全策略,根据您指定的安全标准、类别和控制,报告并验证您的集群合规性。

查看以下部分:

2.6.6.1. 创建安全策略

您可以使用命令行界面 (CLI) 或者从控制台创建安全策略。

需要的访问权限: 集群管理员

重要 :您必须定义放置规则和放置绑定,才能将策略应用到特定集群。为 Cluster selector 字段输入有效的值,以定义 PlacementRulePlacementBinding。如需有效表达式,请参阅 Kubernetes 文档中的支持基于集合的要求的资源。查看 Red Hat Advanced Cluster Management 策略所需的对象定义:

  • PlacementRule:定义必须部署策略的集群选择器
  • PlacementBinding :将放置绑定到放置规则。

策略概述中查看策略 YAML 文件的更多描述。

2.6.6.1.1. 使用命令行界面创建安全策略

完成以下步骤,使用命令行界面 (CLI) 创建策略:

  1. 运行以下命令来创建策略:

    kubectl create -f policy.yaml -n <policy-namespace>
  2. 定义策略使用的模板。要编辑 .yaml 文件,添加一个 policy-templates 字段来定义模板。您的策略可能类似以下 YAML 文件:

    apiVersion: policy.open-cluster-management.io/v1
    kind: Policy
    metadata:
      name: policy1
    spec:
      remediationAction: "enforce" # or inform
      disabled: false # or true
      namespaceSelector:
        include:
        - "default"
        - "my-namespace"
      policy-templates:
        - objectDefinition:
            apiVersion: policy.open-cluster-management.io/v1
            kind: ConfigurationPolicy
            metadata:
              name: operator
              # namespace: # will be supplied by the controller via the namespaceSelector
            spec:
              remediationAction: "inform"
              object-templates:
              - complianceType: "musthave" # at this level, it means the role must exist and must have the following rules
                apiVersion: rbac.authorization.k8s.io/v1
                kind: Role
                metadata:
                  name: example
                objectDefinition:
                  rules:
                    - complianceType: "musthave" # at this level, it means if the role exists the rule is a musthave
                      apiGroups: ["extensions", "apps"]
                      resources: ["deployments"]
                      verbs: ["get", "list", "watch", "create", "delete","patch"]
  3. 定义 PlacementRule。确保将 PlacementRule 更改为通过调整 clusterSelector 来指定需要应用策略的集群。查看放置规则示例概述

    PlacementRule 可能类似如下内容:

    apiVersion: apps.open-cluster-management.io/v1
    kind: PlacementRule
    metadata:
      name: placement1
    spec:
      clusterConditions:
        - type: ManagedClusterConditionAvailable
          status: "True"
      clusterNames:
      - "cluster1"
      - "cluster2"
    - clusterSelector
        matchLabels:
          cloud: IBM
  4. 定义一个 PlacementBinding,将您的策略绑定到 PlacementRule。您 PlacementBinding 可能类似以下 YAML 示例:

    apiVersion: policy.open-cluster-management.io/v1
    kind: PlacementBinding
    metadata:
      name: binding1
    placementRef:
      name: placement1
      apiGroup: apps.open-cluster-management.io
      kind: PlacementRule
    subjects:
    - name: policy1
      apiGroup: policy.open-cluster-management.io
      kind: Policy
2.6.6.1.1.1. 通过 CLI 查看您的安全策略

完成以下步骤,通过 CLI 查看您的安全策略:

  1. 运行以下命令,查看具体安全策略的详情:

    kubectl get policies.policy.open-cluster-management.io <policy-name> -n <policy-namespace> -o yaml
  2. 运行以下命令,查看您的安全策略的描述:

    kubectl describe policies.policy.open-cluster-management.io <policy-name> -n <policy-namespace>
2.6.6.1.2. 从控制台创建集群安全策略

登录到 Red Hat Advanced Cluster Management 后,进入 Governance 页面并点 Create policy

从控制台创建新策略时,也会在 YAML 编辑器中创建 YAML 文件。要查看 YAML 编辑器,请在 Create policy 表单的开头选择切换来启用它。

完成 Create policy 表单,然后选择 提交按钮。

您的 YAML 文件可能类似以下策略:

apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  name: policy-pod
  annotations:
    policy.open-cluster-management.io/categories: 'SystemAndCommunicationsProtections,SystemAndInformationIntegrity'
    policy.open-cluster-management.io/controls: 'control example'
    policy.open-cluster-management.io/standards: 'NIST,HIPAA'
spec:
  complianceType: musthave
  namespaces:
    exclude: ["kube*"]
    include: ["default"]
    pruneObjectBehavior: None
  object-templates:
  - complianceType: musthave
    objectDefinition:
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
      spec:
        containers:
        - name: pod-name
          image: 'pod-image'
          ports:
          - containerPort: 80
  remediationAction: enforce
  disabled: false

---
apiVersion: apps.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: binding-pod
placementRef:
  name: placement-pod
  kind: PlacementRule
  apiGroup: apps.open-cluster-management.io
subjects:
- name: policy-pod
  kind: Policy
  apiGroup: policy.open-cluster-management.io

---
apiVersion: apps.open-cluster-management.io/v1
 kind: PlacementRule
 metadata:
   name: placement-pod
spec:
  clusterConditions: []
  clusterSelector:
     matchLabels:
       cloud: "IBM"

点击 Create Policy。从控制台创建了安全策略。

2.6.6.1.2.1. 从控制台查看您的安全策略

在控制台中查看任何安全策略及其状态。进入 Governance 页面,以查看您的策略的表列表。注: 您可以选择 Policies 标签页或 Cluster violations 选项卡来过滤策略列表。

选择一个策略来查看更多详情。此时会显示 DetailsClustersTemplates 标签页。当无法决定集群或策略状态时,会显示以下信息: No status

2.6.6.1.3. 通过 CLI 创建策略设置

默认情况下,策略集是在没有策略或放置的情况下创建的。您必须为策略集合创建放置,并至少有一个策略存在于集群中。在创建策略集时,您可以添加多个策略。运行以下命令,通过 CLI 创建策略集:

kubectl apply -f <policyset-filename>
2.6.6.1.4. 从控制台创建策略集

在导航菜单中选择 Governance。然后选择 Policy set 选项卡。选择 Create policy set 按钮并完成表单。添加策略集详情后,选择 提交 按钮。

查看 stable Policyets,这需要部署策略生成器,PolicySets-table

2.6.6.2. 更新安全策略

查看以下部分以了解如何更新安全策略。

2.6.6.2.1. 通过 CLI 将策略添加到策略集中

运行以下命令来编辑您的策略设置:kubectl edit policysets your-policyset-name

将策略名称添加到策略集的 policies 部分的列表中。使用以下命令在策略集的放置部分中应用添加的策略: kubectl apply -f your-added-policy.yaml。已创建一个 PlacementBindingPlacementRule注: 如果您删除放置绑定,策略仍会由策略集放置。

2.6.6.2.2. 从控制台在策略集中添加策略

选择 Policy set 选项卡在策略集中添加一个策略。选择 Actions 图标并选择 Edit。此时会出现 Edit policy set 表单。

进入到表单的 Policies 部分,以选择要添加到策略集的策略。

2.6.6.2.3. 禁用安全策略

您的策略默认是启用的。从控制台禁用您的策略。

登录到 Red Hat Advanced Cluster Management for Kubernetes 控制台后,进入 Governance 页面来查看您的策略的表列表。

选择 Actions 图标 > Disable policy。此时会出现 Disable Policy 对话框。

点击 Disable policy。您的策略已禁用。

2.6.6.3. 删除安全策略

通过 CLI 或控制台删除安全策略。

  • 通过 CLI 删除安全策略:

    1. 运行以下命令来删除安全策略:

      kubectl delete policies.policy.open-cluster-management.io <policy-name> -n <policy-namespace>

      删除策略后,它会从一个或多个目标集群中移除。运行以下命令验证您的策略是否已移除: kubectl get policies.policy.open-cluster-management.io <policy-name> -n <policy-namespace>

  • 从控制台删除安全策略:

    在导航菜单中点 Governance 来查看您的策略的表列表。在策略违反表中点击您要删除的策略的 Actions 图标。

    点击 Remove。在 Remove policy 对话框中点击 Remove policy

2.6.6.3.1. 从控制台创建策略集

Policy set 选项卡中,选择策略集的 Actions 图标。当您单击 Delete 时,会出现 Permanently delete Policyset? 对话框。

点击 Delete 按钮。

要管理其他策略,请参阅管理安全策略以了解更多信息。有关策略的更多主题,请参阅监管

2.6.6.4. 清理由策略创建的资源

在配置策略中使用 pruneObjectBehavior 参数来清理策略创建的资源。当设置 pruneObjectBehavior 时,仅在删除与其关联的配置策略(或父策略)后,才会清理相关的对象。查看可用于参数的值的以下描述:

  • DeleteIfCreated :清理策略创建的所有资源。
  • DeleteAll :清理策略管理的所有资源。
  • None:这是默认值,维护之前版本中的相同行为,但没有删除相关资源。

您可以在 YAML 中直接设置值,因为您通过 CLI 创建策略。在控制台中,您可以选择 Policy templates 步骤的 Prune Object Behavior 部分中的值。

备注:

  • 如果安装 Operator 的策略定义了 pruneObjectBehavior 参数,则需要额外的清理来完成 Operator 卸载。您可能需要在这个清理过程中删除 operator ClusterServiceVersion 对象。
  • 当您在受管集群中禁用 config-policy-addon 资源时,会忽略 pruneObjbectBehavior。要在策略上自动清理相关资源,您必须在禁用附加组件前从受管集群中删除策略。

2.6.7. 管理配置策略

了解如何创建、应用、查看和更新您的配置策略。

需要的访问权限 : 管理员或集群管理员

2.6.7.1. 创建配置策略

您可以使用命令行界面 (CLI) 或者从控制台为配置策略创建 YAML 文件。

如果您有一个现有的 Kubernetes 清单,请考虑使用 Policy Generator 在策略中自动包含清单。请参阅策略生成器文档。查看以下部分以创建配置策略:

2.6.7.1.1. 通过 CLI 创建配置策略

完成以下步骤,通过 CLI 创建配置策略:

  1. 为您的配置策略创建一个 YAML 文件。运行以下命令:

    oc create -f configpolicy-1.yaml

    您的配置策略可能类似以下策略:

    apiVersion: policy.open-cluster-management.io/v1
    kind: Policy
    metadata:
      name: policy-1
      namespace: my-policies
    policy-templates:
    - apiVersion: policy.open-cluster-management.io/v1
      kind: ConfigurationPolicy
      metadata:
        name: mustonlyhave-configuration
      spec:
        namespaceSelector:
          include: ["default"]
          exclude: ["kube-system"]
        remediationAction: inform
        disabled: false
        complianceType: mustonlyhave
        object-templates:
  2. 运行以下命令来应用策略:

    oc apply -f <policy-file-name>  --namespace=<namespace>
  3. 运行以下命令,验证并列出策略:

    oc get policies.policy.open-cluster-management.io --namespace=<namespace>

您的配置策略已创建。

2.6.7.1.2. 通过 CLI 查看您的配置策略

完成以下步骤,通过 CLI 查看您的配置策略:

  1. 运行以下命令,查看具体配置策略的详情:

    oc get policies.policy.open-cluster-management.io <policy-name> -n <namespace> -o yaml
  2. 运行以下命令,查看您的配置策略的描述:

    oc describe policies.policy.open-cluster-management.io <name> -n <namespace>
2.6.7.1.3. 从控制台创建配置策略

从控制台创建配置策略时,也会在 YAML 编辑器中创建 YAML 文件。

  1. 从控制台登录到集群,然后从导航菜单中选择 Governance
  2. 点击 Create policy。通过为规格参数选择一个配置策略来指定您要创建的策略。
  3. 通过完成策略表单继续配置策略创建。为以下字段输入或选择适当的值:

    • Name
    • Specifications
    • Cluster selector
    • Remediation action
    • Standards
    • Categories
    • Controls
  4. Create。您的配置策略已创建。
2.6.7.1.4. 从控制台查看您的配置策略

在控制台中查看任何配置策略及其状态。

在控制台中登录到集群后,选择 Governance 来查看您的策略的表列表。注: 您可以选择 All policies 选项卡或者 Cluster violations 选项卡来过滤您的策略表列表。

选择一个策略来查看更多详情。此时会显示 DetailsClustersTemplates 标签页。

2.6.7.2. 更新配置策略

查看以下部分以了解如何更新配置策略。

2.6.7.2.1. 禁用配置策略

禁用您的配置策略。与前面提到的说明类似,登录并进入 Governance 页面来完成任务。

  1. 从表列表中选择配置策略的 Actions 图标,然后点 Disable。此时会出现 Disable Policy 对话框。
  2. 点击 Disable policy

策略被禁用,但不被删除。

2.6.7.3. 删除配置策略

通过 CLI 或控制台删除配置策略。

  • 使用以下步骤通过 CLI 删除配置策略:

    1. 运行以下命令以从目标集群或集群中删除策略:

      oc delete policies.policy.open-cluster-management.io <policy-name> -n <namespace>
    2. 运行以下命令验证您的策略是否已移除:
    oc get policies.policy.open-cluster-management.io <policy-name> -n <namespace>
  • 使用以下步骤从控制台删除配置策略:

    1. 在导航菜单中点 Governance 来查看您的策略的表列表。
    2. 在策略违反表中点击您要删除的策略的 Actions 图标,然后点 Remove
    3. Remove policy 对话框中点击 Remove policy

您的策略已删除。

如需被 Red Hat Advanced Cluster Management 支持的配置策略示例,查看 CM-Configuration-Management 文件夹。

或者,请参阅 示例配置策略表,以查看控制器监控的其他配置策略。有关管理其他策略的详情,请参阅管理安全策略

2.6.8. 管理 gatekeeper Operator 策略

使用 gatekeeper operator 策略在受管集群上安装 gatekeeper operator 和 gatekeeper。在以下部分中了解如何创建、查看和更新您的 gatekeeper Operator 策略。

需要的访问权限: 集群管理员

2.6.8.1. 使用 gatekeeper operator 策略安装 gatekeeper

使用监管框架来安装 gatekeeper Operator。OpenShift Container Platform 目录中提供了 gatekeeper operator。如需更多信息,请参阅 OpenShift Container Platform 文档中的 Adding Operators to a cluster 部分。

使用配置策略控制器来安装 gatekeeper operator 策略。在安装过程中,Operator 组和订阅会拉取 gatekeeper operator 将其安装到受管集群中。然后,gatekeeper operator 会创建一个 gatekeeper CR 来配置 gatekeeper。查看 Gatekeeper operator CR 示例。

在支持 enforce(强制) 补救操作的情况下,gatekeeper operator 策略由 Red Hat Advanced Cluster Management 配置策略控制器监控。当设置为 enforce 时,控制器会自动创建 Gatekeeper Operator 策略。

2.6.8.2. 从控制台创建 gatekeeper 策略

通过从控制台创建 gatekeeper 策略来安装 gatekeeper 策略。另外,您可以查看一个 YAML 示例来部署 policy-gatekeeper-operator.yaml

登录到集群后,进入 Governance 页面。

选择 Create policy。在完成表单时,从 Specifications 字段中选择 Gatekeeper Operator。策略的参数值会自动填充,策略默认设置为 inform。将补救操作设置为 enforce 来安装 gatekeeper。

注: 默认值由 Operator 生成。如需了解可用于 gatekeeper operator 策略的可选参数的说明,请参阅 Gatekeeper Helm Chart

2.6.8.2.1. Gatekeeper operator CR
apiVersion: operator.gatekeeper.sh/v1alpha1
kind: Gatekeeper
metadata:
  name: gatekeeper
spec:
  audit:
    replicas: 1
    logLevel: DEBUG
    auditInterval: 10s
    constraintViolationLimit: 55
    auditFromCache: Enabled
    auditChunkSize: 66
    emitAuditEvents: Enabled
    resources:
      limits:
        cpu: 500m
        memory: 150Mi
      requests:
        cpu: 500m
        memory: 130Mi
  validatingWebhook: Enabled
  webhook:
    replicas: 2
    logLevel: ERROR
    emitAdmissionEvents: Enabled
    failurePolicy: Fail
    resources:
      limits:
        cpu: 480m
        memory: 140Mi
      requests:
        cpu: 400m
        memory: 120Mi
  nodeSelector:
    region: "EMEA"
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchLabels:
              auditKey: "auditValue"
          topologyKey: topology.kubernetes.io/zone
  tolerations:
    - key: "Example"
      operator: "Exists"
      effect: "NoSchedule"
  podAnnotations:
    some-annotation: "this is a test"
    other-annotation: "another test"

2.6.8.3. 升级 gatekeeper 和 gatekeeper operator

您可以升级 gatekeeper 和 gatekeeper operator 的版本。当使用 gatekeeper operator 策略安装 gatekeeper operator 时,请注意 installPlanApproval 的值。当 installPlanApproval 设置为 Automatic 时,Operator 会自动升级。

installPlanApproval 设置为 Manual 时,您必须为每个集群手动批准 gatekeeper operator 的升级。

2.6.8.4. 更新 gatekeeper operator 策略

查看以下部分以了解如何更新 gatekeeper operator 策略。

2.6.8.4.1. 从控制台查看 gatekeeper operator 策略

在控制台中查看您的 gatekeeper operator 策略及其状态。

从控制台登录到集群后,点 Governance 来查看您的策略的表列表。注: 您可以选择 Policies 标签页或 Cluster violations 选项卡来过滤策略列表。

选择 policy-gatekeeper-operator 策略来查看更多详细信息。选择 Clusters 选项卡来查看策略违反情况。

2.6.8.4.2. 禁用 gatekeeper operator 策略

禁用 gatekeeper operator 策略。

登录到 Red Hat Advanced Cluster Management for Kubernetes 控制台后,进入 Governance 页面来查看您的策略的表列表。

选择 policy-gatekeeper-operator 策略的 Actions 图标,然后点 Disable。此时会出现 Disable Policy 对话框。

点击 Disable policy。您的 policy-gatekeeper-operator 策略已被禁用。

2.6.8.5. 删除 gatekeeper operator 策略

通过 CLI 或控制台删除 gatekeeper operator 策略。

  • 通过 CLI 删除 gatekeeper operator 策略:

    1. 运行以下命令来删除 gatekeeper operator 策略:

      kubectl delete policies.policy.open-cluster-management.io <policy-gatekeeper-operator-name> -n <namespace>

      删除策略后,它会从一个或多个目标集群中移除。

    2. 运行以下命令验证您的策略是否已移除:

      kubectl get policies.policy.open-cluster-management.io <policy-gatekeeper-operator-name> -n <namespace>
  • 从控制台删除 gatekeeper operator 策略:

    进入 Governance 页面,以查看您的策略的表列表。

    与之前的控制台指令类似,点 policy-gatekeeper-operator 策略的 Actions 图标。点 Remove 以删除该策略。在 Remove policy 对话框中点击 Remove policy

您的 gatekeeper operator 策略被删除。

2.6.8.6. 卸载 gatekeeper 策略、gatekeeper 和 gatekeeper operator 策略

完成以下步骤以卸载 gatekeeper 策略、gatekeeper 和 gatekeeper operator 策略:

  1. 删除应用到受管集群的 gatekeeper ConstraintConstraintTemplate

    1. 编辑 gatekeeper operator 策略。找到您用来创建 gatekeeper ConstraintConstraintTemplateConfigurationPolicy 模板 。
    2. ConfigurationPolicy 模板的 complianceType 的值改为 mustnothave
    3. 保存并应用策略。
  2. 从受管集群中删除 gatekeeper 实例:

    1. 编辑 gatekeeper operator 策略。找到用于创建 Gatekeeper 自定义资源(CR)的 ConfigurationPolicy 模板。
    2. ConfigurationPolicy 模板的 complianceType 的值改为 mustnothave
  3. 删除受管集群中的 gatekeeper Operator:

    1. 编辑 gatekeeper operator 策略。找到用于创建 Subscription CR 的 ConfigurationPolicy 模板。
    2. ConfigurationPolicy 模板的 complianceType 的值改为 mustnothave

Gatekeeper 策略、gatekeeper 和 gatekeeper operator 策略会被卸载。

如需有关 gatekeeper 的详细信息,请参阅集成 gatekeeper 约束和约束模板。有关将第三方策略与产品集成的主题列表,请参阅集成第三方策略控制器

2.6.9. 在断开连接的环境中管理 Operator 策略

您可能需要在没有连接到互联网(断开连接)的 Red Hat OpenShift Container Platform 集群上部署 Red Hat Advanced Cluster Management for Kubernetes 策略。如果您使用您部署的策略来部署安装 Operator Lifecycle Manager Operator 的策略,您必须按照以下步骤 镜像 Operator 目录

完成以下步骤以验证对 Operator 镜像的访问:

  1. 请参阅验证所需软件包可用来验证您与策略一起使用的软件包是否可用。您必须验证由以下策略部署到的任何受管集群使用的每个镜像 registry 的可用性:

    • container-security-operator
    • 已弃用: gatekeeper-operator-product
    • compliance-operator
  2. 请参阅配置镜像内容源策略以验证源是否可用。镜像内容源策略必须存在于每个断开连接的受管集群中,并可使用策略进行部署以简化流程。请参阅以下镜像源位置表:

    监管策略类型镜像源位置

    容器安全性

    registry.redhat.io/quay

    Compliance

    registry.redhat.io/compliance

    Gatekeeper

    registry.redhat.io/rhacm2

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.