Dela via


Använda Azure Firewall för att skydda AKS-kluster (Azure Kubernetes Service)

Den här artikeln visar hur du kan skydda AKS-kluster (Azure Kubernetes Service) med hjälp av Azure Firewall för att skydda utgående och inkommande trafik.

Bakgrund

Azure Kubernetes Service (AKS) erbjuder ett hanterat Kubernetes-kluster i Azure. Mer information finns i Azure Kubernetes Service.

Trots att AKS är en fullständigt hanterad lösning erbjuder den inte någon inbyggd lösning för att skydda inkommande och utgående trafik mellan klustret och externa nätverk. Azure Firewall erbjuder en lösning på detta.

AKS-kluster distribueras i ett virtuellt nätverk. Det här nätverket kan hanteras (skapas av AKS) eller anpassas (förkonfigureras av användaren i förväg). I båda fallen har klustret utgående beroenden på tjänster utanför det virtuella nätverket (tjänsten har inga inkommande beroenden). För hantering och drift behöver noder i ett AKS-kluster komma åt vissa portar och fullständigt kvalificerade domännamn (FQDN) som beskriver dessa utgående beroenden. Detta krävs för olika funktioner, inklusive, men inte begränsat till, noderna som kommunicerar med Kubernetes API-servern. De laddar ned och installerar kubernetes-kärnklusterkomponenter och nodsäkerhetsuppdateringar, eller hämtar grundläggande systemcontaineravbildningar från Microsoft Container Registry (MCR) och så vidare. Dessa utgående beroenden definieras nästan helt med FQDN, som inte har statiska adresser bakom sig. Bristen på statiska adresser innebär att nätverkssäkerhetsgrupper inte kan användas för att låsa utgående trafik från ett AKS-kluster. Därför har AKS-kluster som standard obegränsad utgående (utgående) Internetåtkomst. Med den här nivån av nätverksåtkomst kan noder och tjänster som du kör komma åt externa resurser efter behov.

I en produktionsmiljö bör dock kommunikation med ett Kubernetes-kluster skyddas för att förhindra dataexfiltrering tillsammans med andra säkerhetsrisker. All inkommande och utgående nätverkstrafik måste övervakas och kontrolleras baserat på en uppsättning säkerhetsregler. Om du vill göra detta måste du begränsa utgående trafik, men ett begränsat antal portar och adresser måste vara tillgängliga för att upprätthålla felfria klusterunderhållsuppgifter och uppfylla de utgående beroenden som nämnts tidigare.

Den enklaste lösningen använder en brandväggsenhet som kan styra utgående trafik baserat på domännamn. En brandvägg upprättar vanligtvis en barriär mellan ett betrott nätverk och ett ej betrott nätverk, till exempel Internet. Azure Firewall kan till exempel begränsa utgående HTTP- och HTTPS-trafik baserat på målets fullständiga domännamn, vilket ger dig detaljerad utgående trafikkontroll, men samtidigt kan du ge åtkomst till de FQDN:er som omfattar ett AKS-klusters utgående beroenden (något som NSG:er inte kan göra). På samma sätt kan du styra inkommande trafik och förbättra säkerheten genom att aktivera hotinformationsbaserad filtrering på en Azure Firewall som distribueras till ett delat perimeternätverk. Den här filtreringen kan ge aviseringar och neka trafik till och från kända skadliga IP-adresser och domäner.

I följande video finns en snabb översikt över hur detta fungerar i praktiken i en exempelmiljö:

Du kan ladda ned en zip-fil från Microsoft Download Center som innehåller en bash-skriptfil och en yaml-fil för att automatiskt konfigurera exempelmiljön som används i videon. Den konfigurerar Azure Firewall för att skydda både inkommande och utgående trafik. Följande guider går igenom varje steg i skriptet i detalj så att du kan konfigurera en anpassad konfiguration.

Följande diagram visar exempelmiljön från videon som skriptet och guiden konfigurerar:

Diagram som visar ett K S-kluster med Azure Firewall för inkommande utgående filtrering.

Det finns en skillnad mellan skriptet och följande guide. Skriptet använder hanterade identiteter, men guiden använder tjänstens huvudnamn. Detta visar två olika sätt att skapa en identitet för att hantera och skapa klusterresurser.

Begränsa utgående trafik med Hjälp av Azure Firewall

Ange konfiguration via miljövariabler

Definiera en uppsättning miljövariabler som ska användas i resursskapanden.

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"

Skapa ett virtuellt nätverk med flera undernät

Skapa ett virtuellt nätverk med två separata undernät, ett för klustret, ett för brandväggen. Du kan också skapa en för intern ingress för tjänsten.

Tom nätverkstopologi

Skapa en resursgrupp för att lagra alla resurser.

# Create Resource Group

az group create --name $RG --location $LOC

Skapa ett virtuellt nätverk med två undernät som värd för AKS-klustret och Azure Firewall. Var och en har ett eget undernät. Vi börjar med AKS-nätverket.

# 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

Skapa och konfigurera en Azure Firewall med en UDR

