Esercizio - Limitare l'accesso all'ambiente App contenitore di Azure

Completato

In questa unità, si verifica che il database PostgreSQL sia accessibile solo all'applicazione Quarkus e non ad 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 delle App contenitore di Azure 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 il comando seguente:

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, il database può essere consultato al di fuori dell'ambiente.

Rimuovere la regola del firewall permissiva

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

È possibile elencare le regole del firewall esistenti eseguendo il comando seguente:

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_2023-1-3_10-20-4  rgazure-deploy-quarkus  0.0.0.0

Si noti che l'intervallo di indirizzi IP consentiti è compreso tra 0.0.0.0 e 255.255.255.255. Una regola del firewall di questo tipo consente a qualsiasi client di accedere al database. Per garantire che solo l'applicazione Quarkus possa accedere al database, è necessario aggiornare le regole del firewall del server PostgreSQL. In questo caso, si tratta solo di rimuovere la regola pubblica. Per rimuoverla, 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 una query sul database usando 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

Infine, la chiamata raggiungere il timeout. Verrà visualizzato il messaggio seguente:

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

Poiché sono state rimosse tutte le regole del firewall, ora 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 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 il comando seguente:

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 di start-ip-address e di end-ip-address su 0.0.0.0 consente l'accesso da tutti gli indirizzi IP interni di Azure, ma non dagli 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 avere esito negativo:

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 tenta di usare il comando seguente per recuperare le attività dal database tramite l'applicazione Quarkus in esecuzione nelle App contenitore, il tentativo ha esito positivo:

curl https://$AZ_APP_URL/api/todos

Questo comando restituisce l'elenco di tutte le attività del database. È possibile accedere al server PostgreSQL dall'applicazione Quarkus in esecuzione in un servizio di Azure, ma non è possibile accedervi dall'esterno di Azure.