日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用ASM出口網(wǎng)關(guān)訪問外部mTLS服務

服務網(wǎng)格 ASM(Service Mesh)出口網(wǎng)關(guān)作為網(wǎng)格內(nèi)流量的統(tǒng)一出口,可以執(zhí)行TLS/mTLS請求的發(fā)起,進而實現(xiàn)全鏈路的加密通信。同時,出口網(wǎng)關(guān)也可以執(zhí)行豐富的安全策略,實現(xiàn)更加精細的訪問控制。在服務網(wǎng)格中,出口網(wǎng)關(guān)是實現(xiàn)出口流量管理的最佳方案。本文將介紹如何使用ASM出口網(wǎng)關(guān)管理出口流量并發(fā)起mTLS通信。

重要

請確保您已經(jīng)完成在ASM入口網(wǎng)關(guān)上配置mTLS服務并限制特定客戶端訪問中的所有步驟,本文將使用此文檔中在ASM和ACK環(huán)境部署的應用作為外部mTLS服務端。因此在執(zhí)行本文中的步驟時,您需要額外創(chuàng)建一套ASM和ACK環(huán)境作為主環(huán)境。為了方便區(qū)別,本文中提到的${ASM網(wǎng)關(guān)ip}均代表在ASM入口網(wǎng)關(guān)上配置mTLS服務并限制特定客戶端訪問中使用的入口網(wǎng)關(guān)IP,“ACK集群”和“ASM實例”均為主環(huán)境資源。

前提條件

已開啟sidecar自動注入。具體操作,請參見配置Sidecar注入策略

步驟一:部署測試應用sleep

部署sleep應用,具體操作,請參見部署sleep應用

使用ACK集群的kubeconfig,執(zhí)行以下命令測試訪問部署在另一套環(huán)境中的httpbin服務。

kubectl exec deploy/sleep -- curl --header "host:test.com" ${ASM網(wǎng)關(guān)ip}/status/418

預期輸出:

    -=[ teapot ]=-

       _...._
     .'  _ _ `.
    | ."` ^ `". _,
    \_;`"---"`|//
      |       ;/
      \_     _/
        `"""`

步驟二:開啟REGISTRY_ONLY并創(chuàng)建ServiceEntry

Sidecar支持配置外部訪問策略為REGISTRY_ONLY,開啟之后pod只能訪問通過ServiceEntry注冊的服務。您可以根據(jù)需要選擇是否開啟此項功能。具體開啟步驟,請參見步驟二:開啟REGISTRY_ONLY。開啟之后,訪問未經(jīng)注冊的服務將會返回502 Bad Gateway

使用以下內(nèi)容,為test.com配置ServiceEntry。具體操作,請參見創(chuàng)建集群外服務

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: test-com
  namespace: default
spec:
  endpoints:
    - address: ${ASM網(wǎng)關(guān)IP}  
  hosts:
    - test.com
  location: MESH_EXTERNAL
  ports:
    - name: http
      number: 80
      protocol: HTTP
    - name: https
      number: 443
      protocol: HTTPS
  resolution: STATIC

完成配置后,即可正常從sleep Pod中訪問httpbin服務。

