OPA 关守:捕鱼大亨网络版的政策和治理

作者: Rita Zhang(微软),Max Smythe(谷歌),Craig Hooper(澳大利亚联邦银行),Tim Hinrichs(斯泰拉),Lachie Evenson(微软),Torin Sandall(斯泰拉)

开放政策代理关守 可以利用该项目在捕鱼大亨网络版环境中帮助执行策略并加强治理。在本文中,我们将逐步介绍该项目的目标,历史和当前状态。

以下来自Kubecon EU 2019会议的录音是与Gatekeeper合作的一个很好的起点:

动机

如果您的组织一直在使用捕鱼大亨网络版,则您可能一直在寻找控制最终用户可以在集群上执行的方法以及确保集群符合公司策略的方法。这些政策可能在那里满足管理和法律要求,或执行最佳实践和组织惯例。使用捕鱼大亨网络版,如何在不牺牲开发敏捷性和运营独立性的前提下确保合规性?

例如,您可以执行以下策略:

  • 所有图像必须来自批准的存储库
  • 所有入口主机名必须是全局唯一的
  • 所有广告连播必须具有资源限制
  • 所有名称空间都必须具有列出联系点的标签

捕鱼大亨网络版允许通过以下方式与API服务器分离策略决策 准入控制器Webhooks 在捕鱼大亨网络版中将准入请求持久化为对象之前拦截它们。 关守 创建该数据库的目的是使用户可以通过配置(而不是代码)来自定义访问控制,而不是通过代码来了解群集状态,而不仅仅是在访问时评估单个对象。 关守是捕鱼大亨网络版的可自定义的准入网络挂钩,用于实施由捕鱼大亨网络版执行的策略 开放政策代理(OPA),由CNCF托管的Cloud Native环境的策略引擎。

演化

在深入了解Gatekeeper的当前状态之前,让我们看一下Gatekeeper项目是如何发展的。

  • 关守 v1.0-通过kube-mgmt sidecar实施基于configmap的策略,将OPA用作准入控制器。它提供了验证和变异准入控制。由Styra捐赠。
  • 关守 v2.0-使用捕鱼大亨网络版策略控制器作为准入控制器,OPA和kube-mgmt sidecar实施基于configmap的策略。它提供了验证和变更准入控制和审计功能。由微软捐赠。
  • 关守 v3.0-准入控制器与 OPA约束框架 实施基于CRD的策略,并允许可靠地共享以声明方式配置的策略。它使用kubebuilder构建,提供了验证以及最终的变异(将要实现)准入控制和审计功能。这样就可以创建用于 雷哥 策略,作为CRD创建策略以及在策略CRD上存储审核结果。该项目是Google,Microsoft,Red Hat和Styra之间的合作。

关守 v3.0功能

现在,让我们仔细了解Gatekeeper的当前状态以及如何利用所有最新功能。考虑一个想要确保集群中所有对象都具有部门信息作为对象标签一部分的组织。如何使用Gatekeeper?

验证入学控制

一旦所有Gatekeeper组件都已完成 已安装 在您的集群中,每当创建,更新或删除集群中的资源时,API服务器都会触发Gatekeeper许可webhook来处理许可请求。

在验证过程中,网守充当API服务器和OPA之间的桥梁。 API服务器将强制执行OPA执行的所有策略。

政策与约束

通过集成OPA约束框架,约束是其作者希望系统满足一组给定要求的声明。每个约束都使用Rego编写,Rego是一种声明性查询语言,OPA使用它来枚举违反系统预期状态的数据实例。将所有约束评估为逻辑与。如果不满足一个约束条件,则整个请求将被拒绝。

在定义约束之前,您需要创建一个约束模板,该模板允许人们声明新的约束。每个模板都描述了执行约束的Rego逻辑和约束的架构,其中包括CRD的架构和可以传递到约束中的参数,这与函数的参数非常相似。

例如,这是一个约束模板CRD,它要求某些标签出现在任意对象上。

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8srequiredlabels
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredLabels
        listKind: K8sRequiredLabelsList
        plural: k8srequiredlabels
        singular: k8srequiredlabels
      validation:
        # Schema for the `parameters` field
        openAPIV3Schema:
          properties:
            labels:
              type: array
              items: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredlabels

        deny[{"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])
        }        

Once a Constraint template has been deployed in the cluster, an admin can now create individual Constraint CRDs as defined by the Constraint template. For example, here is a Constraint CRD that requires the label hr to be present on all namespaces.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-hr
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels: ["hr"]

Similarly, another Constraint CRD that requires the label finance to be present on all namespaces can easily be created from the same Constraint template.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-finance
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels: ["finance"]

如您所见,通过Constraint框架,我们可以通过Constraint模板可靠地共享Regos,使用match字段定义实施范围,并向Constraints提供用户定义的参数以为每个Constraint创建自定义行为。

审计

的 audit functionality enables periodic evaluations of replicated resources against the Constraints enforced in the cluster to detect pre-existing misconfigurations. 关守 stores audit results as violations listed in the status field of the relevant Constraint.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-hr
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels: ["hr"]
status:
  auditTimestamp: "2019-08-06T01:46:13Z"
  byPod:
  - enforced: true
    id: gatekeeper-controller-manager-0
  violations:
  - enforcementAction: deny
    kind: Namespace
    message: 'you must provide labels: {"hr"}'
    name: default
  - enforcementAction: deny
    kind: Namespace
    message: 'you must provide labels: {"hr"}'
    name: gatekeeper-system
  - enforcementAction: deny
    kind: Namespace
    message: 'you must provide labels: {"hr"}'
    name: kube-public
  - enforcementAction: deny
    kind: Namespace
    message: 'you must provide labels: {"hr"}'
    name: kube-system

资料复制

审核要求将捕鱼大亨网络版资源复制到OPA中,然后才能根据强制约束对其进行评估。约束还需要数据复制,这些约束需要访问群集中除评估对象之外的对象。例如,强制入口主机名唯一性的约束必须有权访问集群中的所有其他入口。

要配置要复制的捕鱼大亨网络版数据,请使用要复制到OPA的资源创建一个同步配置资源。例如,以下配置将所有名称空间和pod资源复制到OPA。

apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
  name: config
  namespace: "gatekeeper-system"
spec:
  sync:
    syncOnly:
      - group: ""
        version: "v1"
        kind: "Namespace"
      - group: ""
        version: "v1"
        kind: "Pod"

计划未来

关守项目背后的社区将专注于提供突变许可控制以支持突变方案(例如:在创建新资源时使用部门信息自动注释对象),支持外部数据以将集群外部的上下文注入到许可决策中,支持试运行,以便在执行策略之前查看策略对集群中现有资源的影响以及更多的审计功能。

如果您有兴趣了解有关该项目的更多信息,请查看 关守 回购。如果您有兴趣帮助定义Gatekeeper的方向,请加入 #kubernetes-policy 频道上的OPA Slack,并加入我们 每周会议 讨论开发,问题,用例等