全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan kebijakan otorisasi untuk mengontrol lalu lintas akses dari layanan dalam instance ASM ke database eksternal

更新时间:Jan 06, 2026

Untuk mengamankan database, Anda perlu membatasi layanan yang diizinkan mengaksesnya. Misalnya, hanya layanan di namespace tertentu dalam lingkungan produksi yang dapat mengakses database produksi. Dengan cara ini, Anda dapat menolak lalu lintas dari layanan dalam lingkungan pengembangan ke lingkungan produksi. Sistem keamanan zero-trust dari Service Mesh (ASM) memungkinkan Anda mengonfigurasi kebijakan otorisasi secara dinamis untuk mengontrol lalu lintas akses dari layanan dalam namespace ke database eksternal, membantu mengurangi risiko. Topik ini menjelaskan cara menggunakan kebijakan otorisasi untuk mengontrol lalu lintas akses dari layanan dalam namespace ke database ApsaraDB RDS eksternal. Namespace demo-server digunakan dalam contoh ini.

Prasyarat

Cluster telah ditambahkan ke instance ASM. Untuk informasi lebih lanjut, lihat Tambahkan Cluster ke Instance ASM.

Langkah 1: Aktifkan injeksi proxy sidecar otomatis

Buat namespace bernama demo-server dan aktifkan injeksi proxy sidecar otomatis untuk namespace tersebut agar Anda dapat mengotorisasi dan mengelola layanan di dalamnya. Untuk informasi lebih lanjut, lihat Kelola Namespace Global.

Langkah 2: Buat klien database

Dalam namespace demo-server, buat klien untuk mengirim permintaan terhubung ke database eksternal tertentu.

  1. Buka CLI di PC lokal Anda dan jalankan perintah berikut untuk mengenkripsi kata sandi yang digunakan untuk terhubung ke database eksternal dalam Base64:

    echo  <Database connection password> | base64 
  2. Dapatkan file kubeconfig cluster dan gunakan kubectl untuk terhubung ke cluster. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Cluster dan Gunakan kubectl untuk Terhubung ke Cluster.

  3. Buat klien MySQL dalam namespace demo-server.

    1. Buat file k8s-mysql.yaml dengan konten berikut:

      apiVersion: v1
      data:
        password: {yourPasswordBase64}  # Kata sandi koneksi database yang dienkripsi dalam Base64.
      kind: Secret
      metadata:
        name: mysql-pass
      type: Opaque
      ---
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          name: lbl-k8s-mysql
        name: k8s-mysql
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            name: lbl-k8s-mysql
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            labels:
              name: lbl-k8s-mysql
          spec:
            containers:
              - env:
                  - name: MYSQL_ROOT_PASSWORD
                    valueFrom:
                      secretKeyRef:
                        key: password
                        name: mysql-pass
                image: 'mysql:latest'
                imagePullPolicy: Always
                name: mysql
                ports:
                  - containerPort: 3306
                    name: mysql
                    protocol: TCP
                resources:
                  limits:
                    cpu: 500m
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
                volumeMounts:
                  - mountPath: /var/lib/mysql
                    name: k8s-mysql-storage
            dnsPolicy: ClusterFirst
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext: {}
            terminationGracePeriodSeconds: 30
            volumes:
              - emptyDir: {}
                name: k8s-mysql-storage
    2. Jalankan perintah berikut untuk membuat klien MySQL:

      kubectl apply -f k8s-mysql.yaml -n demo-server
  4. Verifikasi bahwa proxy sidecar disuntikkan ke klien MySQL.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Di halaman Clusters, temukan cluster yang diinginkan dan klik namanya. Di panel kiri, pilih Workloads > Pods.

    3. Di halaman Pods, klik nama pod klien MySQL.

      Di tab Container, proxy sidecar bernama istio-proxy ditampilkan, menunjukkan bahwa proxy sidecar disuntikkan ke klien MySQL.

Langkah 3: Buat gateway egress

