Sdílet prostřednictvím


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:

Diagram znázorňující cluster A K S se službou Azure Firewall pro filtrování výchozího přenosu dat

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.

Prázdná síťová topologie

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.

Brána firewall a trasy definované uživatelem

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)


# 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

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

# set fw application rule to allow kubernettes 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' 

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

aks-deploy

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

DNAT veřejné služby

  1. Projděte si manifest rychlého startu pro AKS Store a podívejte se na všechny prostředky, které se vytvoří.

  2. 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.32veřejná IP adresa brány firewall .

Snímek obrazovky znázorňující aplikaci Front App pro Azure Store otevřenou v místním prohlížeči

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