Controllare il traffico in uscita per un'istanza di Azure Spring Apps

Nota

I piani Basic, Standard ed Enterprise saranno deprecati a partire dalla metà di marzo 2025, con un periodo di ritiro di 3 anni. È consigliabile eseguire la transizione ad App Azure Container. Per altre informazioni, vedere l'annuncio di ritiro di Azure Spring Apps.

Il piano Standard a consumo e dedicato sarà deprecato a partire dal 30 settembre 2024, con un arresto completo dopo sei mesi. È consigliabile eseguire la transizione ad App Azure Container. Per altre informazioni, vedere Eseguire la migrazione del consumo di Azure Spring Apps Standard e del piano dedicato alle app Azure Container.

Questo articolo si applica a: ✔️ Java ✔️ C#

Questo articolo si applica a: ✔️ Basic/Standard ✔️ Enterprise

Questo articolo descrive come proteggere il traffico in uscita dalle applicazioni ospitate in Azure Spring Apps. L'articolo fornisce un esempio di route definita dall'utente. Una route definita dall'utente è una funzionalità avanzata che consente di controllare completamente il traffico in uscita. È possibile usare una route definita dall'utente in scenari come non consentire un indirizzo IP pubblico generato automaticamente da Azure Spring Apps.

Prerequisiti

Creare una rete virtuale usando una route definita dall'utente

La figura seguente illustra un esempio di una rete virtuale di Azure Spring Apps che usa una route definita dall'utente .

Diagramma che mostra l'architettura di una rete virtuale di Azure Spring Apps che usa una route definita dall'utente.

Questo diagramma illustra le funzionalità seguenti dell'architettura:

  • Il traffico in ingresso pubblico deve fluire attraverso i filtri firewall.
  • Ogni istanza di Azure Spring Apps è isolata all'interno di una subnet dedicata.
  • I clienti possiedono e gestiscono il firewall.
  • Questa struttura garantisce che il firewall consenta un ambiente integro per tutte le funzioni necessarie.
  • Azure Spring Apps non genera automaticamente risorse IP pubbliche.

Definire le variabili di ambiente

L'esempio seguente illustra come definire un set di variabili di ambiente da usare nella creazione di risorse:

export PREFIX="asa-egress"
export RG="${PREFIX}-rg"
export LOC="eastus"
export ASANAME="${PREFIX}"
export VNET_NAME="${PREFIX}-vnet"
export ASA_APP_SUBNET_NAME="asa-app-subnet"
export ASA_SERVICE_RUNTIME_SUBNET_NAME="asa-service-runtime-subnet"
# Do not change FWSUBNET_NAME. This is currently a requirement for Azure Firewall.
export FWSUBNET_NAME="AzureFirewallSubnet"
export FWNAME="${PREFIX}-fw"
export FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
export FWIPCONFIG_NAME="${PREFIX}-fwconfig"
export APP_ROUTE_TABLE_NAME="${PREFIX}-app-rt"
export SERVICE_RUNTIME_ROUTE_TABLE_NAME="${PREFIX}-service-runtime-rt"
export FWROUTE_NAME="${PREFIX}-fwrn"
export ASA_NAME="${PREFIX}-instance"

Creare una rete virtuale con più subnet

Questa sezione illustra come effettuare il provisioning di una rete virtuale con tre subnet separate: una per le app utente, una per il runtime del servizio e una per il firewall.

Creare prima di tutto un gruppo di risorse, come illustrato nell'esempio seguente:

# Create a resource group.

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

Creare quindi una rete virtuale con tre subnet per ospitare le istanze di Azure Spring Apps e Firewall di Azure, come illustrato nell'esempio seguente:

# Dedicated virtual network with an Azure Spring Apps app subnet.

az network vnet create \
    --resource-group $RG \
    --name $VNET_NAME \
    --location $LOC \
    --address-prefixes 10.42.0.0/16 \
    --subnet-name $ASA_APP_SUBNET_NAME \
    --subnet-prefix 10.42.1.0/24

