Použití služby Azure Firewall k ochraně clusterů Azure Kubernetes Service (AKS)
Tento článek ukazuje, jak můžete chránit clustery Azure Kubernetes Service (AKS) pomocí služby Azure Firewall k zabezpečení odchozího a příchozího provozu.
Pozadí
Azure Kubernetes Service (AKS) nabízí spravovaný cluster Kubernetes v Azure. Další informace najdete v tématu Azure Kubernetes Service.
I když je AKS plně spravované řešení, nenabízí integrované řešení pro zabezpečení příchozího a výchozího provozu mezi clusterem a externími sítěmi. Azure Firewall nabízí řešení.
Clustery AKS se nasazují ve virtuální síti. Tuto síť je možné spravovat (vytvořit pomocí AKS) nebo vlastní (předem nakonfigurovanou uživatelem). V obou případech má cluster odchozí závislosti na službách mimo danou virtuální síť (služba nemá žádné příchozí závislosti). Pro účely správy a provozu musí uzly v clusteru AKS přistupovat k určitým portům a plně kvalifikovaným názvům domén (FQDN), které popisují tyto odchozí závislosti. To se vyžaduje pro různé funkce, mimo jiné i uzly, které komunikují se serverem rozhraní API Kubernetes. Stáhnou a nainstalují základní komponenty clusteru Kubernetes a aktualizace zabezpečení uzlů nebo vyžádají image základního systémového kontejneru ze služby Microsoft Container Registry (MCR) atd. Tyto odchozí závislosti jsou téměř zcela definovány plně kvalifikovanými názvy domén, které za sebou nemají statické adresy. Nedostatek statických adres znamená, že skupiny zabezpečení sítě se nedají použít k uzamčení odchozího provozu z clusteru AKS. Z tohoto důvodu mají clustery AKS ve výchozím nastavení neomezený odchozí (výchozí) internetový přístup. Tato úroveň síťového přístupu umožňuje uzlům a službám, které spouštíte, přistupovat k externím prostředkům podle potřeby.
V produkčním prostředí by ale měla být komunikace s clusterem Kubernetes chráněná, aby se zabránilo exfiltraci dat spolu s dalšími ohroženími zabezpečení. Veškerý příchozí a odchozí síťový provoz musí být monitorován a řízen na základě sady pravidel zabezpečení. Pokud to chcete udělat, musíte omezit odchozí provoz, ale omezený počet portů a adres musí zůstat přístupný, aby se zachovaly úlohy údržby clusteru v pořádku a splňovaly tyto odchozí závislosti, které jste zmínili dříve.
Nejjednodušší řešení používá zařízení brány firewall, které může řídit odchozí provoz na základě názvů domén. Brána firewall obvykle vytváří bariéru mezi důvěryhodnou sítí a nedůvěryhodnou sítí, například internetem. Azure Firewall může například omezit odchozí provoz HTTP a HTTPS na základě plně kvalifikovaného názvu domény cíle, což vám umožňuje jemně odstupňované řízení odchozího provozu, ale zároveň umožňuje poskytnout přístup k plně kvalifikovaným názvům domén zahrnujícím odchozí závislosti clusteru AKS (něco, co skupiny zabezpečení sítě nedělají). Podobně můžete řídit příchozí provoz a zlepšit zabezpečení tím, že povolíte filtrování na základě analýzy hrozeb na bráně Azure Firewall nasazené ve sdílené hraniční síti. Toto filtrování může poskytovat výstrahy a odepřít provoz do známých škodlivých IP adres a domén a z těchto domén.
V následujícím videu najdete rychlý přehled toho, jak to funguje v praxi v ukázkovém prostředí:
Soubor ZIP si můžete stáhnout z webu Microsoft Download Center , který obsahuje soubor skriptu Bash a soubor yaml, aby se automaticky nakonfiguruje ukázkové prostředí použité ve videu. Nakonfiguruje službu Azure Firewall tak, aby chránila příchozí i výchozí provoz. Následující příručky vás provedou jednotlivými kroky skriptu podrobněji, abyste mohli nastavit vlastní konfiguraci.
Následující diagram znázorňuje ukázkové prostředí z videa, které skript a průvodce konfiguruje:
Mezi skriptem a následující příručkou je jeden rozdíl. Skript používá spravované identity, ale průvodce používá instanční objekt. To ukazuje dva různé způsoby, jak vytvořit identitu pro správu a vytváření prostředků clusteru.
Omezení odchozího provozu pomocí služby Azure Firewall
Nastavení konfigurace pomocí proměnných prostředí
Definujte sadu proměnných prostředí, které se mají použít při vytváření prostředků.
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"
Vytvoření virtuální sítě s několika podsítěmi
Vytvořte virtuální síť se dvěma samostatnými podsítěmi, jednu pro cluster, jednu pro bránu firewall. Volitelně můžete také vytvořit interní příchozí přenos dat služby.
Vytvořte skupinu prostředků, která bude obsahovat všechny prostředky.
# Create Resource Group
az group create --name $RG --location $LOC
Vytvořte virtuální síť se dvěma podsítěmi pro hostování clusteru AKS a brány Azure Firewall. Každý má vlastní podsíť. Začněme sítí 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
Vytvoření a nastavení služby Azure Firewall s trasou definovanou uživatelem
Příchozí a odchozí pravidla služby Azure Firewall musí být nakonfigurovaná. Hlavním účelem brány firewall je umožnit organizacím konfigurovat podrobná pravidla příchozího a výchozího přenosu dat do clusteru AKS a z clusteru AKS.
Důležité
Pokud váš cluster nebo aplikace vytvoří velký počet odchozích připojení směrovaných na stejnou nebo malou podmnožinu cílů, můžete vyžadovat další IP adresy front-endu brány firewall, abyste se vyhnuli maximálnímu využití portů na ip adresu front-endu. Další informace o tom, jak vytvořit bránu Firewall Azure s několika IP adresami, najdete tady.
Vytvořte standardní prostředek veřejné IP adresy skladové položky, který se používá jako front-endová adresa služby Azure Firewall.
az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
Zaregistrujte rozšíření cli-preview a vytvořte bránu 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
IP adresu vytvořenou dříve je teď možné přiřadit front-endu brány firewall.
Poznámka:
Nastavení veřejné IP adresy pro službu Azure Firewall může trvat několik minut. K využití plně kvalifikovaného názvu domény v pravidlech sítě potřebujeme povolený proxy server DNS, pokud je tato brána firewall povolená, naslouchá na portu 53 a bude předávat požadavky DNS na server DNS zadaný dříve. Tím umožníte bráně firewall automaticky přeložit tento plně kvalifikovaný název domény.
# 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
Po úspěšném provedení předchozího příkazu uložte IP adresu front-endu brány firewall pro pozdější konfiguraci.
# 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)
Poznámka:
Pokud používáte zabezpečený přístup k serveru rozhraní API AKS s autorizovanými rozsahy IP adres, musíte přidat veřejnou IP adresu brány firewall do autorizovaného rozsahu IP adres.
Vytvoření trasy definované uživatelem s segmentem směrování do služby Azure Firewall
Azure automaticky směruje provoz mezi podsítěmi Azure, virtuálními sítěmi a místními sítěmi. Pokud chcete změnit výchozí směrování Azure, provedete to vytvořením směrovací tabulky.
Vytvořte prázdnou směrovací tabulku, která se má přidružit k dané podsíti. Směrovací tabulka definuje další segment směrování jako dříve vytvořenou bránu Azure Firewall. Každá podsíť může mít přidruženou žádnou nebo jednu směrovací tabulku.
# 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
Přečtěte si dokumentaci ke směrovací tabulce virtuální sítě o tom, jak můžete přepsat výchozí systémové trasy Azure nebo přidat další trasy do směrovací tabulky podsítě.
Přidání pravidel brány firewall
Poznámka:
Pro aplikace mimo obory názvů kube-system nebo gatekeeper-system, které potřebují komunikovat se serverem rozhraní API, je vyžadováno další pravidlo sítě, které povoluje komunikaci TCP na port 443 pro IP adresu serveru rozhraní API, a také přidání pravidla aplikace pro fqdn-tag AzureKubernetesService.
Ke konfiguraci brány firewall můžete použít následující tři pravidla sítě. Tato pravidla možná budete muset přizpůsobit na základě nasazení. První pravidlo umožňuje přístup k portu 9000 přes protokol TCP. Druhé pravidlo umožňuje přístup k portu 1194 a 123 přes UDP. Obě tato pravidla umožňují provoz určený pouze do CIDR oblasti Azure, kterou používáme, v tomto případě USA – východ.
Nakonec přidáme třetí pravidlo sítě, které otevírá port 123, do plně kvalifikovaného názvu domény internetového časového serveru (například:ntp.ubuntu.com
) přes UDP. Přidání plně kvalifikovaného názvu domény jako pravidla sítě je jednou z konkrétních funkcí služby Azure Firewall a při použití vlastních možností ho musíte přizpůsobit.
Po nastavení pravidel sítě přidáme také pravidlo aplikace, AzureKubernetesService
které pokrývá potřebné plně kvalifikované názvy domén přístupné přes port TCP 443 a port 80. Kromě toho může být potřeba nakonfigurovat více pravidel sítě a aplikací na základě vašeho nasazení. Další informace najdete v tématu Odchozí síť a pravidla plně kvalifikovaného názvu domény pro clustery Azure Kubernetes Service (AKS).
Přidání pravidel sítě 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
Přidání pravidel aplikace 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
Další informace o službě Azure Firewall najdete v dokumentaci ke službě Azure Firewall.
Přidružení směrovací tabulky k AKS
Pokud chcete cluster přidružit k bráně firewall, musí vyhrazená podsíť pro podsíť clusteru odkazovat na dříve vytvořenou směrovací tabulku. Přidružení je možné provést tak, že ve virtuální síti podsíti clusteru i brány firewall vydáte příkaz, který aktualizuje směrovací tabulku podsítě clusteru.
# 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
Nasazení AKS s odchozím typem trasy definované uživatelem do existující sítě
Teď je možné cluster AKS nasadit do existující virtuální sítě. Používáte také odchozí typ userDefinedRouting
, tato funkce zajišťuje, že veškerý odchozí provoz je vynucený přes bránu firewall a neexistují žádné jiné cesty výchozího přenosu dat (ve výchozím nastavení je možné použít odchozí typ Load Balanceru).
Cílová podsíť, do které se má nasadit, je definována s proměnnou prostředí . $SUBNETID
Proměnnou $SUBNETID
jsme nedefinovali v předchozích krocích. K nastavení hodnoty ID podsítě můžete použít následující příkaz:
SUBNETID=$(az network vnet subnet show -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)
Definujete odchozí typ pro použití trasy definované uživatelem, který už v podsíti existuje. Tato konfigurace umožňuje AKS přeskočit nastavení a zřizování IP adres pro nástroj pro vyrovnávání zatížení.
Důležité
Další informace o trasy definovaném uživatelem odchozího typu včetně omezení najdete v tématu odchozí odchozí typ trasy definované uživatelem.
Tip
Do nasazení clusteru, jako je privátní cluster nebo změna skladové položky operačního systému, je možné přidat další funkce.
Funkci AKS pro rozsahy IP adres autorizovaných serverem rozhraní API je možné přidat, aby se omezil přístup serveru API jenom k veřejnému koncovému bodu brány firewall. Funkce autorizovaných rozsahů IP adres je v diagramu označená jako volitelná. Pokud povolíte funkci autorizovaného rozsahu IP adres k omezení přístupu k serveru API, musí vývojářské nástroje používat jumpbox z virtuální sítě brány firewall nebo musíte přidat všechny koncové body pro vývojáře do autorizovaného rozsahu IP adres.
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
Poznámka:
Pokud chcete vytvořit a používat vlastní virtuální síť a směrovací tabulku se síťovým modulem kubenet
plug-in, musíte použít spravovanou identitu přiřazenou uživatelem. U spravované identity přiřazené systémem nemůžeme před vytvořením clusteru získat ID identity, což způsobuje zpoždění přiřazení role, které se projeví.
Pokud chcete vytvořit a používat vlastní virtuální síť a směrovací tabulku se síťovým modulem azure
plug-in, podporují se spravované identity přiřazené systémem i spravované identity přiřazené uživatelem.
Povolení přístupu pro vývojáře k serveru rozhraní API
Pokud jste v předchozím kroku použili autorizované rozsahy IP adres pro cluster, musíte přidat IP adresy nástrojů pro vývojáře do seznamu schválených rozsahů IP adres a získat tak přístup k serveru rozhraní API. Další možností je nakonfigurovat jumpbox s potřebnými nástroji uvnitř samostatné podsítě ve virtuální síti brány firewall.
Přidejte další IP adresu do schválených rozsahů pomocí následujícího příkazu.
# 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
Pomocí příkazu az aks get-credentials nakonfigurujte kubectl
připojení k nově vytvořenému clusteru Kubernetes.
az aks get-credentials -g $RG -n $AKSNAME
Omezení příchozího přenosu dat pomocí služby Azure Firewall
Teď můžete začít vytvářet služby a nasazovat aplikace do tohoto clusteru. V tomto příkladu zveřejníme veřejnou službu, ale můžete se také rozhodnout pro zveřejnění interní služby prostřednictvím interního nástroje pro vyrovnávání zatížení.
Projděte si manifest rychlého startu pro AKS Store a podívejte se na všechny prostředky, které se vytvoří.
Nasaďte službu pomocí
kubectl apply
příkazu.kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
Přidání pravidla DNAT do služby Azure Firewall
Důležité
Když pomocí služby Azure Firewall omezíte odchozí provoz a vytvoříte trasu definovanou uživatelem, která vynutí veškerý odchozí provoz, ujistěte se, že v bráně firewall vytvoříte odpovídající pravidlo DNAT, které správně povolí příchozí provoz. Použití služby Azure Firewall s trasou definovanou uživatelem přeruší nastavení příchozího přenosu dat kvůli asymetrickému směrování. (K tomuto problému dochází, pokud má podsíť AKS výchozí trasu, která přejde na privátní IP adresu brány firewall, ale používáte veřejný nástroj pro vyrovnávání zatížení – příchozí přenos dat nebo službu Kubernetes typu: LoadBalancer). V tomto případě se příchozí provoz nástroje pro vyrovnávání zatížení přijímá prostřednictvím své veřejné IP adresy, ale zpáteční cesta prochází privátní IP adresou brány firewall. Vzhledem k tomu, že je brána firewall stavová, zahodí vrácený paket, protože brána firewall neví o vytvořené relaci. Informace o integraci služby Azure Firewall s příchozím přenosem dat nebo nástrojem pro vyrovnávání zatížení služby najdete v tématu Integrace služby Azure Firewall se službou Azure Standard Load Balancer.
Pokud chcete nakonfigurovat příchozí připojení, musí být pravidlo DNAT zapsáno do služby Azure Firewall. K otestování připojení ke clusteru se definuje pravidlo pro front-endovou veřejnou IP adresu brány firewall, která bude směrovat na interní IP adresu vystavenou interní službou.
Cílovou adresu je možné přizpůsobit, protože se jedná o port brány firewall, ke které se má přistupovat. Přeložená adresa musí být IP adresa interního nástroje pro vyrovnávání zatížení. Přeložený port musí být vystavený port pro vaši službu Kubernetes.
Musíte zadat interní IP adresu přiřazenou nástroji pro vyrovnávání zatížení vytvořené službou Kubernetes. Načtěte adresu spuštěním příkazu:
kubectl get services
Potřebná IP adresa je uvedená ve sloupci EXTERNAL-IP, podobně jako v následujícím příkladu.
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
Spuštěním následujícího příkazu získejte IP adresu služby:
SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
Přidejte pravidlo překladu adres (NAT) spuštěním příkazu:
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
Ověření možností připojení
V prohlížeči přejděte na front-endovou IP adresu služby Azure Firewall a ověřte připojení.
Měla by se zobrazit aplikace AKS Store. V tomto příkladu byla 203.0.113.32
veřejná IP adresa brány firewall .
Na této stránce můžete zobrazit produkty, přidat je do košíku a pak zadat objednávku.
Vyčištění prostředků
Pokud chcete vyčistit prostředky Azure, odstraňte skupinu prostředků AKS.
az group delete -g $RG
Další kroky
- Další informace o službě Azure Kubernetes Service najdete v základních konceptech Kubernetes pro Službu Azure Kubernetes Service (AKS).