Omezení síťového provozu pomocí služby Azure Firewall ve službě Azure Kubernetes Service (AKS)

Naučte se používat pravidla odchozí sítě a plně kvalifikovaného názvu domény pro clustery AKS k řízení odchozího provozu pomocí služby Azure Firewall v AKS. Kvůli zjednodušení této konfigurace poskytuje Azure Firewall značku plně kvalifikovaného názvu domény (AzureKubernetesServiceFQDN) služby Azure Kubernetes Service, která omezuje odchozí provoz z clusteru AKS. Tento článek ukazuje, jak nakonfigurovat pravidla provozu clusteru AKS prostřednictvím brány firewall Azure.

Poznámka:

Značka plně kvalifikovaného názvu domény obsahuje všechny plně kvalifikované názvy domén uvedené v pravidlech odchozí sítě a plně kvalifikovaného názvu domény pro clustery AKS a automaticky se aktualizuje.

V produkčních scénářích doporučujeme mít minimálně 20 IP adres front-endu ve službě Azure Firewall, abyste se vyhnuli problémům s vyčerpáním portů SNAT.

Následující informace poskytují ukázkovou architekturu nasazení:

Uzamčená topologie

  • Veřejný příchozí přenos dat je vynucený k toku přes filtry brány firewall.
    • Uzly agenta AKS jsou izolované ve vyhrazené podsíti.
    • Azure Firewall je nasazený ve vlastní podsíti.
    • Pravidlo DNAT přeloží veřejnou IP adresu brány firewall do front-endové IP adresy nástroje pro vyrovnávání zatížení.
  • Odchozí požadavky začínají z uzlů agenta na interní IP adresu služby Azure Firewall pomocí trasy definované uživatelem (UDR).
    • Požadavky z uzlů agenta AKS se řídí trasou definovanou uživatelem umístěnou v podsíti, do které byl cluster AKS nasazen.
    • Výchozí přenos dat služby Azure Firewall z front-endu veřejné IP adresy
    • Přístup k veřejnému internetu nebo jiným službám Azure proudí do a z IP adresy front-endu brány firewall.
    • Přístup k řídicí rovině AKS může být chráněný rozsahy IP adres autorizovaných serverem rozhraní API, včetně veřejné IP adresy front-endu brány firewall.
  • Interní provoz
    • Pro interní provoz můžete použít interní nástroj pro vyrovnávání zatížení, který byste mohli izolovat ve vlastní podsíti místo veřejného nástroje pro vyrovnávání zatížení nebo vedle něj.

Konfigurace 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

Zřiďte virtuální síť se dvěma samostatnými podsítěmi: jednu pro cluster a druhou pro bránu firewall. Volitelně můžete vytvořit interní příchozí přenos dat služby.

Prázdná síťová topologie

  1. Pomocí příkazu vytvořte skupinu az group create prostředků.

    az group create --name $RG --location $LOC
    
  2. Vytvořte virtuální síť se dvěma podsítěmi pro hostování clusteru AKS a brány Azure Firewall pomocí az network vnet create příkazů a az network vnet subnet create příkazů.

    # 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 can't 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

Musíte nakonfigurovat příchozí a odchozí pravidla služby Azure Firewall. 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 počtu portů na ip adresu front-endu.

Další informace o tom, jak vytvořit bránu Azure Firewall s více IP adresami, najdete v tématu Vytvoření brány Azure Firewall s několika veřejnými IP adresami pomocí bicep.

Brána firewall a trasy definované uživatelem

  1. Pomocí příkazu vytvořte standardní prostředek veřejné IP adresy skladové az network public-ip create položky. Tento prostředek se použije jako front-endová adresa služby Azure Firewall.

    az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
    
  2. Zaregistrujte rozšíření Rozhraní příkazového řádku služby Azure Firewall, abyste pomocí příkazu vytvořili bránu az extension add Azure Firewall.

    az extension add --name azure-firewall
    
  3. Vytvořte bránu Azure Firewall a povolte proxy DNS pomocí az network firewall create příkazu a nastavte hodnotu .< a1true/--enable-dns-proxy>.

    az network firewall create -g $RG -n $FWNAME -l $LOC --enable-dns-proxy true
    

