Bagikan melalui


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:

Diagram yang menampilkan kluster A K S dengan Azure Firewall untuk pemfilteran jalan keluar masuk.

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.

Topologi jaringan

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.

Firewall dan UDR

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 userDefinedRoutingkeluar , fitur ini memastikan setiap lalu lintas keluar dipaksa melalui firewall dan tidak ada jalur keluar lainnya (secara default jenis keluar Load Balancer dapat digunakan).

aks-deploy

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.

DNAT Pelayanan Publik

  1. Tinjau manifes mulai cepat Demo Penyimpanan AKS untuk melihat semua sumber daya yang akan dibuat.

  2. 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.

Cuplikan layar memperlihatkan Azure Store Front App dibuka di browser lokal.

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