ASM對Istio原生安全資源的情境進行封裝,提供ASM安全性原則功能,便於一站式配置常見的安全情境。ASM整合了開放策略代理(OPA)外掛程式,通過OPA定義存取控制策略,可以使您的應用實現細粒度的存取控制。本文介紹如何使用ASM安全性原則接入外部OPA執行引擎。
前提條件
已添加Kubernetes託管版叢集到ASM執行個體,且ASM執行個體版本為1.15.3.25及以上。具體操作,請參見添加叢集到ASM執行個體和升級ASM執行個體。
已部署httpbin應用,且可以正常訪問。具體操作,請參見部署httpbin應用。
default命名空間已開啟Sidecar自動注入。具體操作,請參見配置Sidecar注入策略。
功能介紹
ASM目前預設的OPA部署方式為Sidecar模式。當開啟OPA之後,重啟應用Pod,ASM就會在應用Pod中注入一個OPA容器。此後,業務容器所有的請求都會經過OPA Sidecar校正。Sidecar模式是完全的Pod內部訪問,因此可以實現較低的延遲,適用於一些對延遲比較敏感的業務。
但是Sidecar模式存在一些弊端,例如資源佔用、應用接入需要重啟Pod、接入方式不夠靈活等。集中式OPA在這些方面可以和Sidecar模式的OPA形成互補。集中式OPA可以實現更低的資源佔用、應用無需重啟即可接入、自由決定到達應用的哪些請求執行OPA策略等。下文將介紹如何部署一個集中式的OPA授權服務並將其接入應用。
步驟一:部署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
,允許存取請求。說明使用者名稱稱來自請求的
Authorization
Header,形式為Authorization: Basic ${使用者名稱:密碼字串的base64編碼}
。
使用ACK叢集的KubeConfig,執行以下命令,部署OPA。
kubectl apply -f asm-opa.yaml
步驟二:使用ASM安全性原則接入OPA
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 。
在ASM安全性原則頁面,單擊建立,在建立ASM安全性原則對話方塊,單擊自訂授權服務卡片,然後單擊確定。
配置自訂授權相關資訊。
在建立自訂授權服務頁面,配置步驟一部署的OPA授權服務資訊,然後單擊下一步。
在工作負載和匹配規則設定精靈,單擊添加工作負載組,然後在建立工作負載組對話方塊,輸入工作負載組名稱,單擊添加工作負載。
在添加工作負載對話方塊,選中工作負載生效,命名空間選擇default,工作負載類型選擇Service,在選擇負載地區選中httpbin,單擊表徵圖,然後單擊確定。
在建立工作負載組對話方塊的匹配規則列表地區,匹配模式選擇選中請求必須經過鑒權,匹配規則選擇自訂匹配規則,開啟HTTP路徑(Path)開關並配置為
/status/*
,然後單擊確定。在工作負載和匹配規則設定精靈,單擊提交。
建立成功後,介面顯示如下。
步驟三:對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使用者訪問被禁止。