Netwerkverkeer beperken met Azure Firewall in Azure Kubernetes Service (AKS)

Meer informatie over het gebruik van de regels voor uitgaand netwerk en FQDN voor AKS-clusters om uitgaand verkeer te beheren met behulp van de Azure Firewall in AKS. Ter vereenvoudiging van deze configuratie biedt Azure Firewall een FQDN-tag (Fully Qualified Domain Name) van Azure Kubernetes Service (AzureKubernetesService) waarmee uitgaand verkeer van het AKS-cluster wordt beperkt. In dit artikel wordt beschreven hoe u verkeersregels voor uw AKS-cluster kunt configureren via Azure Firewall.

Notitie

De FQDN-tag bevat alle FQDN's die worden vermeld in regels voor uitgaand netwerk en FQDN voor AKS-clusters en wordt automatisch bijgewerkt.

Voor productiescenario's raden we u aan minimaal 20 front-end-IP's op de Azure Firewall te hebben om uitputtingsproblemen met SNAT-poorten te voorkomen.

De volgende informatie bevat een voorbeeldarchitectuur van de implementatie:

Vergrendelde topologie

  • Openbaar inkomend verkeer wordt gedwongen om door firewallfilters te stromen
    • AKS-agentknooppunten worden geïsoleerd in een toegewezen subnet
    • Azure Firewall wordt geïmplementeerd in een eigen subnet
    • Met een DNAT-regel wordt het openbare IP-adres van de firewall omgezet in het front-end-IP van de load balancer
  • Uitgaande aanvragen beginnen van agentknooppunten naar het interne IP-adres van Azure Firewall met behulp van een door de gebruiker gedefinieerde route (UDR)
    • Aanvragen van AKS-agentknooppunten volgen een UDR die is geplaatst op het subnet waarnaar het AKS-cluster is geïmplementeerd
    • Azure Firewall gaat uit van het virtuele netwerk vanuit een openbare IP-front-end
    • Toegang tot het openbare internet of andere Azure-services stromen van en naar het front-end-IP-adres van de firewall
    • Toegang tot het AKS-besturingsvlak kan worden beveiligd door geautoriseerde IP-bereiken van de API-server, waaronder het openbare FRONT-end-IP-adres van de firewall
  • Intern verkeer

Omgevingsvariabelen configureren

Definieer een set omgevingsvariabelen die moeten worden gebruikt bij het maken van resources.

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"

Een virtueel netwerk met meerdere subnetten maken

Richt een virtueel netwerk in met twee afzonderlijke subnetten: één voor het cluster en één voor de firewall. U kunt er desgewenst een maken voor inkomend verkeer van interne services.

Lege netwerktopologie

  1. Maak een resourcegroep met behulp van de az group create opdracht.

    az group create --name $RG --location $LOC
    
  2. Maak een virtueel netwerk met twee subnetten om het AKS-cluster en de Azure Firewall te hosten met behulp van de az network vnet create en az network vnet subnet create opdrachten.

    # 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
    

Een Azure Firewall maken en instellen

U moet binnenkomende en uitgaande regels voor Azure Firewall configureren. Het belangrijkste doel van de firewall is om organisaties in staat te stellen gedetailleerde regels voor inkomend en uitgaand verkeer naar en uit het AKS-cluster te configureren.

Belangrijk

Als uw cluster of toepassing een groot aantal uitgaande verbindingen naar dezelfde of een kleine subset van bestemmingen maakt, hebt u mogelijk meer front-end-IP-adressen van de firewall nodig om te voorkomen dat de poorten per front-end-IP worden beperkt.

Zie Een Azure Firewall maken met meerdere openbare IP-adressen met bicep voor meer informatie over het maken van een Azure-firewall met meerdere ip-adressen.

Firewall en UDR

  1. Maak een openbare IP-standaard-SKU-resource met behulp van de az network public-ip create opdracht. Deze resource wordt gebruikt als het front-endadres van Azure Firewall.

    az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
    
  2. Registreer de Azure Firewall CLI-extensie om een Azure Firewall te maken met behulp van de az extension add opdracht.

    az extension add --name azure-firewall
    
  3. Maak een Azure Firewall en schakel DNS-proxy in met behulp van de az network firewall create opdracht en stel het in --enable-dns-proxy op true.

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

