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 作为毕业项目托管的云原生环境的策略引擎。
环境准备
- kubernetes 集群
- kubectl工具
- 安装好gatekeeper
- rego语言的基础编程语法
- 编写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 <resourceoperation>.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 <ingress-update-allow>.yaml 到集群中
测试验证
- 使用admin账号编辑ingress资源对象
- 使用其它账号编辑ingress资源对象