Regler för inkommande och utgående trafik i Azure Firewall måste konfigureras. Huvudsyftet med brandväggen är att göra det möjligt för organisationer att konfigurera detaljerade regler för inkommande och utgående trafik till och från AKS-klustret.

Brandvägg och UDR

Viktigt!

Om klustret eller programmet skapar ett stort antal utgående anslutningar som dirigeras till samma eller en liten delmängd av mål, kan du behöva fler IP-adresser för brandväggsklientdelen för att undvika att maxa portarna per klientdels-IP. Mer information om hur du skapar en Azure-brandvägg med flera IP-adresser finns här

Skapa en offentlig IP-standard-IP-resurs för SKU som används som Azure Firewall-klientdelsadress.

az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"

Registrera cli-extension för förhandsversionen för att skapa en 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-adressen som skapades tidigare kan nu tilldelas till brandväggsklientdelen.

Kommentar

Det kan ta några minuter att konfigurera den offentliga IP-adressen till Azure Firewall. För att utnyttja FQDN på nätverksregler behöver vi DNS-proxy aktiverad, när den är aktiverad lyssnar brandväggen på port 53 och vidarebefordrar DNS-begäranden till den DNS-server som angavs tidigare. Detta gör att brandväggen kan översätta det fullständiga domännamnet automatiskt.

# 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

När föregående kommando har slutförts sparar du ip-adressen för brandväggens klientdel för konfiguration senare.

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

Kommentar

Om du använder säker åtkomst till AKS API-servern med auktoriserade IP-adressintervall måste du lägga till brandväggens offentliga IP-adress i det auktoriserade IP-intervallet.

Skapa en UDR med ett hopp till Azure Firewall

Azure dirigerar automatiskt trafik mellan Azure-undernät, virtuella nätverk och lokala nätverk. Om du vill ändra någon av Azures standardroutning gör du det genom att skapa en routningstabell.

Skapa en tom routningstabell som ska associeras med ett visst undernät. Routningstabellen definierar nästa hopp som Azure Firewall skapade tidigare. Varje undernät kan ha noll eller en associerad routningstabell.

# 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

Se dokumentationen för routningstabellen för virtuella nätverk om hur du kan åsidosätta Azures standardsystemvägar eller lägga till fler vägar i ett undernäts routningstabell.

Lägga till brandväggsregler

Kommentar

För program utanför kube-system- eller gatekeeper-system-namnområden som behöver prata med API-servern krävs en ytterligare nätverksregel för att tillåta TCP-kommunikation till port 443 för API-server-IP förutom att lägga till programregel för fqdn-tag AzureKubernetesService.

Du kan använda följande tre nätverksregler för att konfigurera brandväggen. Du kan behöva anpassa dessa regler baserat på din distribution. Den första regeln tillåter åtkomst till port 9000 via TCP. Den andra regeln tillåter åtkomst till port 1194 och 123 via UDP. Båda dessa regler tillåter endast trafik till Azure Region CIDR som vi använder, i det här fallet USA, östra.

Slutligen lägger vi till en tredje nätverksregel som öppnar port 123 till ett FQDN för Internet-tidsserver (till exempel:ntp.ubuntu.com) via UDP. Att lägga till ett FQDN som en nätverksregel är en av de specifika funktionerna i Azure Firewall, och du måste anpassa det när du använder dina egna alternativ.

När du har angett nätverksreglerna lägger vi också till en programregel med hjälp av AzureKubernetesService den som täcker de nödvändiga FQDN:er som är tillgängliga via TCP-port 443 och port 80. Dessutom kan du behöva konfigurera fler nätverks- och programregler baserat på distributionen. Mer information finns i Utgående nätverk och FQDN-regler för AKS-kluster (Azure Kubernetes Service).

Lägga till FW-nätverksregler

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

Lägga till FW-programregler

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

Mer information om Azure Firewall-tjänsten finns i Dokumentation om Azure Firewall.

Associera routningstabellen med AKS

Om du vill associera klustret med brandväggen måste det dedikerade undernätet för klustrets undernät referera till routningstabellen som skapades tidigare. Association kan göras genom att utfärda ett kommando till det virtuella nätverket som innehåller både klustret och brandväggen för att uppdatera routningstabellen för klustrets undernät.

# 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

Distribuera AKS med utgående typ av UDR till det befintliga nätverket

Nu kan ett AKS-kluster distribueras till det befintliga virtuella nätverket. Du använder också utgående typ userDefinedRouting, den här funktionen säkerställer att all utgående trafik tvingas genom brandväggen och att det inte finns några andra utgående sökvägar (som standard kan utgående lastbalanserare användas).

aks-deploy

Målundernätet som ska distribueras till definieras med miljövariabeln . $SUBNETID Vi definierade inte variabeln $SUBNETID i föregående steg. Om du vill ange värdet för undernäts-ID:t kan du använda följande kommando:

SUBNETID=$(az network vnet subnet show -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)

Du definierar den utgående typen för att använda den UDR som redan finns i undernätet. Med den här konfigurationen kan AKS hoppa över konfigurationen och IP-etableringen för lastbalanseraren.