Het instellen van het openbare IP-adres naar de Azure Firewall kan enkele minuten duren. Zodra het adres gereed is, kan het EERDER gemaakte IP-adres worden toegewezen aan de front-end van de firewall.

Notitie

Als u FQDN wilt gebruiken voor netwerkregels, moet dns-proxy zijn ingeschakeld. Wanneer de DNS-proxy is ingeschakeld, luistert de firewall op poort 53 en stuurt de DNS-aanvragen door naar de hierboven opgegeven DNS-server. Hierdoor kan de firewall de FQDN automatisch vertalen.

  1. Maak een IP-configuratie van Azure Firewall met behulp van de az network firewall ip-config create opdracht.

    az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  2. Zodra de vorige opdracht is geslaagd, slaat u het front-end-IP-adres van de firewall op voor de configuratie later.

    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)
    

Notitie

Als u beveiligde toegang gebruikt tot de AKS-API-server met geautoriseerde IP-adresbereiken, moet u het openbare IP-adres van de firewall toevoegen aan het geautoriseerde IP-bereik.

Een route maken met een hop naar Azure Firewall

Azure routeert automatisch verkeer tussen Azure-subnetten, virtuele netwerken en on-premises netwerken. Als u de standaardroutering van Azure wilt wijzigen, kunt u een routetabel maken.

Belangrijk

Uitgaand type UDR (userDefinedRouting) vereist een route voor 0.0.0.0/0 en een volgende hopbestemming van NVA in de routetabel. De routetabel heeft al een standaardwaarde 0.0.0.0/0 op internet. Zonder een openbaar IP-adres dat Azure kan gebruiken voor SNAT (Source Network Address Translation), biedt het toevoegen van deze route geen uitgaande internetverbinding. AKS valideert dat u geen route 0.0.0.0/0 maakt die verwijst naar internet, maar in plaats daarvan naar een gateway, NVA, enzovoort. Wanneer u een uitgaand type UDR gebruikt, wordt een openbaar IP-adres van een load balancer voor binnenkomende aanvragen niet gemaakt, tenzij u een service van het type loadbalancer configureert. AKS maakt nooit een openbaar IP-adres voor uitgaande aanvragen als u een uitgaand type UDR instelt. Zie Uitgaande regels voor Azure Load Balancer voor meer informatie.

  1. Maak een lege routetabel die moet worden gekoppeld aan een bepaald subnet met behulp van de az network route-table create opdracht. In de routetabel wordt de volgende hop gedefinieerd als de Hierboven gemaakte Azure Firewall. Elk subnet kan zijn gekoppeld aan geen enkele of één routetabel.

    az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
    
  2. Maak routes in de routetabel voor de subnetten met behulp van de az network route-table route create opdracht.

    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
    

Zie de documentatie voor de routetabel van het virtuele netwerk voor informatie over het overschrijven van de standaardsysteemroutes van Azure of het toevoegen van extra routes aan de routetabel van een subnet.

Firewallregels toevoegen

Notitie

Voor toepassingen buiten de kube-system- of gatekeeper-system-naamruimten die met de API-server moeten communiceren, is een extra netwerkregel vereist om TCP-communicatie met poort 443 toe te staan voor het IP-adres van de API-server, naast het toevoegen van een toepassingsregel voor fqdn-tag AzureKubernetesService .