Anda dapat menggunakan gateway egress untuk mengontrol lalu lintas akses dari layanan dalam instance Service Mesh ke situs web eksternal. Setelah mengonfigurasi kebijakan otorisasi untuk gateway egress, Anda juga dapat menentukan kondisi untuk mengontrol apakah akan mengizinkan akses ke database eksternal.

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih ASM Gateways > Egress Gateway.

  3. Di halaman Egress Gateway, klik Create.

  4. Di halaman Create, atur parameter Name gateway egress menjadi egressgateway, pilih cluster dari daftar drop-down Cluster, atur parameter Protocol menjadi TCP dan parameter Service Port menjadi 13306 di bagian Port Mapping, lalu klik Create.

    Untuk deskripsi item konfigurasi, lihat Buat Gateway Egress.

Langkah 4: Konfigurasikan kebijakan untuk mengakses layanan eksternal

Secara default, layanan dalam instance ASM diizinkan mengakses semua layanan eksternal. Untuk mengontrol akses ke situs web eksternal tertentu, atur parameter Outbound Traffic Policy menjadi REGISTRY_ONLY untuk instance ASM di Konsol ASM. Dengan cara ini, layanan eksternal yang tidak terdaftar sebagai entri layanan tidak dapat diakses oleh layanan dalam instance Service Mesh ini.

  1. Konfigurasikan kebijakan untuk mengakses layanan eksternal.

    1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Data Plane Component Management > Sidecar Proxy Setting.

    3. Di tab global, klik Outbound Traffic Policy, atur parameter Outbound Traffic Policy menjadi REGISTRY_ONLY, lalu klik Update Settings.

  2. Daftarkan database eksternal sebagai entri layanan.

    1. Di halaman detail instance ASM, pilih Cluster & Workload Management > External Service(ServiceEntry) di panel navigasi kiri. Di halaman yang muncul, klik Create from YAML.

    2. Di halaman Create, pilih istio-system dari daftar drop-down Namespace dan salin konten berikut ke editor kode YAML. Lalu, klik Create.

      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: demo-server-rds
        namespace: demo-server
      spec:
        endpoints:
          - address: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com   # Alamat database eksternal.
            ports:
              tcp: 3306  
        hosts:
          - rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
        location: MESH_EXTERNAL
        ports:
          - name: tcp
            number: 3306  # Port database eksternal.
            protocol: TCP  # Protokol yang digunakan oleh database eksternal.
        resolution: DNS
                                      

Langkah 5: Buat kebijakan trafik

Buat gateway Istio, aturan tujuan, dan layanan virtual untuk merutekan trafik dari namespace demo-server ke port 13306 gateway egress dan kemudian ke port 3306 database eksternal.

  1. Buat gateway Istio.

    1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih ASM Gateways > Gateway. Di halaman yang muncul, klik Create from YAML.

    3. Di halaman Create, pilih istio-system dari daftar drop-down Namespace dan salin konten berikut ke editor kode YAML. Lalu, klik Create.

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: istio-egressgateway
        namespace: istio-system
      spec:
        selector:
          istio: egressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: http-0
              number: 13306
              protocol: TLS
            tls:
              mode: ISTIO_MUTUAL

      Pada kode sebelumnya, parameter mode diatur ke ISTIO_MUTUAL. Ini berarti autentikasi Transport Layer Security mutual (mTLS) diaktifkan. Dalam kasus ini, layanan dalam instance ASM harus melewati autentikasi TLS sebelum dapat mengakses situs web eksternal.

  2. Buat aturan tujuan.

    1. Di halaman detail instance ASM, pilih Traffic Management Center > DestinationRule di panel navigasi kiri. Di halaman yang muncul, klik Create from YAML.

    2. Di halaman Create, pilih demo-server dari daftar drop-down Namespace dan salin konten berikut ke editor kode YAML. Lalu, klik Create.

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: demo-server-egress-gateway
        namespace: demo-server
      spec:
        host: istio-egressgateway.istio-system.svc.cluster.local
        subsets:
          - name: mysql-gateway-mTLS
            trafficPolicy:
              loadBalancer:
                simple: ROUND_ROBIN
              portLevelSettings:
                - port:
                    number: 13306 # Port gateway egress.
                  tls:
                    mode: ISTIO_MUTUAL
                    sni: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com  # Alamat host database eksternal.

      Pada kode sebelumnya, parameter mode diatur ke ISTIO_MUTUAL. Ini berarti autentikasi mTLS diaktifkan. Dalam kasus ini, layanan dalam instance ASM harus melewati autentikasi TLS sebelum dapat mengakses situs web eksternal.

  3. Buat layanan virtual.

    1. Di halaman detail instance ASM, pilih Traffic Management Center > VirtualService di panel navigasi kiri. Di halaman yang muncul, klik Create from YAML.

    2. Di halaman Create, pilih demo-server dari daftar drop-down Namespace dan salin konten berikut ke editor kode YAML. Lalu, klik Create.

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: demo-server-through-egress-gateway
        namespace: demo-server
      spec:
        exportTo:
          - istio-system
          - demo-server
        gateways:
          - mesh
          - istio-system/istio-egressgateway
        hosts:
          - rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
        tcp:
          - match:
              - gateways:
                  - mesh
                port: 3306
            route:
              - destination:
                  host: istio-egressgateway.istio-system.svc.cluster.local
                  port:
                    number: 13306
                  subset: mysql-gateway-mTLS
                weight: 100
          - match:
              - gateways:
                  - istio-system/istio-egressgateway
                port: 13306
            route:
              - destination:
                  host: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
                  port:
                    number: 3306
                weight: 100

      Pada bagian http dalam kode sebelumnya, dua aturan pencocokan dikonfigurasi. Pada aturan pencocokan pertama, parameter gateways diatur ke mesh. Ini menunjukkan bahwa aturan pencocokan pertama berlaku untuk proxy sidecar yang disuntikkan ke namespace demo-server dan digunakan untuk merutekan trafik dari namespace demo-server ke port 13306 gateway egress. Pada aturan pencocokan kedua, parameter gateways diatur ke istio-system/istio-egressgateway. Ini menunjukkan bahwa aturan pencocokan digunakan untuk merutekan trafik dari gateway egress ke port 3306 database terdaftar.