Nastavení veřejné IP adresy pro službu Azure Firewall může trvat několik minut. Jakmile bude ip adresa vytvořená dříve, můžete ji přiřadit front-endu brány firewall.

Poznámka:

K využití plně kvalifikovaného názvu domény v pravidlech sítě potřebujeme povolený proxy server DNS. Pokud je povolený proxy server DNS, brána firewall naslouchá na portu 53 a předává požadavky DNS na server DNS uvedený výše. To umožňuje bráně firewall automaticky přeložit plně kvalifikovaný název domény.

  1. Pomocí příkazu vytvořte konfiguraci az network firewall ip-config create PROTOKOLU IP služby Azure Firewall.

    az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  2. Jakmile předchozí příkaz proběhne úspěšně, uložte ip adresu front-endu brány firewall pro pozdější konfiguraci.

    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 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, můžete vytvořit směrovací tabulku.

Důležité

Odchozí typ trasy definované uživatelem (userDefinedRouting) vyžaduje trasu pro směrovací tabulku 0.0.0.0/0 a cíl dalšího segmentu směrování síťového virtuálního zařízení. Směrovací tabulka už má výchozí hodnotu 0.0.0.0/0 na internet. Bez veřejné IP adresy, kterou Má Azure používat pro překlad zdrojových síťových adres (SNAT), jednoduše přidáním této trasy nebudete poskytovat odchozí připojení k internetu. AKS ověří, že nevytvoříte trasu 0.0.0.0/0 směřující na internet, ale místo brány, síťového virtuálního zařízení atd. Pokud používáte odchozí typ trasy definované uživatelem, veřejná IP adresa nástroje pro vyrovnávání zatížení pro příchozí požadavky se nevytvořila, pokud nenakonfigurujete službu nástroje pro vyrovnávání zatížení typu. AKS nikdy nevytváří veřejnou IP adresu pro odchozí požadavky , pokud nastavíte odchozí typ trasy definované uživatelem. Další informace najdete v tématu Odchozí pravidla pro Azure Load Balancer.

  1. Pomocí příkazu vytvořte prázdnou směrovací tabulku, která se má přidružit k dané podsíti az network route-table create . Směrovací tabulka definuje další segment směrování jako výše vytvořenou bránu Azure Firewall. Každá podsíť může mít přidruženou žádnou nebo jednu směrovací tabulku.

    az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
    
  2. Pomocí příkazu vytvořte trasy v směrovací tabulce pro podsítě az network route-table route create .

    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
    

Informace o přepsání výchozích systémových tras Azure nebo přidání dalších tras do směrovací tabulky podsítě najdete v dokumentaci ke směrovací tabulce virtuální sí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, kromě přidání pravidla aplikace pro fqdn-tag AzureKubernetesService .

Tato část se věnuje třem síťovým pravidlům a pravidlu aplikace, které můžete použít ke konfiguraci brány firewall. Tato pravidla možná budete muset přizpůsobit na základě nasazení.

  • První pravidlo sítě umožňuje přístup k portu 9000 přes protokol TCP.
  • Druhé pravidlo sítě umožňuje přístup k portu 1194 a 123 přes UDP. Pokud nasazujete do Microsoft Azure provozovaného společností 21Vianet, podívejte se na pravidla sítě provozované společností 21Vianet. Obě tato pravidla umožní provoz určený pouze do CIDR oblasti Azure v tomto článku, což je USA – východ.
  • Třetí síťové pravidlo otevře port 123 pro ntp.ubuntu.com plně kvalifikovaný název domény 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, takže ho budete muset přizpůsobit při používání vlastních možností.
  • Čtvrtá a pátá pravidla sítě umožňují přístup k vyžádání kontejnerů z GitHub Container Registry (ghcr.io) a Docker Hubu (docker.io).
  1. Vytvořte pravidla sítě pomocí az network firewall network-rule create příkazu.

    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
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'ghcr' --protocols 'TCP' --source-addresses '*' --destination-fqdns ghcr.io pkg-containers.githubusercontent.com --destination-ports '443'
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'docker' --protocols 'TCP' --source-addresses '*' --destination-fqdns docker.io registry-1.docker.io production.cloudflare.docker.com --destination-ports '443'
    
  2. Vytvořte pravidlo aplikace pomocí az network firewall application-rule create příkazu.

    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 směrovací tabulku vytvořenou výše. az network vnet subnet update Pomocí příkazu přidružte směrovací tabulku k AKS.