In deze sectie worden drie netwerkregels en een toepassingsregel beschreven die u kunt gebruiken voor het configureren van uw firewall. Mogelijk moet u deze regels aanpassen op basis van uw implementatie.

  • De eerste netwerkregel biedt toegang tot poort 9000 via TCP.
  • De tweede netwerkregel biedt toegang tot poort 1194 en 123 via UDP. Als u implementeert in Microsoft Azure beheerd door 21Vianet, raadpleegt u de vereiste netwerkregels voor Azure die worden beheerd door 21Vianet. Beide regels staan alleen verkeer toe dat is bestemd voor de AZURE-regio-CIDR in dit artikel, namelijk VS - oost.
  • De derde netwerkregel opent poort 123 naar ntp.ubuntu.com FQDN via UDP. Het toevoegen van een FQDN als netwerkregel is een van de specifieke functies van Azure Firewall. U moet deze dus aanpassen wanneer u uw eigen opties gebruikt.
  • De vierde en vijfde netwerkregels bieden toegang tot pull-containers uit GitHub Container Registry (ghcr.io) en Docker Hub (docker.io).
  1. Maak de netwerkregels met behulp van de az network firewall network-rule create opdracht.

    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. Maak de toepassingsregel met behulp van de az network firewall application-rule create opdracht.

    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
    

Raadpleeg de documentatie van Azure Firewall voor meer informatie over Azure Firewall.

De routetabel koppelen aan AKS

Als u het cluster wilt koppelen aan de firewall, moet het toegewezen subnet voor het subnet van het cluster verwijzen naar de hierboven gemaakte routetabel. Gebruik de az network vnet subnet update opdracht om de routetabel aan AKS te koppelen.

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

Een AKS-cluster implementeren dat volgt op uw uitgaande regels

U kunt nu een AKS-cluster implementeren in het bestaande virtuele netwerk. U gebruikt het userDefinedRouting uitgaande type, dat ervoor zorgt dat uitgaand verkeer wordt gedwongen via de firewall en dat er geen andere uitgaande paden bestaan. Het loadBalancer uitgaande type kan ook worden gebruikt.

aks-deploy

Het doelsubnet waarmee moet worden geïmplementeerd, wordt gedefinieerd met de omgevingsvariabele. $SUBNETID Stel de waarde voor de subnet-id in met behulp van de volgende opdracht:

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

U definieert het uitgaande type voor het gebruik van de UDR die al bestaat in het subnet. Met deze configuratie kan AKS de installatie en IP-inrichting voor de load balancer overslaan.

Tip

U kunt extra functies toevoegen aan de clusterimplementatie, zoals privéclusters.

U kunt de AKS-functie voor geautoriseerde IP-adresbereiken van de API-server toevoegen om de toegang tot de API-server te beperken tot alleen het openbare eindpunt van de firewall. De functie geautoriseerde IP-bereiken wordt in het diagram aangeduid als optioneel. Wanneer u de functie geautoriseerd IP-bereik inschakelt om de toegang tot DE API-server te beperken, moeten uw ontwikkelhulpprogramma's een jumpbox van het virtuele netwerk van de firewall gebruiken of moet u alle eindpunten van ontwikkelaars toevoegen aan het geautoriseerde IP-bereik.


Notitie

AKS maakt een door het systeem toegewezen kubelet-identiteit in de knooppuntresourcegroep als u uw eigen door kubelet beheerde identiteit niet opgeeft.

Voor door de gebruiker gedefinieerde routering ondersteunt door het systeem toegewezen identiteit alleen de CNI-netwerkinvoegtoepassing.

Maak een AKS-cluster met behulp van een door het systeem toegewezen beheerde identiteit met de CNI-netwerkinvoegtoepassing met behulp van de az aks create opdracht.

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

Ontwikkelaarstoegang tot de API-server inschakelen

Als u in de vorige stap geautoriseerde IP-bereiken voor uw cluster hebt gebruikt, moet u de IP-adressen voor ontwikkelaarshulpprogramma's toevoegen aan de AKS-clusterlijst met goedgekeurde IP-bereiken, zodat u vanaf daar toegang hebt tot de API-server. U kunt ook een jumpbox configureren met de benodigde hulpprogramma's in een afzonderlijk subnet in het virtuele netwerk van de firewall.

  1. Haal uw IP-adres op met behulp van de volgende opdracht:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. Voeg het IP-adres toe aan de goedgekeurde bereiken met behulp van de az aks update opdracht.

    az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. Configureer kubectl deze om verbinding te maken met uw AKS-cluster met behulp van de az aks get-credentials opdracht.

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

