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.
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> | base64Dapatkan 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.
Buat klien MySQL dalam namespace demo-server.
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-storageJalankan perintah berikut untuk membuat klien MySQL:
kubectl apply -f k8s-mysql.yaml -n demo-server
Verifikasi bahwa proxy sidecar disuntikkan ke klien MySQL.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan cluster yang diinginkan dan klik namanya. Di panel kiri, pilih .
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.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih .
Di halaman Egress Gateway, klik Create.
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.
Konfigurasikan kebijakan untuk mengakses layanan eksternal.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih .
Di tab global, klik Outbound Traffic Policy, atur parameter Outbound Traffic Policy menjadi REGISTRY_ONLY, lalu klik Update Settings.
Daftarkan database eksternal sebagai entri layanan.
Di halaman detail instance ASM, pilih di panel navigasi kiri. Di halaman yang muncul, klik Create from YAML.
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.
Buat gateway Istio.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih . Di halaman yang muncul, klik Create from YAML.
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_MUTUALPada 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.
Buat aturan tujuan.
Di halaman detail instance ASM, pilih di panel navigasi kiri. Di halaman yang muncul, klik Create from YAML.
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.
Buat layanan virtual.
Di halaman detail instance ASM, pilih di panel navigasi kiri. Di halaman yang muncul, klik Create from YAML.
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: 100Pada 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.
Buat kebijakan otorisasi untuk menolak lalu lintas akses dari namespace demo-server ke database eksternal.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih . Di halaman yang muncul, klik Create.
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.

Akses database eksternal.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan cluster yang diinginkan dan klik namanya. Di panel kiri, pilih .
Di halaman Pods, temukan container k8s-mysql dan klik Terminal di kolom Actions. Lalu, klik Container: MySQL.
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.comKesalahan
ERROR 2013dikembalikan, menunjukkan bahwa layanan dalam namespace demo-server gagal mengakses database eksternal.
Ubah nilai parameter action dalam kebijakan otorisasi menjadi ALLOW untuk mengizinkan lalu lintas akses dari namespace demo-server ke database eksternal.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih .
Di halaman AuthorizationPolicy, temukan kebijakan yang ingin Anda kelola dan klik YAML di kolom Actions.
Di kotak dialog Edit, ubah nilai parameter action menjadi ALLOW, lalu klik OK.
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.comPesan
Welcome to the MySQL monitordikembalikan, 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.