az network vnet subnet update -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME

Nasazení clusteru AKS, který se řídí vašimi odchozími pravidly

Teď můžete nasadit cluster AKS do existující virtuální sítě. Použijete odchozí typ, který zajistí, že veškerý odchozí provoz bude vynucen přes bránu userDefinedRouting firewall a nebudou existovat žádné jiné cesty pro odchozí přenosy. Typ loadBalancer odchozích přenosů lze použít také.

aks-deploy

Cílová podsíť, do které se má nasadit, je definována s proměnnou prostředí . $SUBNETID Pomocí následujícího příkazu nastavte hodnotu ID podsítě:

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žní AKS přeskočit nastavení a zřizování IP adres pro nástroj pro vyrovnávání zatížení.

Tip

Do nasazení clusteru můžete přidat další funkce, například privátní clustery.

Můžete přidat funkci AKS pro rozsahy IP adres autorizovaných serverem rozhraní API, abyste omezili přístup k serveru API jenom na veřejný koncový bod brány firewall. Funkce autorizovaných rozsahů IP adres je v diagramu označená jako volitelná. Když 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.


Poznámka:

AKS vytvoří identitu kubeletu přiřazenou systémem ve skupině prostředků uzlu, pokud nezadáte vlastní spravovanou identitu kubeletu.

Pro uživatelem definované směrování podporuje identita přiřazená systémem pouze síťový modul plug-in CNI.

Pomocí příkazu vytvořte cluster AKS pomocí spravované identity přiřazené systémem pomocí síťového modulu plug-in az aks create CNI.

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

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 váš cluster, musíte přidat IP adresy nástrojů pro vývojáře do seznamu schválených rozsahů IP adres clusteru AKS, abyste odtud měli přístup k serveru rozhraní API. Můžete také nakonfigurovat jumpbox s potřebnými nástroji uvnitř samostatné podsítě ve virtuální síti brány firewall.

  1. Pomocí následujícího příkazu načtěte svoji IP adresu:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. Přidejte IP adresu do schválených rozsahů pomocí az aks update příkazu.

    az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. Nakonfigurujte kubectl připojení ke clusteru AKS pomocí az aks get-credentials příkazu.

    az aks get-credentials -g $RG -n $AKSNAME
    

Nasazení veřejné služby v AKS

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 také chtít zpřístupnit interní službu pomocí 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
    

Povolení příchozího provozu přes Azure Firewall

Důležité

Pokud 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 ve službě Azure Firewall vytvoříte odpovídající pravidlo DNAT, které správně povolí příchozí přenos dat. 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íte napsat pravidlo DNAT 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. 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 také zadat interní IP adresu přiřazenou nástroji pro vyrovnávání zatížení vytvořené službou Kubernetes.

  1. Pomocí příkazu získejte interní IP adresu přiřazenou nástroji pro vyrovnávání kubectl get services zatížení.

    kubectl get services
    

    IP adresa bude uvedená ve EXTERNAL-IP sloupci, jak je znázorněno v následujícím příkladu výstupu:

    NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)              AGE
    kubernetes        ClusterIP      10.0.0.1       <none>        443/TCP              9m10s
    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
    store-front       LoadBalancer   10.0.89.139    20.39.18.6    80:32271/TCP         10s
    
  2. Pomocí příkazu získejte IP kubectl get svc voting-app adresu služby.

    SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. Přidejte pravidlo překladu adres (NAT) az network firewall nat-rule create pomocí 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 52.253.228.132veř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 pomocí az group delete příkazu.

az group delete -g $RG

Další kroky

V tomto článku jste zjistili, jak zabezpečit odchozí provoz pomocí služby Azure Firewall. V případě potřeby můžete výše uvedené kroky zobecnit a směrovat provoz do upřednostňovaného řešení odchozího přenosu dat podle dokumentace k userDefinedRoute typu odchozích přenosů.