Een openbare service implementeren in AKS

U kunt nu beginnen met het beschikbaar maken van services en het implementeren van toepassingen in dit cluster. In dit voorbeeld maken we een openbare service beschikbaar, maar mogelijk wilt u ook een interne service beschikbaar maken met behulp van een interne load balancer.

DNAT van openbare dienst

  1. Bekijk het quickstartmanifest AKS Store Demo om alle resources weer te geven die worden gemaakt.

  2. Implementeer de service met behulp van de kubectl apply opdracht.

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

Binnenkomend verkeer via Azure Firewall toestaan

Belangrijk

Wanneer u Azure Firewall gebruikt om uitgaand verkeer te beperken en een UDR te maken om al het uitgaand verkeer af te dwingen, moet u ervoor zorgen dat u een geschikte DNAT-regel in Azure Firewall maakt om inkomend verkeer correct toe te staan. Als u Azure Firewall met een UDR gebruikt, wordt de installatie van inkomend verkeer verbroken vanwege asymmetrische routering. Het probleem treedt op als het AKS-subnet een standaardroute heeft die naar het privé-IP-adres van de firewall gaat, maar u een openbare load balancer gebruikt: inkomend verkeer of kubernetes-service van het type loadBalancer. In dit geval wordt het binnenkomende load balancer-verkeer ontvangen via het openbare IP-adres, maar het retourpad gaat via het privé-IP-adres van de firewall. Omdat de firewall stateful is, wordt het geretourneerde pakket verwijderd omdat de firewall niet op de hoogte is van een bestaande sessie. Zie Azure Firewall integreren met Azure Standard Load Balancer voor meer informatie over het integreren van Azure Firewall met uw inkomend verkeer of service load balancer.

Als u binnenkomende connectiviteit wilt configureren, moet u een DNAT-regel schrijven naar de Azure Firewall. Als u de connectiviteit met uw cluster wilt testen, wordt er een regel gedefinieerd voor het openbare IP-adres van de firewall om te routeren naar het interne IP-adres dat wordt weergegeven door de interne service. Het doeladres kan worden aangepast. Het vertaalde adres moet het IP-adres van de interne load balancer zijn. De vertaalde poort moet de weergegeven poort voor uw Kubernetes-service zijn. U moet ook het interne IP-adres opgeven dat is toegewezen aan de load balancer die is gemaakt door de Kubernetes-service.

  1. Haal het interne IP-adres op dat aan de load balancer is toegewezen met behulp van de kubectl get services opdracht.

    kubectl get services
    

    Het IP-adres wordt weergegeven in de EXTERNAL-IP kolom, zoals wordt weergegeven in de volgende voorbeelduitvoer:

    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. Haal het IP-adres van de service op met behulp van de kubectl get svc voting-app opdracht.

    SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. Voeg de NAT-regel toe met behulp van de az network firewall nat-rule create opdracht.

    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
    

Connectiviteit valideren

Navigeer naar het front-end-IP-adres van de Azure Firewall in een browser om de connectiviteit te valideren.

U ziet nu de AKS Store-app. In dit voorbeeld was 52.253.228.132het openbare IP-adres van de firewall.

Schermopname van de Azure Store Front-app die is geopend in een lokale browser.

Op deze pagina kunt u producten bekijken, toevoegen aan uw winkelwagen en vervolgens een bestelling plaatsen.

Resources opschonen

Als u Azure-resources wilt opschonen, verwijdert u de AKS-resourcegroep met behulp van de az group delete opdracht.

az group delete -g $RG

Volgende stappen

In dit artikel hebt u geleerd hoe u uw uitgaande verkeer kunt beveiligen met behulp van Azure Firewall. Indien nodig kunt u de bovenstaande stappen generaliseren om het verkeer door te sturen naar uw voorkeursoplossing voor uitgaand verkeer volgens de documentatie van het uitgaande typeuserDefinedRoute.