在雲原生領域,安全是繞不開的話題。我們在希望産品快速疊代,業務告訴發展的同時,也希望應用運作在一個相對安全的環境,所謂的應用環境安全,是指應用的通路受限,可控,可審計。
在過去,我們想要實作一個應用的通路受限,需要對業務代碼做大量改造。 接入servicemesh後,我們不需要任何改造,可以實作業務對接。前置條件
- 一個ASM執行個體
- 建立好的ACK Kubernetes叢集,添加到ASM執行個體中
環境搭建
Demo應用使用的是一個10個微服務組成的商城應用,架構如圖所示。
我們建立兩個外部Pod,分别在default namespace和一個新的namespace。 新的namespace不開啟服務網格注入。
# 在default命名空間中建立應用, 開啟ISTIO注入
kubectl apply -f client.yaml -n default
# 建立命名空間 不開啟服務網格注入
kubectl create ns ns-1
# 建立應用
kubectl apply -f client.yaml -n ns-1
在Demo中,我們以
productcatalog
這個服務作為目标服務,給他加上安全加強和通路限制。
開啟安全認證
ASM中支援通過配置設定服務的安全認證,開啟目标服務隻允許TLS加密連接配接,防止中間人攻擊。
apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
name: "mtls"
namespace: "default"
spec:
targets:
- name: productcatalogservice
peers:
- mtls:
mode: STRICT
給Istio中通路 productcatalog 的連接配接做TLS更新
apiVersion: "networking.istio.io/v1alpha3"
kind: "DestinationRule"
metadata:
name: "productcatalogservice"
spec:
host: "productcatalogservice"
trafficPolicy:
tls:
mode: "ISTIO_MUTUAL"
subsets:
- name: v3
labels:
version: v3
此時我們從 ns-1 中的client 容器通路 productcatalogservice , 會出現連接配接失敗
# kubectl -n ns-1 exec -it client-79dd6fbd87-ghl2d sh
/ # curl productcatalogservice.default:3550
curl: (56) Recv failure: Connection reset by peer
開啟通路限制
在ASM中可以通過下發授權規則,顯示某個服務的通路,并且支援靈活的授權政策
給productcatalogservice 配置通路限制, 不允許其他服務通路
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "productcatalogservice"
namespace: default
spec:
selector:
matchLabels:
app: productcatalogservice
rules:
- from:
- source:
此時通路電商平台可以看到通路拒絕,因為電商平台中相關服務沒有通路權限。
增加通路授權
給 productcatalogservice 增加授權, 允許部分服務通路
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "productcatalogservice"
namespace: default
spec:
selector:
matchLabels:
app: productcatalogservice
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/frontend
- cluster.local/ns/default/sa/recommendationservice
- cluster.local/ns/default/sa/checkoutservice
to:
- operation:
methods:
- "*"
此時電商平台恢複正常。
我們通過default namespace中的client 通路, 因為不在授權中國呢,會提示權限不足。 符合預期
kubectl exec -it client-79dd6fbd87-4nj7t sh
/ # curl productcatalogservice.default:3550
RBAC: access denied
總結
通過服務網格,我們無需一行代碼修改,通過配置的方式即可實作應用的通路鍊路加密和通路授權。