在雲原生領域,安全是繞不開的話題。我們在希望產品快速迭代,業務告訴發展的同時,也希望應用運行在一個相對安全的環境,所謂的應用環境安全,是指應用的訪問受限,可控,可審計。
在過去,我們想要實現一個應用的訪問受限,需要對業務代碼做大量改造。 接入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
總結
通過服務網格,我們無需一行代碼修改,通過配置的方式即可實現應用的訪問鏈路加密和訪問授權。