Esercizio - Limitare l'accesso all'ambiente app Azure Container

Completato

In questa unità si garantisce che il database PostgreSQL sia accessibile solo dall'applicazione Quarkus e non da altri client esterni. È attualmente possibile accedere al database da qualsiasi client usando l'interfaccia della riga di comando di Azure ed eseguendo Quarkus in locale. Questa configurazione non è sicura. È necessario aggiungere una regola del firewall per consentire solo agli indirizzi IP all'interno dell'ambiente App Azure Container di accedere al server di database.

Accedere al server PostgreSQL usando l'interfaccia della riga di comando

Assicurarsi prima di tutto di poter accedere al server PostgreSQL usando l'interfaccia della riga di comando di Azure. A tale scopo, eseguire questo comando:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

Dovrebbe essere possibile visualizzare il contenuto del database. Se è possibile, è possibile accedere al database all'esterno dell'ambiente.

Rimuovere la regola del firewall permissiva

Database di Azure per PostgreSQL offre la sicurezza per impostazione predefinita. Il firewall in genere non consente le connessioni in ingresso. Tuttavia, quando è stato creato il server PostgreSQL, è stato specificato il parametro --public-access "All" per abilitare l'accesso esterno, che ha configurato il firewall per l'apertura al pubblico.

È possibile elencare le regole del firewall esistenti eseguendo questo comando:

az postgres flexible-server firewall-rule list \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --output table

Verrà visualizzato l'output seguente:

EndIpAddress     Name                         ResourceGroup           StartIpAddress
---------------  ---------------------------  ----------------------  ----------------
255.255.255.255  AllowAll_2025-2-26_16-57-40  rgazure-deploy-quarkus  0.0.0.0

Si noti che l'intervallo di indirizzi IP consentiti viene 0.0.0.0 tramite 255.255.255.255. Una regola del firewall in questo modo consente a qualsiasi client di accedere al database. Per assicurarsi che solo l'applicazione Quarkus possa accedere al database, è necessario aggiornare le regole del firewall del server PostgreSQL. In questo caso, è solo una questione di rimozione della regola pubblica. Per rimuoverlo, eseguire il comando seguente:

az postgres flexible-server firewall-rule delete \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --rule-name <name of the AllowAll firewall rule> \
    --yes

Provare ora a eseguire query sul database eseguendo un'istruzione SQL dall'interfaccia della riga di comando:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

Alla fine si verifica il timeout della chiamata. Verrà visualizzato questo messaggio:

Unable to connect to flexible server: connection to server failed: Operation timed out

Poiché sono state rimosse tutte le regole del firewall, anche l'applicazione Quarkus non può accedere al database. Se si tenta di recuperare le attività dal database, la richiesta ha esito negativo. Eseguire la richiesta cURL seguente:

curl https://$AZ_APP_URL/api/todos

Aggiungere una nuova regola del firewall

È necessario configurare il firewall per consentire l'accesso solo all'applicazione Quarkus. È necessario aggiungere una nuova regola del firewall. Per aggiungere la regola, eseguire questo comando:

az postgres flexible-server firewall-rule create \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --rule-name "Allow_Azure-internal-IP-addresses" \
    --start-ip-address "0.0.0.0" \
    --end-ip-address "0.0.0.0"

L'impostazione del start-ip-address e del end-ip-address su 0.0.0.0 consente l'accesso da tutti gli indirizzi IP interni di Azure, ma non consente l'accesso da indirizzi IP esterni. Questa procedura consente di proteggere il database dall'accesso esterno.

Se si tenta di accedere al database dall'interfaccia della riga di comando eseguendo il comando seguente, il tentativo dovrebbe non riuscire:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

Tuttavia, se si prova a usare il comando seguente per recuperare le attività dal database tramite l'applicazione Quarkus in esecuzione in App contenitore, il tentativo ha esito positivo:

curl https://$AZ_APP_URL/api/todos

Questo comando restituisce l'elenco di tutti gli elementi to-do dal database. È possibile accedere al server PostgreSQL dall'applicazione Quarkus in esecuzione in un servizio di Azure, ma non è possibile accedervi dall'esterno di Azure.