OPA Gatekeeper对Kubernetes资源操作限制

OPA介绍

Open Policy Agent(OPA,发音为“oh-pa”)是一个开源的通用策略引擎,它统一了堆栈中的策略执行。OPA 提供了一种高级声明性语言,可让您将策略指定为代码和简单的 API,以从您的软件中卸载策略决策制定。您可以使用 OPA 在微服务、Kubernetes、CI/CD 管道、API 网关等中实施策略。

官网地址: Open Policy Agent | Documentation

GateKeeper安装方式

Installation | Gatekeeper

OPA Gatekeeper 是 Open Policy Agent 的子项目,专门用于将 OPA 实现到 Kubernetes 集群中。 Gatekeeper 是一个验证和变异的 webhook,它强制执行由 Open Policy Agent 执行的基于 CRD 的策略,Open Policy Agent 是 CNCF 作为毕业项目托管的云原生环境的策略引擎。

OPA Gatekeeper对Kubernetes资源操作限制_第1张图片

环境准备

  1. kubernetes 集群
  2. kubectl工具
  3. 安装好gatekeeper
  4. rego语言的基础编程语法
  5. 编写ConstraintTemplate yaml在脚步本编写逻辑

资源对象限制

在Kubernetes集群中限制一些的账号可以操作部分资源对象,以下是控制ingress的update的例子

  • 编写ConstraintTemplate 用来限制部分用户可以操作资源对象
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: resourceoperation
  annotations:
    metadata.gatekeeper.sh/title: "resource operation"
    metadata.gatekeeper.sh/version: 1.0.0
    description: >-
      Allow the users can be operation resource
spec:
  crd:
    spec:
      names:
        kind: ResourceOperation
      validation:
        # Schema for the `parameters` field
        openAPIV3Schema:
          type: object
          properties:
            allows:
              description: allow user to operation resource object
              type: array
              items:
                properties: 
                  operations: 
                    type: array
                    desciption: resource operation array eg (CREATE,UPDATE....)
                    items:
                      type: string
                  users: 
                    type: array
                    desciption: user array eg (admin)
                    items:
                      type: string  
                type: object
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package resourceoperation

        import future.keywords.every
        
        name = input.review.object.metadata.name
        kind = input.review.kind.kind
        operation = input.review.operation
        user_info = input.review.userInfo
        username = user_info.extra.username[0]

        violation[{"msg": msg}] {
          not exists(input.review.parameters.allows,operation,username)
          msg := sprintf("The resource not allowed %s for %v:%v ,user : %s",[operation, kind, name,username])
        }

        exists(allows,operation,username){
          every obj in allows {
            operation in obj.operations
            username in obj.users
          }
        }

        

      

input.review.operation: 获取当前接口操作的类型 (CREATE,UPDATE,DELETE)

input.review.userInfo: 获取当前操作的用户

如果当前的操作类型和用户不在配置的清单中就提示错误信息

将资源对象apply到集群当中

kubectl apply -f .yaml 

  • 编写ResourceOperation 来配置用户和操作,允许admin账号可以修改ingress资源对象
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ResourceOperation
metadata:
  name: ingress-update-allow
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Ingress"]
  parameters:
    allows:
    - operations: ["UPDATE"]
      users: ["admin"]     

kubectl apply -f .yaml 到集群中

测试验证

  1. 使用admin账号编辑ingress资源对象
  2. 使用其它账号编辑ingress资源对象

你可能感兴趣的:(kubernetes,云原生)