Azure Kubernetes Service (AKS) kümelerini korumak için Azure Güvenlik Duvarı kullanma
Bu makalede, giden ve gelen trafiğin güvenliğini sağlamak için Azure Güvenlik Duvarı kullanarak Azure Kubernetes Service (AKS) kümelerini nasıl koruyabileceğiniz gösterilmektedir.
Background
Azure Kubernetes Service (AKS), Azure'da yönetilen bir Kubernetes kümesi sunar. Daha fazla bilgi için bkz . Azure Kubernetes Service.
AKS tam olarak yönetilen bir çözüm olmasına rağmen, küme ile dış ağlar arasındaki giriş ve çıkış trafiğinin güvenliğini sağlamak için yerleşik bir çözüm sunmaz. Azure Güvenlik Duvarı buna bir çözüm sunar.
AKS kümeleri bir sanal ağa dağıtılır. Bu ağ yönetilebilir (AKS tarafından oluşturulur) veya özel (kullanıcı tarafından önceden yapılandırılmıştır). Her iki durumda da kümenin bu sanal ağın dışındaki hizmetlere giden bağımlılıkları vardır (hizmetin gelen bağımlılıkları yoktur). Yönetim ve işletim amaçları doğrultusunda AKS kümesindeki düğümlerin belirli bağlantı noktalarına ve bu giden bağımlılıkları açıklayan tam etki alanı adlarına (FQDN) erişmesi gerekir. Bu, Kubernetes API sunucusuyla iletişim kuran düğümler dahil ancak bunlarla sınırlı olmamak üzere çeşitli işlevler için gereklidir. Çekirdek Kubernetes kümesi bileşenlerini ve düğüm güvenlik güncelleştirmelerini veya Microsoft Container Registry'den (MCR) temel sistem kapsayıcı görüntülerini vb. indirip yüklerler. Bu giden bağımlılıklar, arkalarında statik adresleri olmayan FQDN'lerle neredeyse tamamen tanımlanır. Statik adreslerin olmaması, Aks kümesinden giden trafiği kilitlemek için Ağ Güvenlik Gruplarının kullanılamayacağı anlamına gelir. Bu nedenle AKS kümeleri varsayılan olarak sınırsız giden (çıkış) İnternet erişimine sahiptir. Bu ağ erişimi düzeyi, çalıştırdığınız düğümlerin ve hizmetlerin gerektiğinde dış kaynaklara erişmesine olanak tanır.
Ancak üretim ortamında, diğer güvenlik açıklarıyla birlikte veri sızdırmayı önlemek için Kubernetes kümesiyle yapılan iletişimler korunmalıdır. Tüm gelen ve giden ağ trafiği bir dizi güvenlik kuralına göre izlenmeli ve denetlenmelidir. Bunu yapmak istiyorsanız çıkış trafiğini kısıtlamanız gerekir, ancak küme bakım görevlerinin iyi durumda tutulması ve daha önce bahsedilen giden bağımlılıkların karşılanması için sınırlı sayıda bağlantı noktası ve adresin erişilebilir durumda kalması gerekir.
En basit çözüm, etki alanı adlarına göre giden trafiği denetleyebilen bir güvenlik duvarı cihazı kullanır. Güvenlik duvarı genellikle güvenilir ağ ile İnternet gibi güvenilmeyen bir ağ arasında bir engel oluşturur. Örneğin Azure Güvenlik Duvarı, hedefin FQDN'sine bağlı olarak giden HTTP ve HTTPS trafiğini kısıtlayabilir ve ayrıntılı çıkış trafik denetimi sağlar, ancak aynı zamanda AKS kümesinin giden bağımlılıklarını kapsayan FQDN'lere (NSG'lerin yapamayabileceği bir şey) erişim sağlamanıza da olanak tanır. Benzer şekilde, paylaşılan çevre ağına dağıtılan bir Azure Güvenlik Duvarı tehdit bilgileri tabanlı filtrelemeyi etkinleştirerek giriş trafiğini denetleyebilir ve güvenliği geliştirebilirsiniz. Bu filtreleme uyarılar sağlayabilir ve bilinen kötü amaçlı IP adreslerine ve etki alanlarına gelen ve giden trafiği reddedebilir.
Bunun örnek bir ortamda nasıl çalıştığına ilişkin hızlı bir genel bakış için aşağıdaki videoya bakın:
Videoda kullanılan örnek ortamı otomatik olarak yapılandırmak için Microsoft İndirme Merkezi'nden bash betik dosyası ve yaml dosyası içeren bir zip dosyası indirebilirsiniz. Hem giriş hem de çıkış trafiğini korumak için Azure Güvenlik Duvarı yapılandırılır. Aşağıdaki kılavuzlar, özel yapılandırmayı ayarlayabilmeniz için betiğin her adımında daha ayrıntılı bir şekilde ilerler.
Aşağıdaki diyagramda, betiğin ve kılavuzun yapılandırılan videodaki örnek ortam gösterilmektedir:
Betik ile aşağıdaki kılavuz arasında bir fark vardır. Betik yönetilen kimlikleri kullanır, ancak kılavuz bir hizmet sorumlusu kullanır. Bu, küme kaynaklarını yönetmek ve oluşturmak için kimlik oluşturmanın iki farklı yolunu gösterir.
Azure Güvenlik Duvarı kullanarak çıkış trafiğini kısıtlama
Ortam değişkenleri aracılığıyla yapılandırmayı ayarlama
Kaynak oluşturmalarda kullanılacak bir ortam değişkenleri kümesi tanımlayın.
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"
Birden fazla alt ağa sahip bir sanal ağ oluşturma
Biri küme, biri güvenlik duvarı için olmak üzere iki ayrı alt ağa sahip bir sanal ağ oluşturun. İsteğe bağlı olarak, iç hizmet girişi için de bir tane oluşturabilirsiniz.
Tüm kaynakları barındıracak bir kaynak grubu oluşturun.
# Create Resource Group
az group create --name $RG --location $LOC
AKS kümesini ve Azure Güvenlik Duvarı barındırmak için iki alt ağa sahip bir sanal ağ oluşturun. Her birinin kendi alt ağı vardır. AKS ağıyla başlayalım.
# 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
UDR ile Azure Güvenlik Duvarı oluşturma ve ayarlama
Azure Güvenlik Duvarı gelen ve giden kuralları yapılandırılmalıdır. Güvenlik duvarının temel amacı, kuruluşların AKS Kümesine ve dışına ayrıntılı giriş ve çıkış trafiği kuralları yapılandırmasına olanak tanımaktır.
Önemli
Kümeniz veya uygulamanız aynı veya küçük hedef alt kümesine yönlendirilmiş çok sayıda giden bağlantı oluşturuyorsa, ön uç IP'leri başına bağlantı noktalarının üst sınırından kaçınmak için daha fazla güvenlik duvarı ön uç IP'sine ihtiyacınız olabilir. Birden çok IP ile Azure güvenlik duvarı oluşturma hakkında daha fazla bilgi için buraya bakın
Azure Güvenlik Duvarı ön uç adresi olarak kullanılan standart bir SKU genel IP kaynağı oluşturun.
az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
Azure Güvenlik Duvarı oluşturmak için önizleme cli uzantısını kaydedin.
# 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
Daha önce oluşturulan IP adresi artık güvenlik duvarı ön ucuna atanabilir.
Not
genel IP adresinin Azure Güvenlik Duvarı ayarlanması birkaç dakika sürebilir. Ağ kurallarında FQDN'yi kullanmak için DNS proxy'sinin etkinleştirilmesi gerekir; etkinleştirildiğinde güvenlik duvarı 53 numaralı bağlantı noktasını dinler ve DNS isteklerini daha önce belirtilen DNS sunucusuna iletir. Bu, güvenlik duvarının bu FQDN'yi otomatik olarak çevirmesine olanak sağlar.
# 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
Önceki komut başarılı olduğunda, daha sonra yapılandırma için güvenlik duvarı ön uç IP adresini kaydedin.
# 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)
Not
Yetkili IP adresi aralıklarıyla AKS API sunucusuna güvenli erişim kullanıyorsanız, güvenlik duvarı genel IP'sini yetkili IP aralığına eklemeniz gerekir.
Azure Güvenlik Duvarı atlayan bir UDR oluşturma
Azure, Azure alt ağları, sanal ağlar ve şirket içi ağlar arasındaki trafiği otomatik olarak yönlendirir. Azure'ın varsayılan yönlendirmelerinden herhangi birini değiştirmek istiyorsanız, bunu bir yol tablosu oluşturarak yaparsınız.
Belirli bir alt ağ ile ilişkilendirilecek boş bir yol tablosu oluşturun. Rota tablosu, sonraki atlamayı daha önce oluşturulan Azure Güvenlik Duvarı olarak tanımlar. Her alt ağ ile ilişkili sıfır veya bir yol tablosu olabilir.
# 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
Azure'ın varsayılan sistem yollarını nasıl geçersiz kılabileceğiniz veya bir alt ağın yönlendirme tablosuna daha fazla yol ekleyebileceğiniz hakkında sanal ağ yönlendirme tablosu belgelerine bakın.
Güvenlik duvarı kuralları ekleme
Not
API sunucusuyla konuşması gereken kube-system veya gatekeeper-system ad alanları dışındaki uygulamalar için, fqdn etiketi AzureKubernetesService için uygulama kuralı eklemeye ek olarak API sunucusu IP'sine yönelik 443 numaralı bağlantı noktasına TCP iletişimine izin veren ek bir ağ kuralı gerekir.
Güvenlik duvarınızı yapılandırmak için aşağıdaki üç ağ kuralını kullanabilirsiniz. Bu kuralları dağıtımınıza göre uyarlamanız gerekebilir. İlk kural TCP üzerinden 9000 numaralı bağlantı noktasına erişime izin verir. İkinci kural UDP aracılığıyla 1194 ve 123 numaralı bağlantı noktasına erişime izin verir. Bu kuralların her ikisi de yalnızca kullanmakta olduğumuz Azure Bölge CIDR'ye (bu örnekte Doğu ABD) giden trafiğe izin verir.
Son olarak, UDP aracılığıyla İnternet saat sunucusu FQDN'sine (örneğin:ntp.ubuntu.com
) 123 numaralı bağlantı noktasını açan üçüncü bir ağ kuralı ekleyeceğiz. FQDN'yi ağ kuralı olarak eklemek, Azure Güvenlik Duvarı belirli özelliklerinden biridir ve kendi seçeneklerinizi kullanırken bunu uyarlamanız gerekir.
Ağ kurallarını ayarladıktan sonra, 443 numaralı TCP bağlantı noktası ve 80 numaralı bağlantı noktası üzerinden erişilebilen gerekli FQDN'leri kapsayan bir uygulama kuralı AzureKubernetesService
da ekleyeceğiz. Ayrıca dağıtımınıza göre daha fazla ağ ve uygulama kuralı yapılandırmanız gerekebilir. Daha fazla bilgi için bkz . Azure Kubernetes Service (AKS) kümeleri için giden ağ ve FQDN kuralları.
FW Ağ Kuralları Ekleme
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
FW Uygulama Kuralları Ekleme
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
Azure Güvenlik Duvarı hizmeti hakkında daha fazla bilgi edinmek için Azure Güvenlik Duvarı belgelerine bakın.
Yol tablosunu AKS ile ilişkilendirme
Kümeyi güvenlik duvarıyla ilişkilendirmek için, kümenin alt ağı için ayrılmış alt ağ daha önce oluşturulan yol tablosuna başvurmalıdır. İlişkilendirme, kümenin alt ağının yol tablosunu güncelleştirmek için hem kümeyi hem de güvenlik duvarını barındıran sanal ağa bir komut vererek yapılabilir.
# 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
Aks'yi UDR giden türüyle mevcut ağa dağıtma
Artık aks kümesi mevcut sanal ağa dağıtılabilir. Giden türünü userDefinedRouting
de kullanırsınız. Bu özellik, giden trafiğin güvenlik duvarı üzerinden zorlanmasını ve başka çıkış yolu olmamasını sağlar (varsayılan olarak Load Balancer giden türü kullanılabilir).
Dağıtılacak hedef alt ağ, ortam değişkeniyle $SUBNETID
tanımlanır. Değişkeni önceki adımlarda tanımlamadık $SUBNETID
. Alt ağ kimliğinin değerini ayarlamak için aşağıdaki komutu kullanabilirsiniz:
SUBNETID=$(az network vnet subnet show -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)
Alt ağda zaten var olan UDR'yi kullanmak için giden türü tanımlarsınız. Bu yapılandırma, AKS'nin yük dengeleyici için kurulum ve IP sağlamayı atlamasına olanak tanır.
Önemli
Sınırlamalar dahil giden UDR türü hakkında daha fazla bilgi için bkz . Çıkış giden türü UDR.
İpucu
Küme dağıtımına Özel Küme veya işletim sistemi SKU'su değiştirme gibi ek özellikler eklenebilir.
API sunucusu yetkili IP aralıkları için AKS özelliği, API sunucusu erişimini yalnızca güvenlik duvarının genel uç noktasıyla sınırlamak için eklenebilir. Yetkili IP aralıkları özelliği diyagramda isteğe bağlı olarak belirtilir. API sunucusu erişimini sınırlamak için yetkili IP aralığı özelliğini etkinleştirirken, geliştirici araçlarınız güvenlik duvarının sanal ağından bir sıçrama kutusu kullanmalı veya tüm geliştirici uç noktalarını yetkili IP aralığına eklemelisiniz.
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
Not
Ağ eklentisiyle kubenet
kendi sanal ağınızı ve yönlendirme tablonuzu oluşturmak ve kullanmak için kullanıcı tarafından atanan yönetilen kimliği kullanmanız gerekir. Sistem tarafından atanan yönetilen kimlik için, küme oluşturmadan önce kimlik kimliğini alamayacağız ve bu da rol atamasının etkili olmasına neden olur.
Ağ eklentisiyle azure
kendi sanal ağınızı ve yönlendirme tablonuzu oluşturmak ve kullanmak için hem sistem tarafından atanan hem de kullanıcı tarafından atanan yönetilen kimlikler desteklenir.
API sunucusuna geliştirici erişimini etkinleştirme
Önceki adımda küme için yetkili IP aralıkları kullandıysanız, API sunucusuna oradan erişmek için geliştirici aracı IP adreslerinizi onaylı IP aralıklarının AKS kümesi listesine eklemeniz gerekir. Bir diğer seçenek de Güvenlik Duvarı'nın sanal ağında ayrı bir alt ağ içinde gerekli araçlarla bir sıçrama kutusu yapılandırmaktır.
Aşağıdaki komutla onaylanan aralıklara başka bir IP adresi ekleyin
# 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
Yeni oluşturduğunuz Kubernetes kümenize bağlanacak şekilde yapılandırmak kubectl
için az aks get-credentials komutunu kullanın.
az aks get-credentials -g $RG -n $AKSNAME
Azure Güvenlik Duvarı kullanarak giriş trafiğini kısıtlama
Artık hizmetleri kullanıma sunma ve uygulamaları bu kümeye dağıtmaya başlayabilirsiniz. Bu örnekte bir genel hizmeti kullanıma sunarız, ancak iç yük dengeleyici aracılığıyla bir iç hizmeti kullanıma sunma seçeneğini de belirleyebilirsiniz.
Oluşturulacak tüm kaynakları görmek için AKS Store Tanıtım hızlı başlangıç bildirimini gözden geçirin.
komutunu kullanarak hizmeti dağıtın
kubectl apply
.kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
Azure Güvenlik Duvarı'a DNAT kuralı ekleme
Önemli
Çıkış trafiğini kısıtlamak için Azure Güvenlik Duvarı kullandığınızda ve tüm çıkış trafiğini zorlamak için kullanıcı tanımlı bir yol (UDR) oluşturduğunuzda, giriş trafiğine doğru şekilde izin vermek için Güvenlik Duvarı'nda uygun bir DNAT kuralı oluşturduğunuzdan emin olun. UDR ile Azure Güvenlik Duvarı kullanılması, asimetrik yönlendirme nedeniyle giriş kurulumunu bozar. (AKS alt ağdaki güvenlik duvarının özel IP adresine giden varsayılan bir yol varsa, ancak genel yük dengeleyici - giriş veya Kubernetes hizmeti türü: LoadBalancer) kullanıyorsanız sorun oluşur. Bu durumda, gelen yük dengeleyici trafiği genel IP adresi üzerinden alınır, ancak dönüş yolu güvenlik duvarının özel IP adresinden geçer. Güvenlik duvarı durum bilgisi olduğundan, güvenlik duvarı yerleşik bir oturumun farkında olmadığından geri dönen paketi bırakır. Azure Güvenlik Duvarı giriş veya hizmet yük dengeleyicinizle tümleştirmeyi öğrenmek için bkz. azure Standart Load Balancer ile Azure Güvenlik Duvarı tümleştirme.
Gelen bağlantıyı yapılandırmak için Azure Güvenlik Duvarı bir DNAT kuralı yazılmalıdır. Kümenize bağlantıyı test etmek için, güvenlik duvarı ön uç genel IP adresi için iç hizmet tarafından kullanıma sunulan iç IP'ye yönlendirecek bir kural tanımlanır.
Hedef adres, erişilecek güvenlik duvarındaki bağlantı noktası olduğundan özelleştirilebilir. Çevrilen adres, iç yük dengeleyicinin IP adresi olmalıdır. Çevrilen bağlantı noktası, Kubernetes hizmetiniz için kullanıma sunulan bağlantı noktası olmalıdır.
Kubernetes hizmeti tarafından oluşturulan yük dengeleyiciye atanan iç IP adresini belirtmeniz gerekir. Şu komutunu çalıştırarak adresi alın:
kubectl get services
Gereken IP adresi, aşağıdakine benzer şekilde EXTERNAL-IP sütununda listelenir.
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
Aşağıdakini çalıştırarak hizmet IP'sini alın:
SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
Komutunu çalıştırarak NAT kuralını ekleyin:
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
Bağlantıyı doğrulama
Bağlantıyı doğrulamak için tarayıcıda Azure Güvenlik Duvarı ön uç IP adresine gidin.
AKS mağazası uygulamasını görmeniz gerekir. Bu örnekte Güvenlik Duvarı genel IP'sinin olduğu açıklandı 203.0.113.32
.
Bu sayfada, ürünleri görüntüleyebilir, sepetinize ekleyebilir ve ardından bir sipariş vekleyebilirsiniz.
Kaynakları temizleme
Azure kaynaklarını temizlemek için AKS kaynak grubunu silin.
az group delete -g $RG
Sonraki adımlar
- Azure Kubernetes Service hakkında daha fazla bilgi edinmek için bkz . Azure Kubernetes Service (AKS) için Kubernetes temel kavramları.