加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 云计算 > 正文

使用 Gatekeeper开展 OPA 策略管理

发布时间:2022-04-25 09:36:11 所属栏目:云计算 来源:互联网
导读:前面我们介绍了使用 kube-mgmt 这个 sidecar 容器来完成 OPA 策略的自动同步,此外还有另外一个更加高级的工具 Gatekeeper,相比于之前的模式,Gatekeeper(v3.0) 准入控制器集成了 OPA Constraint Framework,以执行基于 CRD 的策略,并允许声明式配置的策略
       前面我们介绍了使用 kube-mgmt 这个 sidecar 容器来完成 OPA 策略的自动同步,此外还有另外一个更加高级的工具 Gatekeeper,相比于之前的模式,Gatekeeper(v3.0) 准入控制器集成了 OPA Constraint Framework,以执行基于 CRD 的策略,并允许声明式配置的策略可靠地共享,使用 kubebuilder 构建,它提供了验证和修改准入控制和审计功能。这允许为 Rego 策略创建策略模板,将策略创建为 CRD,并在策略 CRD 上存储审计结果,这个项目是谷歌、微软、红帽和 Styra 一起合作实现的。
 
  现在我们就可以使用上面的 K8sRequiredLabels 这个约束模板来定义策略了,比如我们要求在所有命名空间上都定义一个 gatekeeper 的标签,则可以创建如下所示的对象:

  注意 match 字段,它定义了将应用给定约束的对象的范围,其中 kinds: ["Namespace"] 表示这个约束会在创建命名空间的时候被应用,此外它还支持其他匹配器:
 
  kind 接受带有 apiGroups 和 kind 字段的对象列表,这些字段列出了约束将应用到的对象的组/种类。如果指定了多个组/种类对象,则资源在范围内只需要一个匹配项。
  scope 接受 、Cluster 或 Namespaced 决定是否选择集群范围和/或命名空间范围的资源。(默认为)
  namespaces 是命名空间名称的列表。如果已定义,则约束仅适用于列出的命名空间中的资源。命名空间还支持基于前缀的 glob。例如,namespaces: [kube-*] 匹配 kube-system 和 kube-public。
  excludeNamespaces 是命名空间名称的列表。如果已定义,则约束仅适用于不在列出的命名空间中的资源。ExcludedNamespaces 还支持基于前缀的 glob,例如,excludedNamespaces: [kube-*] 匹配 kube-system 和 kube-public。
  labelSelector 是标准的 Kubernetes 标签选择器。
  namespaceSelector 是针对对象的包含名称空间或对象本身的标签选择器,如果对象是名称空间。name 是对象的名称。如果已定义,则匹配具有指定名称的对象。Name 还支持基于前缀的 glob。例如,名称:pod-* 匹配 pod-a 和 pod-b。
  下面的 parameters.labels 就是根据上面的 CRD 规范定义的属性,该值是传递给 opa 的参数,此处表示一个 key 为 labels,value 为一个列表的字典,与 ConstraintTemplate 里的 properties 要匹配上,此处表示要创建的对象需要含有 gatekeeper 的 label。
 
  直接应用上面的这个资源对象即可:
 
  复制
  ➜ kubectl apply -f all_ns_must_have_gatekeeper.yaml
  k8srequiredlabels.constraints.gatekeeper.sh/ns-must-have-gk created
  1.
  2.
  创建完成后可以查看到这个 constraints 对象:
 
  复制
  ➜ kubectl get k8srequiredlabels
  NAME              AGE
  ns-must-have-gk   73s
  ➜ kubectl get constraints  # 和上面对象一样
  NAME              AGE
  ns-must-have-gk   81s
  1.
  2.
  3.
  4.
  5.
  6.
  由于 Gatekeeper 具有审计功能,可以根据集群中执行的约束条件对资源进行定期评估,以检测预先存在的错误配置,Gatekeeper 将审计结果存储为相关约束条件的 status 字段中列出违规行为。我们可以查看 K8sRequiredLabels 对象的 status 字段来查看不符合约束的行为:

  此时不给命名空间添加 key 为 gatekeeper 的 label,创建的时候就会报错:
 
  复制
  Error from server ([ns-must-have-gk] you must provide labels: {"gatekeeper"}): error when creating "test-namespace.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [ns-must-have-gk] you must provide labels: {"gatekeeper"}
  1.
  然后把 gatekeeper: abc 这行的注释打开,则能成功创建了,这就是 Gatekeeper 的基本用法。
 
  从上面我们可以知道定义约束模板的策略会经常从 input 对象中获取数据,但是如果需要创建自己的约束,但是不知道传入的参数即 input 是什么,有一种简单方法是使用拒绝所有请求并将请求对象作为其拒绝消息输出的约束/模板。我们可以在创建模板时在 violation 中只保留一行 msg := sprintf("input: %v", [input]),此时创建对象时必定会失败,然后获取到输出的错误信息,里面即包含所有 input 信息,之后再通过 Rego 语法去获取需要的数据即可。
 
  由于约束模板或者说策略库具有一定的通用性,所以 OPA Gatekeeper 社区提供了一个通用的策略库:https://github.com/open-policy-agent/gatekeeper-library,该仓库中包含了大量通用的约束模板。
 
  每个模板库下面都包含一个 template.yaml 文件用来描述约束模板,samples 目录下面就包含具体的约束对象和示例资源清单,这些策略也是我们去学习 Rego 语言的很好的案例。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读