Viktigt!

Mer information om UDR för utgående typ, inklusive begränsningar, finns i utgående utgående typ UDR.

Dricks

Ytterligare funktioner kan läggas till i klusterdistributionen, till exempel privat kluster eller ändra OS-SKU:n.

AKS-funktionen för API-serverauktoriserade IP-intervall kan läggas till för att begränsa API-serveråtkomsten till endast brandväggens offentliga slutpunkt. Funktionen för auktoriserade IP-intervall anges i diagrammet som valfri. När du aktiverar den auktoriserade IP-intervallfunktionen för att begränsa API-serveråtkomsten måste utvecklarverktygen använda en jumpbox från brandväggens virtuella nätverk eller lägga till alla utvecklarslutpunkter i det auktoriserade IP-intervallet.

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

Kommentar

Om du vill skapa och använda ett eget virtuellt nätverk och en routningstabell med kubenet ett nätverksinsticksprogram måste du använda en användartilldelad hanterad identitet. För en systemtilldelad hanterad identitet kan vi inte hämta identitets-ID:t innan vi skapar klustret, vilket orsakar en fördröjning i att rolltilldelningen börjar gälla.

Både systemtilldelade och användartilldelade hanterade identiteter stöds för att skapa och använda ett eget virtuellt nätverk och en routningstabell med azure nätverksinsticksprogram.

Aktivera utvecklaråtkomst till API-servern

Om du använde auktoriserade IP-intervall för klustret i föregående steg måste du lägga till dina IP-adresser för utvecklarverktyg i AKS-klusterlistan över godkända IP-intervall för att få åtkomst till API-servern därifrån. Ett annat alternativ är att konfigurera en jumpbox med de verktyg som behövs i ett separat undernät i brandväggens virtuella nätverk.

Lägg till ytterligare en IP-adress till de godkända intervallen med följande kommando

# 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

Använd kommandot az aks get-credentials för att konfigurera kubectl för att ansluta till det nyligen skapade Kubernetes-klustret.

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

Begränsa inkommande trafik med hjälp av Azure Firewall

Nu kan du börja exponera tjänster och distribuera program till det här klustret. I det här exemplet exponerar vi en offentlig tjänst, men du kan också välja att exponera en intern tjänst via en intern lastbalanserare.

Public Service DNAT

  1. Granska snabbstartsmanifestet för AKS Store Demo för att se alla resurser som kommer att skapas.

  2. Distribuera tjänsten med hjälp av kubectl apply kommandot .

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
    

Lägga till en DNAT-regel i Azure Firewall

Viktigt!

När du använder Azure Firewall för att begränsa utgående trafik och skapa en användardefinierad väg (UDR) för att tvinga all utgående trafik ska du skapa en lämplig DNAT-regel i brandväggen för att tillåta inkommande trafik korrekt. Användning av Azure Firewall med en UDR bryter ingresskonfigurationen på grund av asymmetrisk routning. (Problemet uppstår om AKS-undernätet har en standardväg som går till brandväggens privata IP-adress, men du använder en offentlig lastbalanserare – ingress eller Kubernetes-tjänst av typen: LoadBalancer). I det här fallet tas den inkommande lastbalanserarens trafik emot via dess offentliga IP-adress, men retursökvägen går igenom brandväggens privata IP-adress. Eftersom brandväggen är tillståndskänslig släpper den det returnerade paketet eftersom brandväggen inte är medveten om en etablerad session. Information om hur du integrerar Azure Firewall med din ingress- eller tjänstlastbalanserare finns i Integrera Azure Firewall med Azure Standard Load Balancer.

För att konfigurera inkommande anslutning måste en DNAT-regel skrivas till Azure Firewall. För att testa anslutningen till klustret definieras en regel för brandväggens offentliga IP-adress på klientdelen för att dirigera till den interna IP-adress som exponeras av den interna tjänsten.

Måladressen kan anpassas eftersom det är porten i brandväggen som ska nås. Den översatta adressen måste vara IP-adressen för den interna lastbalanseraren. Den översatta porten måste vara den exponerade porten för Kubernetes-tjänsten.

Du måste ange den interna IP-adress som tilldelats lastbalanseraren som skapats av Kubernetes-tjänsten. Hämta adressen genom att köra:

kubectl get services

Ip-adressen som behövs visas i kolumnen EXTERNAL-IP, ungefär som följande.

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

Hämta tjänstens IP-adress genom att köra:

SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')

Lägg till NAT-regeln genom att köra:

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

Validera anslutningen

Gå till IP-adressen för Azure Firewall-klientdelen i en webbläsare för att verifiera anslutningen.

Du bör se AKS Store-appen. I det här exemplet var 203.0.113.32brandväggens offentliga IP-adress .

Skärmbild som visar Azure Store Front App som öppnats i en lokal webbläsare.

På den här sidan kan du visa produkter, lägga till dem i kundvagnen och sedan göra en beställning.

Rensa resurser

Om du vill rensa Azure-resurser tar du bort AKS-resursgruppen.

az group delete -g $RG

Nästa steg