概述
OPA(Open Policy Agent)是一个通用的策略引擎,通过声明式的Rego语言实现丰富的授权策略。应用服务网格提供一键集成OPA引擎功能,整体架构如下:
其中OPA控制面包括:
1,OPA webhook服务,用于实现OPA sidecar的注入;
2,OpaPolicy controller监听OPA策略CRD,用于实现OPA策略分发;
业务pod内除了业务容器和istio-proxy之外还会注入OPA sidecar,外部请求pod时流量被istio-proxy拦截,根据定义的授权策略请求OPA sidecar,实现对请求的授权。
注意注意:OPA sidecar当前使用8181端口管理OPA策略,使用9191端口提供外部鉴权服务,业务pod注意避开这两个端口。
开启OPA功能
使用OPA功能时首先要在打开开关,进入服务网格控制台,选择网格管理 -> 自定义配置,勾选启用OPA 即可。
关闭OPA功能
进入服务网格控制台,选择网格管理-> 自定义配置,取消勾选 启用OPA即可。
进入服务网格控制台,选择网格管理-> OPA开关,关闭即可。
OPA策略管理
CSM服务网格采用自定义CRD(OpaPolicy)方式管理OPA策略,主要包括OPA策略生效的工作负载选择以及OPA策略(Rego),下面的配置对default命名空间下标签包含version: v1的工作负载生效,策略中定义了guest和admin两个角色,分别给两个角色定义了访问权限,同时还定义了两个用户bob和alice,分别赋予了特定角色;策略执行时会从请求中解析出用户,结合用户的权限和请求信息对访问进行鉴权。
apiVersion: istio.ctyun.cn/v1beta1
kind: OpaPolicy
metadata:
name: object-policy
namespace: default
spec:
policy: |-
package istio.authz
import input.attributes.request.http as http_request
import input.parsed_path
allow {
roles_for_user[r]
required_roles[r]
}
roles_for_user[r] {
r := user_roles[user_name][_]
}
required_roles[r] {
perm := role_perms[r][_]
perm.method = http_request.method
perm.path = http_request.path
}
user_name = parsed {
[_, encoded] := split(http_request.headers.authorization, " ")
[parsed, _] := split(base64url.decode(encoded), ":")
}
user_roles = {
"alice": ["guest"],
"bob": ["admin"]
}
role_perms = {
"guest": [
{"method": "GET", "path": "/productpage"},
],
"admin": [
{"method": "GET", "path": "/productpage"},
{"method": "GET", "path": "/api/v1/products"},
],
}
workloadSelector:
labels:
version: v1
OpaPolicy配置说明
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
workloadSelector | WorkloadSelector | No | 选择策略生效的工作负载。 |
policy | string | No | Rego策略。 |
创建OPA策略
- 进入服务网格控制台,选择 网格安全中心 -> OPA策略菜单,选择要配置的命名空间。
- 选择使用YAML创建。
修改OPA策略
- 进入服务网格控制台,选择 网格安全中心 -> OPA策略菜单,选择要配置的命名空间。
- 列表页会展示当前命名空间下的OPA策略,找到要修改的策略,选择右侧操作栏的修改,编辑提交即可。
删除OPA策略
- 进入服务网格控制台,选择 网格安全中心 -> OPA策略菜单,选择要配置的命名空间。
- 列表页会展示当前命名空间下的OPA策略,找到要修改的策略,选择右侧操作栏的删除即可。