開發與維運

ASM安全加固與訪問控制

在雲原生領域,安全是繞不開的話題。我們在希望產品快速迭代,業務告訴發展的同時,也希望應用運行在一個相對安全的環境,所謂的應用環境安全,是指應用的訪問受限,可控,可審計。

image.png

在過去,我們想要實現一個應用的訪問受限,需要對業務代碼做大量改造。 接入servicemesh後,我們不需要任何改造,可以實現業務對接。

前置條件

  1. 一個ASM實例
  2. 創建好的ACK Kubernetes集群,添加到ASM實例中

環境搭建

Demo應用使用的是一個10個微服務組成的商城應用,架構如圖所示。
image.png

image.png

我們創建兩個外部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加密連接,防止中間人攻擊。
image.png

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中可以通過下發授權規則,顯示某個服務的訪問,並且支持靈活的授權策略
image.png

給productcatalogservice 配置訪問限制, 不允許其他服務訪問

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: "productcatalogservice"
 namespace: default
spec:
 selector:
   matchLabels:
     app: productcatalogservice
 rules:
 - from:
   - source:

此時訪問電商平臺可以看到訪問拒絕,因為電商平臺中相關服務沒有訪問權限。

image.png

增加訪問授權

image.png

給 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

總結

通過服務網格,我們無需一行代碼修改,通過配置的方式即可實現應用的訪問鏈路加密和訪問授權。
image.png

Leave a Reply

Your email address will not be published. Required fields are marked *