全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan gateway egress ASM untuk mengakses layanan mTLS eksternal

更新时间:Jul 02, 2025

Service Mesh (ASM) gateway egress berfungsi sebagai pintu keluar terpadu untuk lalu lintas di dalam ASM. Gateway ini dapat memulai permintaan TLS/mTLS untuk mencapai komunikasi terenkripsi ujung ke ujung serta menerapkan kebijakan keamanan menyeluruh guna kontrol akses yang lebih rinci. Dalam ASM, gateway egress merupakan pilihan ideal untuk mengelola lalu lintas arah keluar. Topik ini menjelaskan cara menggunakan gateway egress ASM untuk mengelola lalu lintas arah keluar dan memulai komunikasi mTLS.

Penting

Pastikan Anda telah menyelesaikan semua langkah yang tercantum di Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu. Topik ini menggunakan aplikasi yang diterapkan di lingkungan ASM dan Container Service for Kubernetes (ACK) sebagai server mTLS eksternal. Oleh karena itu, saat melakukan langkah-langkah dalam topik ini, Anda perlu membuat lingkungan ASM dan ACK lainnya sebagai lingkungan utama. Untuk klarifikasi, ${ASM gateway IP} dalam topik ini mewakili alamat IP gateway ingress yang digunakan di Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu, dan "ACK cluster" serta "ASM instance" merujuk pada sumber daya lingkungan utama.

Prasyarat

Injeksi sidecar otomatis harus diaktifkan. Untuk informasi lebih lanjut, lihat Konfigurasikan kebijakan injeksi proxy sidecar.

Langkah 1: Terapkan aplikasi pengujian sleep

Terapkan aplikasi sleep. Untuk informasi lebih lanjut, lihat Operasi terkait.

Gunakan kubeconfig dari kluster ACK untuk menjalankan perintah berikut guna menguji akses ke layanan HTTPBin yang diterapkan di lingkungan ASM dan ACK lainnya.

kubectl exec deploy/sleep -- curl --header "host:test.com" ${ASM gateway IP}/status/418

Keluaran yang diharapkan:

    -=[ teapot ]=-

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

Langkah 2: Aktifkan REGISTRY_ONLY dan buat ServiceEntry

Sidecar mendukung konfigurasi kebijakan akses eksternal sebagai REGISTRY_ONLY. Setelah REGISTRY_ONLY diaktifkan, pod hanya dapat mengakses layanan yang didaftarkan melalui ServiceEntry. Anda dapat memilih apakah akan mengaktifkan fitur ini. Untuk informasi lebih lanjut, lihat Langkah 2: Aktifkan REGISTRY_ONLY. Setelah fitur diaktifkan, mengakses layanan yang tidak terdaftar akan menghasilkan kesalahan 502 Bad Gateway.

Gunakan konten berikut untuk mengonfigurasi ServiceEntry untuk test.com. Untuk informasi lebih lanjut, lihat Buat layanan eksternal.

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: test-com
  namespace: default
spec:
  endpoints:
    - address: ${Alamat IP gateway ingress}  
  hosts:
    - test.com
  location: MESH_EXTERNAL
  ports:
    - name: http
      number: 80
      protocol: HTTP
    - name: https
      number: 443
      protocol: HTTPS
  resolution: STATIC

Setelah menyelesaikan konfigurasi, Anda dapat mengakses layanan HTTPBin dari pod sleep.

