Azure Firewall gebruiken om AKS-clusters (Azure Kubernetes Service) te beveiligen
In dit artikel wordt beschreven hoe u AKS-clusters (Azure Kubernetes Service) kunt beveiligen met behulp van Azure Firewall om uitgaand en binnenkomend verkeer te beveiligen.
Achtergrond
Azure Kubernetes Service (AKS) biedt een beheerd Kubernetes-cluster in Azure. Zie Azure Kubernetes Service voor meer informatie.
Ondanks dat AKS een volledig beheerde oplossing is, biedt het geen ingebouwde oplossing om inkomend en uitgaand verkeer tussen het cluster en externe netwerken te beveiligen. Azure Firewall biedt hiervoor een oplossing.
AKS-clusters worden geïmplementeerd in een virtueel netwerk. Dit netwerk kan worden beheerd (gemaakt door AKS) of aangepast (vooraf geconfigureerd door de gebruiker). In beide gevallen heeft het cluster uitgaande afhankelijkheden van services buiten dat virtuele netwerk (de service heeft geen binnenkomende afhankelijkheden). Voor beheer- en operationele doeleinden moeten knooppunten in een AKS-cluster toegang hebben tot bepaalde poorten en FQDN's (Fully Qualified Domain Names) die deze uitgaande afhankelijkheden beschrijven. Dit is vereist voor verschillende functies, waaronder, maar niet beperkt tot, de knooppunten die communiceren met de Kubernetes-API-server. Ze downloaden en installeren kernonderdelen van Kubernetes-cluster en beveiligingsupdates voor knooppunten, of halen installatiekopieën van basissysteemcontainers op uit Microsoft Container Registry (MCR), enzovoort. Deze uitgaande afhankelijkheden zijn bijna volledig gedefinieerd met FQDN's, die geen statische adressen hebben. Het ontbreken van statische adressen betekent dat netwerkbeveiligingsgroepen niet kunnen worden gebruikt om uitgaand verkeer van een AKS-cluster te vergrendelen. Daarom hebben AKS-clusters standaard onbeperkte toegang tot uitgaand (uitgaand) internet. Met dit netwerktoegangsniveau kunnen knooppunten en services die u uitvoert toegang krijgen tot externe resources, indien nodig.
In een productieomgeving moet communicatie met een Kubernetes-cluster echter worden beveiligd om te voorkomen dat gegevens exfiltratie samen met andere beveiligingsproblemen worden voorkomen. Al het binnenkomende en uitgaande netwerkverkeer moet worden bewaakt en beheerd op basis van een set beveiligingsregels. Als u dit wilt doen, moet u uitgaand verkeer beperken, maar een beperkt aantal poorten en adressen moet toegankelijk blijven om goede clusteronderhoudstaken te onderhouden en te voldoen aan deze uitgaande afhankelijkheden die eerder zijn vermeld.
De eenvoudigste oplossing maakt gebruik van een firewallapparaat dat uitgaand verkeer kan beheren op basis van domeinnamen. Een firewall brengt doorgaans een barrière tot stand tussen een vertrouwd netwerk en een niet-vertrouwd netwerk, zoals internet. Azure Firewall kan bijvoorbeeld uitgaand HTTP- en HTTPS-verkeer beperken op basis van de FQDN-naam van de bestemming, zodat u nauwkeurig uitgaand verkeer kunt beheren, maar tegelijkertijd kunt u toegang bieden tot de FQDN's die de uitgaande afhankelijkheden van een AKS-cluster omvatten (iets dat NSG's niet kunnen doen). Op dezelfde manier kunt u inkomend verkeer beheren en de beveiliging verbeteren door filteren op basis van bedreigingsinformatie in te schakelen op een Azure Firewall die is geïmplementeerd in een gedeeld perimeternetwerk. Deze filtering kan waarschuwingen bieden en verkeer naar en van bekende schadelijke IP-adressen en domeinen weigeren.
Bekijk de volgende video voor een kort overzicht van hoe dit werkt in de praktijk in een voorbeeldomgeving:
U kunt een zip-bestand downloaden vanuit het Microsoft Downloadcentrum dat een bash-scriptbestand en een YAML-bestand bevat om automatisch de voorbeeldomgeving te configureren die in de video wordt gebruikt. Azure Firewall wordt geconfigureerd om inkomend en uitgaand verkeer te beveiligen. In de volgende handleidingen wordt elke stap van het script uitgebreider beschreven, zodat u een aangepaste configuratie kunt instellen.
In het volgende diagram ziet u de voorbeeldomgeving uit de video die het script en de handleiding configureren:
Er is één verschil tussen het script en de volgende handleiding. Het script maakt gebruik van beheerde identiteiten, maar in de handleiding wordt een service-principal gebruikt. Hier ziet u twee verschillende manieren om een identiteit te maken voor het beheren en maken van clusterbronnen.
Uitgaand verkeer beperken met behulp van Azure Firewall
Configuratie instellen via omgevingsvariabelen
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
Maak een virtueel netwerk met twee afzonderlijke subnetten, één voor het cluster, één voor de firewall. U kunt er desgewenst ook een maken voor inkomend verkeer van interne services.
Maak een resourcegroep om alle resources op te slaan.
# Create Resource Group
az group create --name $RG --location $LOC
Maak een virtueel netwerk met twee subnetten om het AKS-cluster en de Azure Firewall te hosten. Elk heeft een eigen subnet. Laten we beginnen met het AKS-netwerk.
# 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
Een Azure Firewall maken en instellen met een UDR
Regels voor binnenkomend en uitgaand verkeer van Azure Firewall moeten worden geconfigureerd. Het belangrijkste doel van de firewall is om organisaties in staat te stellen gedetailleerde regels voor inkomend en uitgaand verkeer van en naar het AKS-cluster te configureren.
Belangrijk
Als uw cluster of toepassing een groot aantal uitgaande verbindingen maakt die zijn omgeleid naar dezelfde of kleine subset van bestemmingen, 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 hier voor meer informatie over het maken van een Azure-firewall met meerdere IP-adressen
Maak een standaard-SKU openbare IP-resource die wordt gebruikt als het front-endadres van Azure Firewall.
az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
Registreer de preview cli-extensie om een Azure Firewall te maken.
# 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
Het EERDER gemaakte IP-adres kan nu worden toegewezen aan de front-end van de firewall.
Notitie
Het instellen van het openbare IP-adres naar de Azure Firewall kan enkele minuten duren. Als u de FQDN wilt gebruiken voor netwerkregels, moet de DNS-proxy zijn ingeschakeld. Als de firewall is ingeschakeld, luistert de firewall op poort 53 en worden DNS-aanvragen doorgestuurd naar de DNS-server die u eerder hebt opgegeven. Hierdoor kan de firewall die FQDN automatisch vertalen.
# 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
Wanneer de vorige opdracht is geslaagd, slaat u het front-end-IP-adres van de firewall op voor de configuratie later.
# 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
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 UDR maken met een hop naar Azure Firewall
Azure routeert automatisch verkeer tussen Azure-subnetten, virtuele netwerken en on-premises netwerken. Als u een van de standaardroutering van Azure wilt wijzigen, doet u dit door een routetabel te maken.
Maak een lege routetabel die moet worden gekoppeld aan een bepaald subnet. In de routetabel wordt de volgende hop gedefinieerd als de Azure Firewall die u eerder hebt gemaakt. Elk subnet kan zijn gekoppeld aan geen enkele of één routetabel.
# 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
Zie de documentatie voor routetabellen voor virtuele netwerken over hoe u de standaardsysteemroutes van Azure kunt overschrijven of meer routes kunt toevoegen 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.
U kunt de volgende drie netwerkregels gebruiken om uw firewall te configureren. Mogelijk moet u deze regels aanpassen op basis van uw implementatie. Met de eerste regel is toegang tot poort 9000 via TCP toegestaan. De tweede regel biedt toegang tot poort 1194 en 123 via UDP. Beide regels staan alleen verkeer toe dat is bestemd voor de Azure Region CIDR die we gebruiken, in dit geval VS - oost.
Ten slotte voegen we een derde netwerkregel toe die poort 123 opent naar een FQDN van een internettijdserver (bijvoorbeeld:ntp.ubuntu.com
) via UDP. Het toevoegen van een FQDN als netwerkregel is een van de specifieke functies van Azure Firewall en u moet deze aanpassen wanneer u uw eigen opties gebruikt.
Na het instellen van de netwerkregels voegen we ook een toepassingsregel toe met behulp van de AzureKubernetesService
benodigde FQDN's die toegankelijk zijn via TCP-poort 443 en poort 80. Daarnaast moet u mogelijk meer netwerk- en toepassingsregels configureren op basis van uw implementatie. Zie Regels voor uitgaand netwerk en FQDN voor AKS-clusters (Azure Kubernetes Service) voor meer informatie.
FW-netwerkregels toevoegen
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
FW-toepassingsregels toevoegen
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'
Raadpleeg de documentatie van Azure Firewall voor meer informatie over de Azure Firewall-service.
De routetabel koppelen aan AKS
Als u het cluster aan de firewall wilt koppelen, moet het toegewezen subnet voor het subnet van het cluster verwijzen naar de routetabel die u eerder hebt gemaakt. U kunt een koppeling uitvoeren door een opdracht uit te geven aan het virtuele netwerk met zowel het cluster als de firewall om de routetabel van het subnet van het cluster bij te werken.
# 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
AKS implementeren met uitgaand type UDR in het bestaande netwerk
Nu kan een AKS-cluster worden geïmplementeerd in het bestaande virtuele netwerk. U gebruikt ook uitgaand type userDefinedRouting
, deze functie zorgt ervoor dat uitgaand verkeer wordt gedwongen via de firewall en er geen andere uitgaande paden bestaan (standaard kan het uitgaande type load balancer worden gebruikt).
Het doelsubnet waarmee moet worden geïmplementeerd, wordt gedefinieerd met de omgevingsvariabele. $SUBNETID
In de vorige stappen hebben we de $SUBNETID
variabele niet gedefinieerd. Als u de waarde voor de subnet-id wilt instellen, kunt u de volgende opdracht gebruiken:
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 op het subnet. Met deze configuratie kan AKS de installatie en IP-inrichting voor de load balancer overslaan.
Belangrijk
Zie uitgaand type UDR voor meer informatie over uitgaande type UDR, inclusief beperkingen.
Tip
Aanvullende functies kunnen worden toegevoegd aan de clusterimplementatie, zoals een privécluster of het wijzigen van de SKU van het besturingssysteem.
De AKS-functie voor geautoriseerde IP-adresbereiken van de API-server kan worden toegevoegd om de toegang van de API-server tot alleen het openbare eindpunt van de firewall te beperken. 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 voor ontwikkelaars toevoegen aan het geautoriseerde IP-bereik.
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
Notitie
Als u uw eigen VNet en routetabel met kubenet
de netwerkinvoegtoepassing wilt maken en gebruiken, moet u een door de gebruiker toegewezen beheerde identiteit gebruiken. Voor een door het systeem toegewezen beheerde identiteit kunnen we de id-id niet ophalen voordat we een cluster maken, waardoor een vertraging in de roltoewijzing van kracht wordt.
Voor het maken en gebruiken van uw eigen VNet en routetabel met azure
netwerkinvoegtoepassing worden zowel door het systeem toegewezen als door de gebruiker toegewezen beheerde identiteiten ondersteund.
Ontwikkelaarstoegang tot de API-server inschakelen
Als u geautoriseerde IP-bereiken voor het cluster in de vorige stap hebt gebruikt, moet u de IP-adressen voor ontwikkelaarshulpprogramma's toevoegen aan de AKS-clusterlijst met goedgekeurde IP-bereiken om vanaf daar toegang te krijgen tot de API-server. Een andere optie is het configureren van een jumpbox met de benodigde hulpprogramma's in een afzonderlijk subnet in het virtuele netwerk van de firewall.
Voeg nog een IP-adres toe aan de goedgekeurde bereiken met de volgende opdracht
# 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
Gebruik de opdracht az aks get-credentials om verbinding te maken kubectl
met uw zojuist gemaakte Kubernetes-cluster.
az aks get-credentials -g $RG -n $AKSNAME
Inkomend verkeer beperken met behulp van Azure Firewall
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 u kunt er ook voor kiezen om een interne service beschikbaar te maken via een interne load balancer.
Bekijk het quickstartmanifest AKS Store Demo om alle resources weer te geven die worden gemaakt.
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
Een DNAT-regel toevoegen aan Azure Firewall
Belangrijk
Wanneer u Azure Firewall gebruikt om uitgaand verkeer te beperken en een door de gebruiker gedefinieerde route (UDR) te maken om al het uitgaand verkeer af te dwingen, moet u ervoor zorgen dat u een geschikte DNAT-regel in 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 een DNAT-regel worden geschreven 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 omdat het de poort op de firewall is die moet worden geopend. 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 het interne IP-adres opgeven dat is toegewezen aan de load balancer die is gemaakt door de Kubernetes-service. Haal het adres op door het volgende uit te voeren:
kubectl get services
Het benodigde IP-adres wordt vermeld in de kolom EXTERNAL-IP, vergelijkbaar met de volgende.
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
Haal het IP-adres van de service op door het volgende uit te voeren:
SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
Voeg de NAT-regel toe door het volgende uit te voeren:
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 203.0.113.32
het openbare IP-adres van de firewall.
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.
az group delete -g $RG
Volgende stappen
- Zie Kubernetes Core-concepten voor Azure Kubernetes Service (AKS) voor meer informatie over Azure Kubernetes Service.