OPA策略
更新時間 2025-01-24 15:09:01
最近更新時間: 2025-01-24 15:09:01
分享文章
本章節介紹OPA策略
概述
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.daliqc.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策略,找到要修改的策略,選擇右側操作欄的刪除即可。