Menggunakan Azure Firewall untuk melindungi kluster Azure Kubernetes Service (AKS)
Artikel ini menunjukkan kepada Anda bagaimana Anda bisa melindungi kluster Azure Kubernetes Service (AKS) dengan menggunakan Azure Firewall untuk mengamankan lalu lintas keluar dan masuk.
Latar belakang
Azure Kubernetes Service (AKS) menawarkan kluster Kubernetes terkelola di Azure. Untuk informasi selengkapnya, lihat Azure Kubernetes Service.
Meskipun AKS menjadi solusi yang dikelola sepenuhnya, AKS tidak menawarkan solusi bawaan untuk mengamankan lalu lintas masuk dan keluar antara kluster dan jaringan eksternal. Azure Firewall menawarkan solusi untuk ini.
Klaster AKS disebarkan pada jaringan virtual. Jaringan ini dapat dikelola (dibuat oleh AKS) atau kustom (telah dikonfigurasi sebelumnya oleh pengguna). Dalam kedua kasus, klaster memiliki dependensi keluar pada layanan di luar jaringan virtual itu (layanan tidak memiliki dependensi masuk). Untuk tujuan manajemen dan operasional, simpul dalam kluster AKS perlu mengakses port tertentu dan nama domain yang sepenuhnya memenuhi syarat (FQDN) yang menjelaskan dependensi keluar ini. Ini diperlukan untuk berbagai fungsi termasuk, namun tidak terbatas pada, node yang berkomunikasi dengan server API Kubernetes. Mereka mengunduh dan menginstal komponen inti kluster Kubernetes dan penambal keamanan node, atau menarik gambar kontainer sistem dasar dari Microsoft Container Registry (MCR), dan seterusnya. Dependensi keluar ini hampir seluruhnya didefinisikan dengan FQDN, yang tidak memiliki alamat statik di belakangnya. Kurangnya alamat statik berarti bahwa Kelompok Keamanan Jaringan tidak dapat digunakan untuk mengunci lalu lintas keluar dari kluster AKS. Untuk alasan ini, secara default, kluster AKS memiliki akses Internet keluar (keluar) yang tidak terbatas. Tingkat akses jaringan ini memungkinkan node dan layanan yang Anda jalankan untuk mengakses sumber daya eksternal sesuai kebutuhan.
Namun, dalam lingkungan produksi, komunikasi dengan kluster Kubernetes harus dilindungi untuk mencegah penyelundupan data bersama dengan kerentanan lainnya. Semua lalu lintas jaringan yang masuk dan keluar harus dipantau dan dikontrol berdasarkan set aturan keamanan. Jika Anda ingin melakukan ini, Anda harus membatasi lalu lintas keluar, tetapi sejumlah port dan alamat terbatas harus tetap dapat diakses untuk mempertahankan tugas pemeliharaan kluster yang sehat dan memenuhi dependensi keluar yang disebutkan sebelumnya.
Solusi paling sederhana menggunakan perangkat firewall yang dapat mengontrol lalu lintas keluar berdasarkan nama domain. Firewall biasanya membuat penghalang antara jaringan tepercaya dan jaringan tidak tepercaya, seperti Internet. Azure Firewall, misalnya, dapat membatasi lalu lintas HTTP dan HTTPS keluar berdasarkan FQDN tujuan, memberi Anda kontrol lalu lintas keluar yang mendetail, tetapi pada saat yang sama memungkinkan Anda untuk memberikan akses ke FQDN yang mencakup dependensi keluar kluster AKS (sesuatu yang tidak dapat dilakukan NSG). Demikian juga, Anda dapat mengontrol lalu lintas masuk dan meningkatkan keamanan dengan mengaktifkan pemfilteran berbasis intelijen ancaman pada Azure Firewall yang disebarkan ke jaringan sekitar bersama. Pemfilteran ini dapat memberikan peringatan, dan menolak lalu lintas ke dan dari alamat IP dan domain berbahaya yang diketahui.
Lihat video berikut untuk gambaran umum singkat tentang cara kerjanya dalam praktik pada lingkungan sampel:
Anda dapat mengunduh file zip dari Pusat Unduhan Microsoft yang berisi file skrip dan file yaml untuk mengonfigurasi lingkungan sampel yang digunakan dalam video secara otomatis. Ini mengonfigurasi Azure Firewall untuk melindungi lalu lintas masuk dan keluar. Panduan berikut menjelaskan setiap langkah skrip secara lebih rinci sehingga Anda dapat menyiapkan konfigurasi kustom.
Diagram berikut menunjukkan lingkungan sampel dari video yang dikonfigurasi oleh skrip dan panduan:
Ada satu perbedaan antara skrip dan panduan berikut. Skrip menggunakan identitas terkelola, tetapi panduan menggunakan perwakilan layanan. Ini menunjukkan kepada Anda dua cara berbeda untuk membuat identitas untuk mengelola dan membuat sumber daya kluster.
Membatasi lalu lintas keluar menggunakan Azure Firewall
Mengatur konfigurasi melalui variabel lingkungan
Tentukan sekumpulan variabel lingkungan yang akan digunakan dalam pembuatan sumber daya.
PREFIX="aks-egress"
RG="${PREFIX}-rg"
LOC="eastus"
PLUGIN=azure
AKSNAME="${PREFIX}"
VNET_NAME="${PREFIX}-vnet"
AKSSUBNET_NAME="aks-subnet"
# DO NOT CHANGE FWSUBNET_NAME - This is currently a requirement for Azure Firewall.
FWSUBNET_NAME="AzureFirewallSubnet"
FWNAME="${PREFIX}-fw"
FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
FWIPCONFIG_NAME="${PREFIX}-fwconfig"
FWROUTE_TABLE_NAME="${PREFIX}-fwrt"
FWROUTE_NAME="${PREFIX}-fwrn"
FWROUTE_NAME_INTERNET="${PREFIX}-fwinternet"
Membuat jaringan virtual dengan beberapa subnet
Buat jaringan virtual dengan dua subnet terpisah, satu untuk kluster, satu untuk firewall. Secara opsional Anda juga dapat membuat satu untuk masuk layanan internal.
Buat grup sumber daya untuk menahan semua sumber daya.
# Create Resource Group
az group create --name $RG --location $LOC
Buat jaringan virtual dengan dua subnet untuk menghosting klaster AKS dan Azure Firewall. Masing-masing memiliki subnet mereka sendiri. Mari kita mulai dengan jaringan AKS.
# Dedicated virtual network with AKS subnet
az network vnet create \
--resource-group $RG \
--name $VNET_NAME \
--location $LOC \
--address-prefixes 10.42.0.0/16 \
--subnet-name $AKSSUBNET_NAME \
--subnet-prefix 10.42.1.0/24
# Dedicated subnet for Azure Firewall (Firewall name cannot be changed)
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name $FWSUBNET_NAME \
--address-prefix 10.42.2.0/24
Membuat dan menyiapkan Azure Firewall dengan UDR
Aturan masuk dan keluar Azure Firewall harus dikonfigurasi. Tujuan utama firewall adalah untuk memungkinkan organisasi untuk mengkonfigurasi masuk dan keluarnya aturan traffic granular ke dalam dan ke luar Klaster AKS.
Penting
Jika klaster atau aplikasi Anda membuat sejumlah besar koneksi keluar yang diarahkan ke subset tujuan yang sama atau kecil, Anda mungkin memerlukan lebih banyak IP frontend firewall untuk menghindari memaksimalkan port per IP frontend. Untuk informasi selengkapnya tentang cara membuat firewall Azure dengan beberapa IP, lihat di sini
Buat sumber daya IP publik SKU standar yang digunakan sebagai alamat frontend Azure Firewall.
az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
Daftarkan ekstensi klitoris pratinjau untuk membuat Azure Firewall.
# Install Azure Firewall preview CLI extension
az extension add --name azure-firewall
# Deploy Azure Firewall
az network firewall create -g $RG -n $FWNAME -l $LOC --enable-dns-proxy true
Alamat IP yang dibuat sebelumnya sekarang dapat ditetapkan ke frontend firewall.
Catatan
Menyetel alamat IP publik ke Azure Firewall mungkin memakan waktu beberapa menit. Untuk memanfaatkan FQDN pada aturan jaringan, kita memerlukan proksi DNS diaktifkan, ketika diaktifkan firewall akan mendengarkan di port 53 dan akan meneruskan permintaan DNS ke server DNS yang ditentukan sebelumnya. Ini akan memungkinkan firewall untuk menerjemahkan FQDN secara otomatis.
# Configure Firewall IP Config
az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
Ketika perintah sebelumnya telah berhasil, simpan alamat IP frontend firewall untuk konfigurasi nanti.
# Capture Firewall IP Address for Later Use
FWPUBLIC_IP=$(az network public-ip show -g $RG -n $FWPUBLICIP_NAME --query "ipAddress" -o tsv)
FWPRIVATE_IP=$(az network firewall show -g $RG -n $FWNAME --query "ipConfigurations[0].privateIPAddress" -o tsv)
# set fw as vnet dns server so dns queries are visible in fw logs
az network vnet update -g $RG --name $VNET_NAME --dns-servers $FWPRIVATE_IP
Catatan
Jika Anda menggunakan akses aman ke server API AKS dengan rentang alamat IP resmi,Anda perlu menambahkan IP publik firewall ke dalam rentang IP resmi.
Membuat UDR dengan melompat ke Azure Firewall
Azure secara otomatis merutekan traffic antara subnet Azure, jaringan virtual, dan jaringan lokal. Jika Anda ingin mengubah perutean default Azure, lakukan dengan membuat tabel rute.
Buat tabel rute kosong untuk dikaitkan dengan subjaringan tertentu. Tabel rute akan menentukan hop berikutnya sebagai Azure Firewall yang dibuat sebelumnya. Setiap subnet dapat memiliki nol atau satu tabel rute yang terkait dengannya.
# Create UDR and add a route for Azure Firewall
az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
az network route-table route create -g $RG --name $FWROUTE_NAME --route-table-name $FWROUTE_TABLE_NAME --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address $FWPRIVATE_IP
az network route-table route create -g $RG --name $FWROUTE_NAME_INTERNET --route-table-name $FWROUTE_TABLE_NAME --address-prefix $FWPUBLIC_IP/32 --next-hop-type Internet
Lihat dokumentasi tabel rute jaringan virtual tentang bagaimana Anda dapat mengambil alih rute sistem default Azure atau menambahkan lebih banyak rute ke tabel rute subnet.
Menambahkan aturan tembok api
Catatan
Untuk aplikasi di luar namespace sistem kube atau sistem penjaga gerbang yang perlu berkomunikasi dengan server API, aturan jaringan tambahan untuk mengizinkan komunikasi TCP ke port 443 untuk IP server API selain menambahkan aturan aplikasi untuk tag fqdn AzureKubernetesService diperlukan.
Anda dapat menggunakan tiga aturan jaringan berikut untuk mengonfigurasi firewall Anda. Anda mungkin perlu menyesuaikan aturan ini berdasarkan penyebaran Anda. Aturan pertama memungkinkan akses ke port 9000 melalui TCP. Aturan kedua memungkinkan akses ke port 1194 dan 123 melalui UDP. Kedua aturan ini hanya mengizinkan lalu lintas yang ditujukan ke CIDR Wilayah Azure yang kami gunakan, dalam hal ini AS Timur.
Terakhir, kami menambahkan port pembukaan aturan jaringan ketiga 123 ke server waktu Internet FQDN (misalnya:ntp.ubuntu.com
) melalui UDP. Menambahkan FQDN sebagai aturan jaringan adalah salah satu fitur spesifik Azure Firewall, dan Anda perlu menyesuaikannya saat menggunakan opsi Anda sendiri.
Setelah mengatur aturan jaringan, kami juga akan menambahkan aturan aplikasi menggunakan AzureKubernetesService
yang mencakup FQDN yang diperlukan yang dapat diakses melalui port TCP 443 dan port 80. Selain itu, Anda mungkin perlu mengonfigurasi lebih banyak aturan jaringan dan aplikasi berdasarkan penyebaran Anda. Untuk informasi selengkapnya, lihat Aturan jaringan keluar dan FQDN untuk kluster Azure Kubernetes Service (AKS).
Tambahkan Aturan Jaringan FW
az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 1194 --action allow --priority 100
az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 9000
az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123
Menambahkan Aturan Aplikasi FW
az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100
# set fw application rule to allow kubernetes to reach storage and image resources
az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwarweb' -n 'storage' --source-addresses '10.42.1.0/24' --protocols 'https=443' --target-fqdns '*.blob.storage.azure.net' '*.blob.core.windows.net' --action allow --priority 101
az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwarweb' -n 'website' --source-addresses '10.42.1.0/24' --protocols 'https=443' --target-fqdns 'ghcr.io' '*.docker.io' '*.docker.com' '*.githubusercontent.com'
Lihat dokumentasi Azure Firewall untuk mempelajari selengkapnya tentang layanan Azure Firewall.
Mengaitkan tabel rute ke AKS
Untuk mengaitkan kluster dengan firewall, subnet khusus untuk subnet kluster harus mereferensikan tabel rute yang dibuat sebelumnya. Asosiasi dapat dilakukan dengan mengeluarkan perintah ke jaringan virtual yang memegang klaster dan firewall untuk memperbarui tabel rute subnet klaster.
# Associate route table with next hop to Firewall to the AKS subnet
az network vnet subnet update -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME
Sebarkan AKS dengan tipe keluar UDR ke jaringan yang ada
Sekarang klaster AKS dapat disebarkan ke jaringan virtual yang ada. Anda juga menggunakan jenis userDefinedRouting
keluar , fitur ini memastikan setiap lalu lintas keluar dipaksa melalui firewall dan tidak ada jalur keluar lainnya (secara default jenis keluar Load Balancer dapat digunakan).
Subnet target yang akan digunakan didefinisikan dengan variabel lingkungan, $SUBNETID
. Kami tidak mendefinisikan variabel di $SUBNETID
langkah-langkah sebelumnya. Untuk mengatur nilai untuk ID subjaringan, Anda bisa menggunakan perintah berikut:
SUBNETID=$(az network vnet subnet show -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)
Anda menentukan jenis keluar untuk menggunakan UDR yang sudah ada di subnet. Konfigurasi ini memungkinkan AKS untuk melewati penyiapan dan provisi IP untuk load balancer.
Penting
Untuk informasi selengkapnya tentang tipe keluar UDR termasuk batasan, lihat keluar tipe keluar UDR.
Tip
Fitur tambahan dapat ditambahkan ke penyebaran kluster seperti Kluster Privat atau mengubah SKU OS.
Fitur AKS untuk rentang IP resmi server API dapat ditambahkan untuk membatasi akses server API hanya ke titik akhir publik firewall. Fitur rentang IP resmi ditandai dalam diagram sebagai opsional. Saat mengaktifkan fitur rentang IP resmi untuk membatasi akses server API, alat pengembang Anda harus menggunakan jumpbox dari jaringan virtual firewall atau Anda harus menambahkan semua titik akhir pengembang ke rentang IP yang diotorisasi.
az aks create -g $RG -n $AKSNAME -l $LOC \
--node-count 3 \
--network-plugin azure \
--outbound-type userDefinedRouting \
--vnet-subnet-id $SUBNETID \
--api-server-authorized-ip-ranges $FWPUBLIC_IP
Catatan
Untuk membuat dan menggunakan VNet Anda sendiri dan merutekan tabel dengan kubenet
plugin jaringan, Anda perlu menggunakan identitas terkelola yang ditetapkan pengguna. Untuk identitas terkelola yang ditetapkan sistem, kami tidak bisa mendapatkan ID identitas sebelum membuat kluster, yang menyebabkan keterlambatan penetapan peran berlaku.
Untuk membuat dan menggunakan VNet Anda sendiri dan tabel rute dengan azure
plugin jaringan, identitas terkelola yang ditetapkan sistem dan yang ditetapkan pengguna didukung.
Aktifkan akses pengembang ke server API
Jika Anda menggunakan rentang IP resmi untuk klaster pada langkah sebelumnya, Anda harus menambahkan alamat IP perkakas pengembang anda ke daftar klaster AKS dari rentang IP yang disetujui untuk mengakses server API dari sana. Pilihan lain adalah mengonfigurasi jumpbox dengan alat yang diperlukan di dalam subnet terpisah di jaringan virtual Firewall.
Tambahkan alamat IP lain ke rentang yang disetujui dengan perintah berikut
# Retrieve your IP address
CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
# Add to AKS approved list
az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
Gunakan perintah az aks get-credentials untuk mengonfigurasi kubectl
untuk tersambung ke kluster Kubernetes Anda yang baru dibuat.
az aks get-credentials -g $RG -n $AKSNAME
Membatasi lalu lintas masuk menggunakan Azure Firewall
Anda sekarang dapat mulai mengekspos layanan dan menyebarkan aplikasi ke klaster ini. Dalam contoh ini, kami mengekspos layanan publik, tetapi Anda juga dapat memilih untuk mengekspos layanan internal melalui load balancer internal.
Tinjau manifes mulai cepat Demo Penyimpanan AKS untuk melihat semua sumber daya yang akan dibuat.
Sebarkan layanan menggunakan
kubectl apply
perintah .kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
Menambahkan aturan DNAT ke Azure Firewall
Penting
Saat Anda menggunakan Azure Firewall untuk membatasi traffic keluar dan membuat rute yang ditentukan pengguna (UDR) untuk memaksa semua traffic keluar, pastikan Anda membuat aturan DNAT yang sesuai di Firewall untuk memungkinkan traffic masuk dengan benar. Menggunakan Azure Firewall dengan UDR melanggar pengaturan masuk karena perutean asimetris. (Masalah terjadi jika subnet AKS memiliki rute default yang masuk ke alamat IP pribadi firewall, tetapi Anda menggunakan penyeimbang beban publik - ingress atau layanan Kubernetes tipe: LoadBalancer). Pada kasus ini, lalu lintas penyeimbang beban yang masuk diterima melalui alamat IP publiknya, tetapi jalur kembalinya melewati alamat IP privat firewall. Karena firewall bersifat stateful, firewall mengabaikan paket yang kembali karena firewall tidak mengetahui sesi yang dibuat. Untuk mempelajari cara mengintegrasikan Azure Firewall dengan ingress atau load balancer layanan Anda, lihat Mengintegrasikan Azure Firewall dengan Azure Standard Load Balancer.
Untuk mengonfigurasi konektivitas masuk, aturan DNAT harus ditulis ke Azure Firewall. Untuk menguji konektivitas ke klaster Anda, aturan didefinisikan untuk alamat IP publik frontend firewall untuk merutekan ke IP internal yang diekspos oleh layanan internal.
Alamat tujuan dapat dikustomisasi karena port pada firewall yang akan diakses. Alamat yang diterjemahkan harus alamat IP dari penyeimbang beban internal. Port yang diterjemahkan harus menjadi port yang diekspos untuk layanan Kubernetes Anda.
Anda perlu menentukan alamat IP internal yang ditetapkan ke load balancer yang dibuat oleh layanan Kubernetes. Ambil alamat dengan menjalankan:
kubectl get services
Alamat IP yang diperlukan tercantum di kolom EXTERNAL-IP, mirip dengan yang berikut ini.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.41.0.1 <none> 443/TCP 10h
store-front LoadBalancer 10.41.185.82 203.0.113.254 80:32718/TCP 9m
order-service ClusterIP 10.0.104.144 <none> 3000/TCP 11s
product-service ClusterIP 10.0.237.60 <none> 3002/TCP 10s
rabbitmq ClusterIP 10.0.161.128 <none> 5672/TCP,15672/TCP 11s
Dapatkan IP layanan dengan menjalankan:
SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
Tambahkan aturan NAT dengan menjalankan:
az network firewall nat-rule create --collection-name exampleset --destination-addresses $FWPUBLIC_IP --destination-ports 80 --firewall-name $FWNAME --name inboundrule --protocols Any --resource-group $RG --source-addresses '*' --translated-port 80 --action Dnat --priority 100 --translated-address $SERVICE_IP
Memvalidasi konektivitas
Navigasi ke alamat IP frontend Azure Firewall di browser untuk memvalidasi konektivitas.
Anda akan melihat aplikasi penyimpanan AKS. Dalam contoh ini, IP publik Firewall adalah 203.0.113.32
.
Di halaman ini, Anda dapat melihat produk, menambahkannya ke kelir Anda, lalu melakukan pemesanan.
Membersihkan sumber daya
Untuk membersihkan sumber daya Azure, hapus grup sumber daya AKS.
az group delete -g $RG
Langkah berikutnya
- Pelajari lebih lanjut tentang Azure Kubernetes Service, lihat Konsep inti Kubernetes untuk Azure Kubernetes Service (AKS).