Langkah 3: Buat gateway egress ASM dan arahkan permintaan HTTP melalui gateway egress

  1. Buat gateway egress, konfigurasikan untuk lalu lintas HTTP pada port 80, dan aktifkan saklar autentikasi mutual TLS. Setelah saklar diaktifkan, beban kerja lain di ASM secara otomatis menggunakan mTLS saat mengirim lalu lintas ke gateway, dengan sertifikat mTLS dikelola secara seragam oleh ASM. Untuk informasi lebih lanjut, lihat Buat gateway egress.

  2. Gunakan konten berikut untuk membuat aturan gateway. Untuk informasi lebih lanjut, lihat Buat aturan gateway.

    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

    Aturan gateway menyatakan bahwa gateway egress mendengarkan pada port 80 dengan mTLS diaktifkan, menggunakan sertifikat yang disediakan oleh ASM.

  3. Gunakan konten berikut untuk membuat layanan virtual.

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: egressgateway-vs
    spec:
      hosts:
      - test.com
      gateways:
      - egress-gateway  # Nama aturan gateway yang dibuat pada langkah sebelumnya.
      - 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

    Setelah membuat layanan virtual, lalu lintas untuk test.com di sidecar dikirim ke gateway egress, dan lalu lintas yang diterima oleh gateway egress untuk test.com dikirim ke test.com ServiceEntry yang sebenarnya.

  4. Jalankan perintah berikut untuk mengakses test.com dari pod aplikasi sleep.

    kubectl exec deploy/sleep -- curl --header "host:test.com" ${ASM gateway IP}/status/418

    Keluaran yang diharapkan:

        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`
  5. Gunakan kubeconfig dari instance ASM untuk menjalankan perintah berikut.

    kubectl -n istio-system logs ${nama pod gateway egress}| tail -1

    Keluaran yang diharapkan:

    {"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 gateway 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"}

    Log di atas mengonfirmasi bahwa layanan melewati gateway egress ASM.

Path permintaan dalam contoh ini adalah: sleep pod --> istio-egressgateway --> istio-ingressgateway --> httpbin. Di antaranya:

  • sleep pod --> istio-egressgateway adalah lalu lintas mTLS.

  • istio-egressgateway --> istio-ingressgateway adalah lalu lintas teks biasa.

  • istio-ingressgateway --> httpbin adalah lalu lintas mTLS.

Interaksi antara dua gateway melalui teks biasa jelas tidak aman. Karena gateway sisi server mendukung mTLS, Anda hanya perlu mengonfigurasi gateway egress sisi klien untuk memulai permintaan mTLS.

Langkah 4: Tingkatkan permintaan HTTP menjadi lalu lintas mTLS di gateway egress

  1. Gunakan konten berikut untuk memperbarui layanan virtual.

    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  # Hanya baris ini yang dimodifikasi
          weight: 100

    Pembaruan di sini hanya mengubah lalu lintas yang dikirim ke test.com ServiceEntry dari port 80 ke port 443.

  2. Impor sertifikat mTLS yang digunakan di Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu. Pastikan sertifikat yang diimpor bernama test.client. Untuk informasi lebih lanjut, lihat Gunakan fitur manajemen sertifikat ASM. Anda juga dapat menggunakan kubectl untuk membuat rahasia guna mengimpor sertifikat. Gunakan kubeconfig dari kluster ACK untuk menjalankan perintah berikut.

    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. Gunakan konten berikut untuk membuat aturan tujuan.

    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. Jalankan perintah berikut untuk menguji akses lagi.

    kubectl exec deployment/sleep -it -- curl --header "host:test.com" ${ASM gateway IP}/status/418

    Keluaran yang diharapkan:

    RBAC: access denied%

    Permintaan ditolak. Ini karena sertifikat klien yang digunakan di sini digunakan kembali dari Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu, yang dikonfigurasi untuk melarang test.client mengakses path status/418.

  5. Jalankan perintah berikut untuk mengakses path status/200.

    kubectl exec deploy/sleep -it -- curl --header "host:test.com" ${ASM gateway IP}/status/200 -I

    Keluaran yang diharapkan:

    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

    Akses berhasil.

  6. Jalankan perintah berikut untuk melihat log akses gateway egress.

    kubectl -n istio-system logs ${nama pod gateway egress}| tail -1

    Keluaran yang diharapkan:

    {"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 gateway 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"}

    Permintaan ini mengakses port 443 gateway ingress, yang hanya menyediakan layanan mTLS.

Langkah 5: Konfigurasi selanjutnya

Pod sleep memulai permintaan HTTP. Setelah melewati sidecar dan gateway egress, seluruh koneksi diamankan dengan enkripsi mTLS, yang membentuk dasar untuk otentikasi identitas klien. Dalam aliran permintaan ini, kebijakan otorisasi dapat dikonfigurasi di dua tempat untuk membatasi perilaku klien.

  1. Gunakan konten berikut untuk mengonfigurasi kebijakan otorisasi pada gateway egress. Ini dapat membatasi layanan mana di dalam kluster yang dapat mengakses layanan 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

    Konfigurasi ini membatasi pod sleep untuk mengakses path /headers dari test.com melalui gateway egress.

  2. Konfigurasikan kebijakan otorisasi pada gateway ingress untuk membatasi identitas klien yang langsung mengakses gateway ingress. Kebijakan otorisasi pada gateway ingress yang dikonfigurasi di Langkah 4 mencegah gateway egress saat ini mengakses path /status/418.