本系列文章講講述阿裡雲服務網格ASM的一些擴充能力:
- 阿裡雲服務網格ASM之擴充能力(1):在ASM中通過EnvoyFilter添加HTTP請求頭
- 阿裡雲服務網格ASM之擴充能力(2):在ASM中支援自定義外部授權
- 阿裡雲服務網格ASM之擴充能力(3):在ASM中使用開放政策代理OPA
- 阿裡雲服務網格ASM之擴充能力(4):在ASM中實作分布式跟蹤
歡迎掃碼入群進一步交流:

前面的系列文檔中介紹了如何建立服務網格ASM執行個體,并介紹了如何将一個應用示例部署到 ASM 執行個體中,本文在此基礎上介紹如何在ASM中使用開放政策代理OPA定義細粒度通路控制。
前提條件
- 已建立至少一個 ASM 執行個體,并已添加至少一個 ACK 叢集到該執行個體中。
- 已認證 Kubernetes 指令行用戶端 kubectl 連接配接到 ASM 執行個體中新添加的 ACK 叢集,詳情參見 通過 kubectl 連接配接 Kubernetes 叢集 。
- 已認證 Kubernetes 指令行用戶端 kubectl 連接配接到 ASM 執行個體,詳情參見 通過 kubectl 連接配接 ASM 執行個體
開放政策代理OPA
作為由
CNCF托管的一個孵化項目,
開放政策代理(OPA)是一個政策引擎,可用于為您的應用程式實作細粒度的通路控制。例如,可以使用OPA 跨微服務實作授權等。如圖所示,OPA作為通用政策引擎,可以與微服務一起部署為獨立服務。為了保護應用程式,必須先授權對微服務的每個請求,然後才能對其進行處理。為了檢查授權,微服務對OPA進行API調用,以确定請求是否被授權。
在ASM中啟用OPA
服務網格ASM內建了開放政策代理OPA,可用于為您的應用程式實作細粒度的通路控制。例如,可以使用OPA 跨微服務實作授權等。啟用後,如同Istio Envoy代理容器一樣,OPA代理容器也會随之被注入到業務Pod中。然後,在ASM中就可以使用OPA定義通路控制政策,為分布式應用的開發者提供了開箱可用的能力,可以幫助開發者快速定義使用政策,提升開發效率。
其中,如圖所示在建立服務網格執行個體時,可以通過設定是否啟用OPA插件。
功能設定
如果在建立服務網格ASM執行個體時沒有勾選啟用OPA插件,可以通過如下方式重新開機開啟。
- 登入服務網格控制台,在ASM執行個體詳情頁的右上角,點選功能設定按鈕。
- 在彈出的視窗中,可以重新勾選啟用OPA插件。
注意:部署業務Pod之前,必須確定已經部署了OPA配置檔案和政策的配置項Configmap,具體如下。
部署OPA配置
部署OPA配置檔案。通過 kubectl 連接配接到 ASM 執行個體中新添加的 ACK 叢集,執行如下指令:
kubectl apply -n {替換成實際的namespace} -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: opa-istio-config
data:
config.yaml: |
plugins:
envoy_ext_authz_grpc:
addr: :9191
path: istio/authz/allow
EOF
部署OPA政策
目前在ASM中已經支援使用Rego定義的OPA政策,後續會支援基于WebAssembly的OPA擴充能力。
通過 kubectl 連接配接到 ASM 執行個體中新添加的 ACK 叢集,替換成實際的政策定義,執行如下指令:
kubectl apply -n {替換成實際的namespace} -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: opa-policy
data:
policy.rego: | ###以下為示例政策定義,需要替換成實際的政策定義
package istio.authz
import input.attributes.request.http as http_request
default allow = false
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 = {
"guest1": ["guest"],
"admin1": ["admin"]
}
role_perms = {
"guest": [
{"method": "GET", "path": "/productpage"},
],
"admin": [
{"method": "GET", "path": "/productpage"},
{"method": "GET", "path": "/api/v1/products"},
],
}
EOF
注入OPA代理容器
按照
部署應用到 ASM 執行個體重新部署示例應用到 ASM 執行個體,并定義相應的Istio虛拟服務和入口網關,詳情參見
管理 Istio 資源定義- 登入容器服務管理控制台,單擊左側導航欄中的應用->容器組;
- 在右側打開的頁面中,選擇對應的叢集及命名空間(如default),此時Bookinfo應用Pod應為運作中,并且每一個Pod内都被注入了Sidecar代理(istio-proxy)和OPA代理(opa-istio),類似如下圖所示:
執行結果
上述政策限制對BookInfo的通路,定義如下:
- guest1被授予guest角色,并且可以通路
但不能通路/productpage
/v1/api/products
- admin1被授予admin角色,并且可以通路
和/productpage
/v1/api/products
curl -i --user guest1:password http://{入口網關服務的IP位址}/productpage
HTTP/1.1 200 OK
......
curl -i --user guest1:password http://{入口網關服務的IP位址}/api/v1/products
HTTP/1.1 403 Forbidden
......
curl -i --user admin1:password http://{入口網關服務的IP位址}/productpage
HTTP/1.1 200 OK
......
curl -i --user admin1:password http://{入口網關服務的IP位址}/api/v1/products
HTTP/1.1 200 OK
......