OPA策略 本章节介绍OPA策略 概述 OPA(Open Policy Agent)是一个通用的策略引擎,通过声明式的Rego语言实现丰富的授权策略。应用服务网格提供一键集成OPA引擎功能,整体架构如下: 其中OPA控制面包括: 1,OPA webhook服务,用于实现OPA sidecar的注入; 2,OpaPolicy controller监听OPA策略CRD,用于实现OPA策略分发; 业务pod内除了业务容器和istioproxy之外还会注入OPA sidecar,外部请求pod时流量被istioproxy拦截,根据定义的授权策略请求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: objectpolicy namespace: default spec: policy: package istio.authz import input.attributes.request.http as httprequest import input.parsedpath allow { rolesforuser[r] requiredroles[r] } rolesforuser[r] { r : userroles[username][] } requiredroles[r] { perm : roleperms[r][] perm.method httprequest.method perm.path httprequest.path } username parsed { [, encoded] : split(httprequest.headers.authorization, " ") [parsed, ] : split(base64url.decode(encoded), ":") } userroles { "alice": ["guest"], "bob": ["admin"] } roleperms { "guest": [ {"method": "GET", "path": "/productpage"}, ], "admin": [ {"method": "GET", "path": "/productpage"}, {"method": "GET", "path": "/api/v1/products"}, ], } workloadSelector: labels: version: v1