當您需要實現動態存取控制時,可以在ASM網關中接入OPA(Open Policy Agent)執行引擎,根據使用者身份或請求內容定製授權策略,即時控制服務間的通訊行為,有效防止未經授權的訪問並降低資料泄露風險,加強網格應用的安全性。以入口網關訪問httpbin應用為例,本文介紹如何在ASM網關上使用OPA執行引擎對到達網關的請求進行認證和鑒權。
前提條件
已添加Kubernetes託管版叢集到ASM執行個體,且ASM執行個體版本為1.15.3.25及以上。具體操作,請參見添加叢集到ASM執行個體和升級ASM執行個體。
已部署httpbin應用,且可以正常訪問。具體操作,請參見部署httpbin應用。
default命名空間已開啟Sidecar自動注入。具體操作,請參見配置Sidecar注入策略。
步驟一:部署OPA執行引擎
使用以下內容,建立asm-opa.yaml檔案。
YAML檔案部署了一個OPA Service、OPA Deployment和Secret。
Kind
說明
Deployment
鏡像
registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static請替換為您實際的叢集地區。該OPA引擎預設開啟了日誌
--set=decision_logs.console=true,方便進行調試。
Secret
Secret定義了OPA策略,含義如下:
如果請求路徑是
health,允許存取請求。如果請求的方法是
HEAD,允許存取請求。如果使用者名稱稱是
alice,允許存取請求。說明使用者名稱稱來自請求的
AuthorizationHeader,形式為Authorization: Basic ${使用者名稱:密碼字串的base64編碼}。
使用ACK叢集的KubeConfig,執行以下命令,部署OPA。
kubectl apply -f asm-opa.yaml
步驟二:使用ASM網關外部授權功能接入OPA執行引擎
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
在入口網關頁面,在需要接入OPA的網關右側,單擊網關安全。
在網關左側導覽列,選擇。
配置自訂授權服務相關資訊。
在自訂授權服務配置嚮導,配置OPA作為網關的自訂授權服務,然後單擊下一步。

在匹配規則設定精靈,配置請求匹配規則,指定哪些請求需要經過OPA認證和授權,然後單擊提交。

建立成功後,介面顯示如下。

步驟三:對httpbin應用進行訪問測試
執行以下命令,訪問
/路徑。curl ${ASM網關IP}/ -I -X GET預期輸出:
HTTP/1.1 200 OK server: istio-envoy date: Tue, 25 Jul 2023 08:30:58 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2預期輸出表明該路徑不需要鑒權,直接通過。
執行以下命令,未攜帶合法參數,訪問
/status/201路徑。curl ${ASM網關IP}/status/201 -I -X GET預期輸出:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1預期輸出表明未攜帶合法參數,請求被拒絕。
執行以下命令,攜帶合法參數,訪問
/status/201路徑。curl ${ASM網關IP}/status/201 -I -X GET --user alice:testpassword預期輸出:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:31:38 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3預期輸出表明攜帶合法參數,請求通過。
步驟四:更新OPA策略
調用OPA引擎的HTTP介面,更新OPA策略。
執行以下命令,要求只有bob使用者才可以正常訪問HTTP,之前的alice使用者不能訪問。
kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "bob" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }'執行以下命令,使用bob使用者訪問httpbin。
curl ${ASM網關IP}/status/201 -I -X GET --user bob:testpassword預期輸出:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:32:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3預期輸出表明bob使用者訪問成功。
執行以下命令,使用alice使用者訪問httpbin。
curl ${ASM網關IP}/status/201 -I -X GET --user alice:testpassword預期輸出:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1預期輸出表明alice使用者訪問被禁止。