當您需要精細控制服務間的TCP流量訪問時,可以為TCP流量設定授權策略,管理服務之間的互動許可權,確保只有經過授權的請求才能訪問特定服務,提高服務的安全性和可靠性。
前提條件
已定義Istio資源。具體操作,請參見使用Istio資源實現版本流量路由。
步驟一:部署樣本應用
部署tcp-echo作為被請求的TCP服務,sleep作為發起請求的TCP服務。
部署被請求的TCP服務。
使用以下內容,建立tcp-echo.yaml檔案。
當tcp-echo收到請求後,將在請求內容新增
hello首碼,作為返回結果。例如,向tcp-echo發送world,將返回hello world。使用kubectl串連到叢集,執行以下命令,將tcp-echo服務部署到foo命名空間,作為被請求的TCP服務。
關於如何使用kubectl串連到叢集,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
kubectl apply -f tcp-echo.yaml -n foo
部署發起請求的TCP服務。
使用以下內容,建立sleep.yaml檔案。
執行以下命令,將sleep服務部署到foo命名空間,用於發起TCP請求。
kubectl apply -f sleep.yaml -n foo
步驟二:驗證授權前,請求是否成功
執行以下命令,驗證sleep請求服務能否訪問TCP服務的9000連接埠。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'預期輸出:
hello port 9000 connection succeeded預期輸出表明sleep請求服務訪問TCP服務的9000連接埠成功。
執行以下命令,驗證sleep請求服務能否訪問TCP服務的9001連接埠。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'預期輸出:
hello port 9001 connection succeeded預期輸出表明sleep請求服務訪問TCP服務的9001連接埠成功。
步驟三:配置授權策略
配置可以訪問TCP服務的9000連接埠的授權策略,具體操作步驟如下。
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
任選以下方式建立授權策略。
重要配置TCP授權策略時,不能開啟HTTP方法(Methods)開關。這種配置僅限於HTTP請求使用,不符合TCP的ALLOW規則,為無效配置。服務網格將忽略無效的ALLOW規則,導致請求被拒絕,返回
connection rejected。方式一:使用YAML建立授權策略
在授權策略頁面,單擊使用YAML建立。
在建立頁面,選擇命名空間為foo,選擇任意情境模版,將以下YAML模板粘貼到YAML地區,然後單擊建立。
kind: AuthorizationPolicy apiVersion: security.istio.io/v1beta1 metadata: name: demo namespace: foo spec: action: ALLOW rules: - to: - operation: ports: - '9000'
方式二:通過圖形化介面建立授權策略
在授權策略頁面,單擊建立。
在建立頁面,配置相關資訊,然後單擊建立。
配置項
說明
名稱
本樣本為demo。
策略類型
選擇允許。
命名空間
在工作負載生效頁簽,選擇foo命名空間。
生效範圍
選擇命名空間生效。
請求匹配規則
在添加請求目標地區,開啟連接埠(Ports)開關,設定值為9000。
步驟四:驗證授權後,請求是否成功
執行以下命令,驗證sleep請求服務能否訪問TCP服務的9001連接埠。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'預期輸出:
connection rejected預期輸出表明sleep請求服務訪問TCP服務的9001連接埠失敗。
執行以下命令,驗證sleep請求服務能否訪問TCP服務的9000連接埠。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'預期輸出:
hello port 9000 connection succeeded預期輸出表明sleep請求服務訪問TCP服務的9000連接埠成功。
相關文檔
對授權策略配置失誤可能會引起非預期的訪問被拒絕或允許存取,您可以使用ASM授權策略試運行模式,通過日誌判斷對應策略的執行結果是否符合預期,確認無誤後關閉試運行模式,使授權策略真正生效。具體操作,請參見使用ASM授權策略試運行模式。
如果您需要精細控制服務間的HTTP流量訪問,請參見為HTTP流量設定授權策略。
如果您需要對網格外服務進行授權控制,請參見對網格內服務訪問外部網站進行授權控制和對網格內服務訪問外部資料庫進行授權控制。
您可以自訂ASM網關訪問日誌的內容,及時發現潛在的安全問題。具體操作,請參見產生和採集ASM網關訪問日誌。
您可以啟用網格審計功能,記錄或追溯不同使用者的日常操作,也可以為網格資源操作配置審計警示,在重要資源變動時及時發出警示通知到警示連絡人。具體操作,請參見使用KubeAPIAction Trail和為網格資源操作配置審計警示。