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:

Giriş çıkış filtrelemesi için Azure Güvenlik Duvarı olan A K S kümesini gösteren diyagram.

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.

Boş ağ topolojisi

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.

Güvenlik Duvarı ve UDR

Ö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ü userDefinedRoutingde 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).

aks-deploy

Dağıtılacak hedef alt ağ, ortam değişkeniyle $SUBNETIDtanı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.

Kamu Hizmeti DNAT

  1. Oluşturulacak tüm kaynakları görmek için AKS Store Tanıtım hızlı başlangıç bildirimini gözden geçirin.

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

Yerel tarayıcıda açılan Azure Store Ön Uygulamasını gösteren ekran görüntüsü.

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