步驟三:創(chuàng)建ASM出口網(wǎng)關(guān),并讓HTTP協(xié)議請求經(jīng)過出口網(wǎng)關(guān)

  1. 創(chuàng)建出口網(wǎng)關(guān),配置HTTP協(xié)議和80端口,并打開雙向TLS認證開關(guān)。此開關(guān)打開之后,網(wǎng)格中其他工作負載向網(wǎng)關(guān)發(fā)送流量時會自動使用mTLS,該mTLS的證書由網(wǎng)格統(tǒng)一管理。具體操作,請參見創(chuàng)建出口網(wǎng)關(guān)

  2. 使用以下內(nèi)容,創(chuàng)建網(wǎng)關(guān)規(guī)則。具體操作,請參見創(chuàng)建網(wǎng)關(guān)規(guī)則

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: egress-gateway
      namespace: default
    spec:
      selector:
        istio: egressgateway
      servers:
      - hosts:
        - '*'
        port:
          name: http
          number: 80
          protocol: HTTPS
        tls:
          mode: ISTIO_MUTUAL

    網(wǎng)關(guān)規(guī)則中聲明了出口網(wǎng)關(guān)在80端口上開啟mTLS監(jiān)聽,并且使用網(wǎng)格統(tǒng)一提供的證書。

  3. 使用以下內(nèi)容,創(chuàng)建虛擬服務。

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: egressgateway-vs
    spec:
      hosts:
      - test.com
      gateways:
      - egress-gateway  # 上一步創(chuàng)建的網(wǎng)關(guān)規(guī)則名稱。
      - mesh
      http:
      - match:
        - gateways:
          - mesh
          port: 80
        route:
        - destination:
            host: istio-egressgateway.istio-system.svc.cluster.local
            port:
              number: 80
          weight: 100
      - match:
        - gateways:
          - egress-gateway
          port: 80
        route:
        - destination:
            host: test.com
            port:
              number: 80
          weight: 100

    創(chuàng)建虛擬服務后,Sidecar中的test.com的流量將會發(fā)送給出口網(wǎng)關(guān),出口網(wǎng)關(guān)收到的test.com流量將發(fā)送給真正的test.com ServiceEntry。

  4. 執(zhí)行以下命令,在sleep應用的Pod中訪問test.com

    kubectl exec deploy/sleep -- curl --header "host:test.com" ${ASM網(wǎng)關(guān)ip}/status/418

    預期輸出:

        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`
  5. 使用ASM實例的kubeconfig,執(zhí)行以下命令。

    kubectl -n istio-system logs ${出口網(wǎng)關(guān)pod名稱}| tail -1

    預期輸出:

    {"authority_for":"test.com","bytes_received":"0","bytes_sent":"135","downstream_local_address":"192.168.36.32:80","downstream_remote_address":"192.168.36.29:58146","duration":"8","istio_policy_status":"-","method":"GET","path":"/status/418","protocol":"HTTP/1.1","request_id":"9f7b5475-6e45-4700-a85a-e00835b6b6c0","requested_server_name":"outbound_.80_._.istio-egressgateway.istio-system.svc.cluster.local","response_code":"418","response_flags":"-","route_name":"-","start_time":"2024-07-29T03:05:58.421Z","trace_id":"-","upstream_cluster":"outbound|80||test.com","upstream_host":"${ASM網(wǎng)關(guān)IP}:80","upstream_local_address":"192.168.36.32:52838","upstream_response_time":"7","upstream_service_time":"7","upstream_transport_failure_reason":"-","user_agent":"curl/8.1.2","x_forwarded_for":"192.168.36.29"}

    可以看到,上述日志可以確認該服務經(jīng)過了ASM出口網(wǎng)關(guān)。

當前的請求鏈路是:sleep pod --> istio-egressgateway --> istio-ingressgateway --> httpbin。其中:

  • sleep pod --> istio-egressgateway這段是mTLS流量。

  • istio-egressgateway --> istio-ingressgateway這段是明文流量。

  • istio-ingressgateway --> httpbin這段是mTLS流量。

顯然,兩個網(wǎng)關(guān)之間交互通過明文是不安全的。由于服務端網(wǎng)關(guān)已經(jīng)支持了mTLS,因此只需要客戶端出口網(wǎng)關(guān)支持發(fā)起mTLS請求即可。

步驟四:在出口網(wǎng)關(guān)中將HTTP請求升級為mTLS流量

  1. 使用以下內(nèi)容,更新虛擬服務。

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: egressgateway-vs
    spec:
      hosts:
      - test.com
      gateways:
      - egress-gateway
      - mesh
      http:
      - match:
        - gateways:
          - mesh
          port: 80
        route:
        - destination:
            host: istio-egressgateway.istio-system.svc.cluster.local
            port:
              number: 80
          weight: 100
      - match:
        - gateways:
          - egress-gateway
          port: 80
        route:
        - destination:
            host: test.com
            port:
              number: 443  # 只修改了這一行
          weight: 100

    這里的更新只是將發(fā)送給test.comServiceEntry80端口的流量改為了443端口。

  2. 導入mTLS證書,即在ASM入口網(wǎng)關(guān)上配置mTLS服務并限制特定客戶端訪問中使用的證書。請確保此處導入的證書名稱為test.client。具體操作,請參見使用ASM證書管理。您也可以使用kubectl直接創(chuàng)建secret完成證書導入。使用ACK集群的kubeconfig,執(zhí)行以下命令。

    kubectl create -n istio-system secret generic test.client \
      --from-file=tls.key=client.key.pem \
      --from-file=tls.crt=clientcert.pem \
      --from-file=ca.crt=cacert.pem
  3. 使用以下內(nèi)容,創(chuàng)建目標規(guī)則。

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: originate-mtls-for-test-com
    spec:
      host: test.com
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
        portLevelSettings:
        - port:
            number: 443
          tls:
            mode: MUTUAL
            credentialName: test.client
            sni: test.com
  4. 執(zhí)行以下命令,再次測試訪問。

    kubectl exec deployment/sleep -it -- curl --header "host:test.com" ${ASM網(wǎng)關(guān)IP}/status/418

    預期輸出:

    RBAC: access denied%

    可以看到請求被拒絕。這是由于這里復用了在ASM入口網(wǎng)關(guān)上配置mTLS服務并限制特定客戶端訪問中的客戶端證書,其中配置了禁止test.client訪問status/418路徑。

  5. 執(zhí)行以下命令,訪問status/200路徑。

    kubectl exec deploy/sleep -it -- curl --header "host:test.com" ${ASM網(wǎng)關(guān)IP}/status/200 -I

    預期輸出:

    HTTP/1.1 200 OK
    server: envoy
    date: Mon, 29 Jul 2024 03:33:50 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: 5

    可以看到訪問正常。

  6. 執(zhí)行以下命令,查看出口網(wǎng)關(guān)訪問日志。

    kubectl -n istio-system logs ${出口網(wǎng)關(guān)pod名稱}| tail -1

    預期輸出:

    {"authority_for":"test.com","bytes_received":"0","bytes_sent":"19","downstream_local_address":"192.168.36.32:80","downstream_remote_address":"192.168.36.29:58146","duration":"3","istio_policy_status":"-","method":"GET","path":"/status/418","protocol":"HTTP/1.1","request_id":"82394ec4-cf13-45cb-ae4c-cb1873fbccda","requested_server_name":"outbound_.80_._.istio-egressgateway.istio-system.svc.cluster.local","response_code":"403","response_flags":"-","route_name":"-","start_time":"2024-07-29T03:34:36.647Z","trace_id":"-","upstream_cluster":"outbound|443||test.com","upstream_host":"${ASM網(wǎng)關(guān)IP}:443","upstream_local_address":"192.168.36.32:42214","upstream_response_time":"2","upstream_service_time":"2","upstream_transport_failure_reason":"-","user_agent":"curl/8.1.2","x_forwarded_for":"192.168.36.29"}

    可以看到這條請求訪問了入口網(wǎng)關(guān)的443端口,這個端口上只提供mTLS服務。

步驟五:后續(xù)配置

sleep Pod發(fā)起的是HTTP請求,在經(jīng)過Sidecar和出口網(wǎng)關(guān)之后,全鏈路均使用了mTLS加密。mTLS加密是執(zhí)行客戶端身份認證的基礎(chǔ),在請求鏈路中,您可以在兩個地方配置授權(quán)策略,限制客戶端行為。

  1. 使用以下內(nèi)容,在出口網(wǎng)關(guān)上配置授權(quán)策略,這可以限制集群內(nèi)哪些服務可以訪問test.com服務。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      labels:
        gateway: egressgateway
      name: test
      namespace: istio-system
    spec:
      action: DENY
      rules:
        - from:
            - source:
                principals:
                  - cluster.local/ns/default/sa/sleep
          to:
            - operation:
                hosts:
                  - test.com
                paths:
                  - /headers
      selector:
        matchLabels:
          istio: egressgateway

    此配置限制了sleep Pod通過出口網(wǎng)關(guān)訪問test.com/headers路徑。

  2. 在入口網(wǎng)關(guān)上配置授權(quán)策略,可以限制直接訪問入口網(wǎng)關(guān)的客戶端身份。在步驟四中,由于之前在入口網(wǎng)關(guān)上配置的授權(quán)策略,使得當前出口網(wǎng)關(guān)無法訪問/status/418路徑。