Langkah 6: Verifikasi bahwa kebijakan otorisasi dapat digunakan untuk mengontrol lalu lintas akses dari layanan dalam namespace demo-server ke database eksternal

Anda dapat membuat kebijakan otorisasi dan memodifikasi parameter action dalam kebijakan otorisasi untuk menolak atau mengizinkan lalu lintas akses dari layanan dalam namespace demo-server ke database eksternal. Dengan cara ini, Anda dapat mengontrol akses ke database eksternal.

  1. Buat kebijakan otorisasi untuk menolak lalu lintas akses dari namespace demo-server ke database eksternal.

    1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Mesh Security Center > AuthorizationPolicy. Di halaman yang muncul, klik Create.

    3. Di halaman Create, konfigurasikan parameter relevan dan klik Create.

      Parameter

      Deskripsi

      Name

      Nama kebijakan otorisasi.

      Policy Type

      Atur parameter ini ke DENY.

      Tab Gateway Scope

      ASM Gateway

      Pilih egressgateway. Setelah Anda memilih egressgateway, parameter Match Label diatur ke istio:egressgateway secara default.

      Request Matching Rules

      Aktifkan Namespaces dan atur ke demo-frontend.

      Membuat Kebijakan Otorisasi

  2. Akses database eksternal.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Di halaman Clusters, temukan cluster yang diinginkan dan klik namanya. Di panel kiri, pilih Workloads > Pods.

    3. Di halaman Pods, temukan container k8s-mysql dan klik Terminal di kolom Actions. Lalu, klik Container: MySQL.

    4. Jalankan perintah berikut di terminal container k8s-mysql untuk mengakses database eksternal:

      mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com

      Kesalahan ERROR 2013 dikembalikan, menunjukkan bahwa layanan dalam namespace demo-server gagal mengakses database eksternal.

  3. Ubah nilai parameter action dalam kebijakan otorisasi menjadi ALLOW untuk mengizinkan lalu lintas akses dari namespace demo-server ke database eksternal.

    1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Mesh Security Center > AuthorizationPolicy.

    3. Di halaman AuthorizationPolicy, temukan kebijakan yang ingin Anda kelola dan klik YAML di kolom Actions.

    4. Di kotak dialog Edit, ubah nilai parameter action menjadi ALLOW, lalu klik OK.

  4. Jalankan perintah berikut di terminal container k8s-mysql untuk mengakses database eksternal:

    mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com

    Pesan Welcome to the MySQL monitor dikembalikan, menunjukkan bahwa layanan dalam namespace demo-server dapat mengakses database eksternal.

    Hasil pengujian menunjukkan bahwa kebijakan otorisasi dapat digunakan untuk mengontrol lalu lintas akses dari layanan dalam namespace ke database eksternal.