# Dedicated subnet for the Azure Spring Apps service runtime subnet.

az network vnet subnet create \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_SERVICE_RUNTIME_SUBNET_NAME\
    --address-prefix 10.42.2.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.3.0/24

Configurare un'istanza di Firewall di Azure con una route definita dall'utente

Usare il comando seguente per creare e configurare un'istanza di Firewall di Azure con una route definita dall'utente e per configurare Firewall di Azure regole in uscita. Il firewall consente di configurare regole di traffico in uscita granulari da Azure Spring Apps.

Importante

Se il cluster o l'applicazione crea un numero elevato di connessioni in uscita dirette alla stessa destinazione o a un piccolo subset di destinazioni, potrebbero essere necessari più indirizzi IP front-end firewall per evitare di raggiungere le porte massime per ogni indirizzo IP front-end. Per altre informazioni su come creare un'istanza di Firewall di Azure con più indirizzi IP, vedere Avvio rapido: Creare un'istanza di Firewall di Azure con più indirizzi IP pubblici - modello di Resource Manager. Creare una risorsa IP pubblico SKU Standard da usare come indirizzo front-end Firewall di Azure.

az network public-ip create \
    --resource-group $RG \
    --name $FWPUBLICIP_NAME -l $LOC \
    --sku "Standard"

L'esempio seguente illustra come installare l'estensione dell'interfaccia della riga di comando di anteprima Firewall di Azure e distribuire Firewall di Azure:

# Install the Azure Firewall preview CLI extension.

az extension add --name azure-firewall

# Deploy Azure Firewall.

az network firewall create \
    --resource-group $RG \
    --name $FWNAME -l $LOC \
    --enable-dns-proxy true

Nell'esempio seguente viene illustrato come assegnare l'indirizzo IP creato al front-end del firewall.

Nota

La configurazione dell'indirizzo IP pubblico nell'istanza di Firewall di Azure potrebbe richiedere alcuni minuti. Per usare un nome di dominio completo (FQDN) nelle regole di rete, abilitare un proxy DNS. Dopo aver abilitato il proxy, il firewall è in ascolto sulla porta 53 e inoltra le richieste DNS al server DNS specificato. Il firewall può quindi convertire automaticamente il nome di dominio completo.

# Configure the firewall IP address.

az network firewall ip-config create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --name $FWIPCONFIG_NAME \
    --public-ip-address $FWPUBLICIP_NAME \
    --vnet-name $VNET_NAME

Al termine dell'operazione, salvare l'indirizzo IP front-end del firewall per la configurazione in un secondo momento, come illustrato nell'esempio seguente:

# Capture the firewall IP address for later use.

export FWPUBLIC_IP=$(az network public-ip show \
    --resource-group $RG \
    --name $FWPUBLICIP_NAME \
    --query "ipAddress" \
    --output tsv)
export FWPRIVATE_IP=$(az network firewall show \
    --resource-group $RG \
    --name $FWNAME \
    --query "ipConfigurations[0].privateIPAddress" \
    --output tsv | tr -d '[:space:]')

Creare una route definita dall'utente con un hop da Firewall di Azure

Azure effettua il routing automatico del traffico tra subnet di Azure, reti virtuali e reti locali. Se si vuole modificare il routing predefinito in Azure, creare una tabella di route.

Nell'esempio seguente viene illustrato come creare una tabella di route da associare a una subnet specificata. La tabella di route definisce l'hop successivo, come nell'istanza di Firewall di Azure creata. A ogni subnet può essere associata una tabella di route oppure non è associata alcuna tabella di route.

# Create a user-defined route and add a route for Azure Firewall.

az network route-table create \
    --resource-group $RG -l $LOC \
    --name $APP_ROUTE_TABLE_NAME
