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:
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.
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.
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).
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.
Granska snabbstartsmanifestet för AKS Store Demo för att se alla resurser som kommer att skapas.
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.32
brandväggens offentliga IP-adress .
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
- Läs mer om Azure Kubernetes Service i Kubernetes core concepts for Azure Kubernetes Service (AKS).