az network route-table route create \
    --resource-group $RG \
    --name $FWROUTE_NAME \
    --route-table-name $APP_ROUTE_TABLE_NAME \
    --address-prefix 0.0.0.0/0 \
    --next-hop-type VirtualAppliance \
    --next-hop-ip-address $FWPRIVATE_IP
az network route-table create \
    --resource-group $RG -l $LOC \
    --name $SERVICE_RUNTIME_ROUTE_TABLE_NAME
az network route-table route create \
    --resource-group $RG \
    --name $FWROUTE_NAME \
    --route-table-name $SERVICE_RUNTIME_ROUTE_TABLE_NAME \
    --address-prefix 0.0.0.0/0 \
    --next-hop-type VirtualAppliance \
    --next-hop-ip-address $FWPRIVATE_IP

Aggiungere regole di firewall

Nell'esempio seguente viene illustrato come aggiungere regole al firewall. Per altre informazioni, vedere Responsabilità dei clienti per l'esecuzione di Azure Spring App in una rete virtuale.

# Add firewall network rules.

az network firewall network-rule create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --collection-name 'asafwnr' \
    --name 'springcloudtcp' \
    --protocols 'TCP' \
    --source-addresses '*' \
    --destination-addresses "AzureCloud" \
    --destination-ports 443 445 \
    --action allow \
    --priority 100

# Add firewall application rules.

az network firewall application-rule create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --collection-name 'aksfwar'\
    --name 'fqdn' \
    --source-addresses '*' \
    --protocols 'https=443' \
    --fqdn-tags "AzureKubernetesService" \
    --action allow \
    --priority 100

Associare tabelle di route alle subnet

Per associare il cluster al firewall, assicurarsi che la subnet dedicata per il cluster faccia riferimento alla tabella di route creata. Le subnet di runtime dell'app e del servizio devono essere associate alle tabelle di route corrispondenti. L'esempio seguente illustra come associare una tabella di route a una subnet:

# Associate the route table with a next hop to the firewall for the Azure Spring Apps subnet.

az network vnet subnet update \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_APP_SUBNET_NAME \
    --route-table $APP_ROUTE_TABLE_NAME

az network vnet subnet update
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_SERVICE_RUNTIME_SUBNET_NAME \
    --route-table $SERVICE_RUNTIME_ROUTE_TABLE_NAME

Aggiungere un ruolo per un provider di risorse di Azure Spring Apps

L'esempio seguente illustra come aggiungere un ruolo per il provider di risorse di Azure Spring Apps. Il ruolo viene assegnato a tutti gli utenti identificati dalla stringa e8de9221-a19c-4c81-b814-fd37c6caf9d2:

export VIRTUAL_NETWORK_RESOURCE_ID=$(az network vnet show \
    --name $VNET_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${VIRTUAL_NETWORK_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

export APP_ROUTE_TABLE_RESOURCE_ID=$(az network route-table show \
    --name $APP_ROUTE_TABLE_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${APP_ROUTE_TABLE_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

export SERVICE_RUNTIME_ROUTE_TABLE_RESOURCE_ID=$(az network route-table show \
    --name $SERVICE_RUNTIME_ROUTE_TABLE_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${SERVICE_RUNTIME_ROUTE_TABLE_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

Creare un'istanza di Azure Spring Apps con routing definito dall'utente

L'esempio seguente illustra come creare un'istanza di Azure Spring Apps con routing definito dall'utente:

az spring create \
    --name $ASA_NAME \
    --resource-group $RG \
    --vnet $VNET_NAME \
    --app-subnet $ASA_APP_SUBNET_NAME \
    --service-runtime-subnet $ASA_SERVICE_RUNTIME_SUBNET_NAME \
    --outbound-type userDefinedRouting

È ora possibile accedere all'indirizzo IP pubblico del firewall da Internet. Il firewall instrada il traffico alle subnet di Azure Spring Apps in base alle regole di routing.

Passaggi successivi