Eseguire la migrazione di un'applicazione per usare connessioni senza password con Database di Azure per MySQL

Questo articolo illustra come eseguire la migrazione da metodi di autenticazione tradizionali a connessioni senza password più sicure con Database di Azure per MySQL.

Le richieste dell'applicazione a Database di Azure per MySQL devono essere autenticate. Database di Azure per MySQL offre diversi modi per consentire alle app di connettersi in modo sicuro. Uno dei modi consiste nell'usare le password. Tuttavia, è consigliabile assegnare priorità alle connessioni senza password nelle applicazioni, quando possibile.

Confrontare le opzioni di autenticazione

Quando l'applicazione esegue l'autenticazione con Database di Azure per MySQL, fornisce una coppia nome utente e password per connettersi al database. A seconda della posizione in cui sono archiviate le identità, esistono due tipi di autenticazione: autenticazione di Microsoft Entra e autenticazione MySQL.

Autenticazione Microsoft Entra

L'autenticazione di Microsoft Entra è un meccanismo per la connessione a Database di Azure per MySQL usando le identità definite in Microsoft Entra ID. Con l'autenticazione di Microsoft Entra, è possibile gestire le identità utente del database e altre servizi Microsoft in una posizione centrale, semplificando la gestione delle autorizzazioni.

L'uso di Microsoft Entra ID per l'autenticazione offre i vantaggi seguenti:

  • Autenticazione degli utenti nei servizi di Azure in modo uniforme.
  • Gestione dei criteri password e della rotazione delle password in un'unica posizione.
  • Più forme di autenticazione supportate da Microsoft Entra ID, che possono eliminare la necessità di archiviare le password.
  • I clienti possono gestire le autorizzazioni del database usando gruppi esterni (Microsoft Entra ID).
  • L'autenticazione di Microsoft Entra usa gli utenti del database MySQL per autenticare le identità a livello di database.
  • Supporto dell'autenticazione basata su token per le applicazioni che si connettono a Database di Azure per MySQL.

Autenticazione mySQL

È possibile creare account in MySQL. Se si sceglie di usare le password come credenziali per gli account, queste credenziali verranno archiviate nella user tabella. Poiché queste password vengono archiviate in MySQL, è necessario gestire manualmente la rotazione delle password.

Anche se è possibile connettersi a Database di Azure per MySQL con le password, è consigliabile usarle con cautela. È necessario essere diligenti per non esporre mai le password in una posizione non sicura. Chiunque possa accedere alle password è in grado di eseguire l'autenticazione. Ad esempio, esiste il rischio che un utente malintenzionato possa accedere all'applicazione se un stringa di connessione viene accidentalmente archiviato nel controllo del codice sorgente, inviato tramite un messaggio di posta elettronica non sicuro, incollato nella chat sbagliata o visualizzato da un utente che non deve avere l'autorizzazione. Prendere invece in considerazione l'aggiornamento dell'applicazione per usare connessioni senza password.

Introduzione alle connessioni senza password

Con una connessione senza password, è possibile connettersi ai servizi di Azure senza archiviare credenziali nel codice dell'applicazione, nei relativi file di configurazione o nelle variabili di ambiente.

Molti servizi di Azure supportano connessioni senza password, ad esempio tramite Identità gestita di Azure. Queste tecniche forniscono funzionalità di sicurezza affidabili che è possibile implementare usando DefaultAzureCredential dalle librerie client di Identità di Azure. In questa esercitazione si apprenderà come aggiornare un'applicazione esistente da usare DefaultAzureCredential invece di alternative, ad esempio stringa di connessione.

DefaultAzureCredential supporta più metodi di autenticazione e determina automaticamente quali devono essere usati in fase di esecuzione. Questo approccio consente all'app di usare metodi di autenticazione diversi in ambienti diversi (sviluppo locale e produzione) senza implementare codice specifico dell'ambiente.

L'ordine e le posizioni in cui DefaultAzureCredential cercare le credenziali sono disponibili nella panoramica della libreria di identità di Azure. Ad esempio, quando si lavora in locale, DefaultAzureCredential in genere si esegue l'autenticazione usando l'account usato dallo sviluppatore per accedere a Visual Studio. Quando l'app viene distribuita in Azure, DefaultAzureCredential passerà automaticamente all'uso di un'identità gestita. Per questa transizione non sono necessarie modifiche al codice.

Per garantire che le connessioni siano senza password, è necessario prendere in considerazione sia lo sviluppo locale che l'ambiente di produzione. Se una stringa di connessione è necessaria in entrambe le posizioni, l'applicazione non è senza password.

Nell'ambiente di sviluppo locale è possibile eseguire l'autenticazione con l'interfaccia della riga di comando di Azure, Azure PowerShell, Visual Studio o plug-in di Azure per Visual Studio Code o IntelliJ. In questo caso, è possibile usare tali credenziali nell'applicazione anziché configurare le proprietà.

Quando si distribuiscono applicazioni in un ambiente di hosting di Azure, ad esempio una macchina virtuale, è possibile assegnare un'identità gestita in tale ambiente. Non sarà quindi necessario fornire le credenziali per connettersi ai servizi di Azure.

Nota

Un'identità gestita fornisce un'identità di sicurezza per rappresentare un'app o un servizio. L'identità viene gestita dalla piattaforma Azure e non è necessario eseguire il provisioning o ruotare alcun segreto. Per altre informazioni sulle identità gestite, vedere la documentazione di panoramica .

Eseguire la migrazione di un'applicazione esistente per usare connessioni senza password

La procedura seguente illustra come eseguire la migrazione di un'applicazione esistente per usare connessioni senza password anziché una soluzione basata su password.

0) Preparare l'ambiente di lavoro

Usare prima di tutto il comando seguente per configurare alcune variabili di ambiente.

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
export AZ_MYSQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
export AZ_MYSQL_AD_MI_USERNAME=<YOUR_AZURE_AD_MI_DISPLAY_NAME>
export AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)

Sostituire i segnaposto con i valori seguenti, che vengono usati nell'intero articolo:

  • <YOUR_RESOURCE_GROUP>: nome del gruppo di risorse in cui si trovano le risorse.
  • <YOUR_DATABASE_SERVER_NAME>: nome del server MySQL, che deve essere univoco in Azure.
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: nome visualizzato dell'utente non amministratore di Microsoft Entra. Assicurarsi che il nome sia un utente valido nel tenant di Microsoft Entra.
  • <YOUR_AZURE_AD_MI_DISPLAY_NAME>: nome visualizzato dell'utente di Microsoft Entra per l'identità gestita. Assicurarsi che il nome sia un utente valido nel tenant di Microsoft Entra.
  • <YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>: nome del server di identità gestito assegnato dall'utente, che deve essere univoco in Azure.

1) Configurare Database di Azure per MySQL

1.1) Abilitare l'autenticazione basata su ID di Microsoft Entra

Per usare l'accesso a Microsoft Entra ID con Database di Azure per MySQL, è necessario impostare prima l'utente amministratore di Microsoft Entra. Solo un utente di Microsoft Entra Admin può creare/abilitare gli utenti per l'autenticazione basata su ID di Microsoft Entra.

Se si usa l'interfaccia della riga di comando di Azure, eseguire il comando seguente per assicurarsi che disponga di autorizzazioni sufficienti:

az login --scope https://graph.microsoft.com/.default

Eseguire il comando seguente per creare l'identità utente per l'assegnazione:

az identity create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_USER_IDENTITY_NAME

Importante

Dopo aver creato l'identità assegnata dall'utente, chiedere all'amministratore globale o all'amministratore del ruolo con privilegi di concedere le autorizzazioni seguenti per questa identità: User.Read.All, GroupMember.Read.Alle Application.Read.ALL. Per altre informazioni, vedere la sezione Autorizzazioni dell'autenticazione di Active Directory.

Eseguire il comando seguente per assegnare l'identità al server MySQL per la creazione dell'amministratore di Microsoft Entra:

az mysql flexible-server identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --identity $AZ_USER_IDENTITY_NAME

Eseguire quindi il comando seguente per impostare l'amministratore di Microsoft Entra:

az mysql flexible-server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID \
    --identity $AZ_USER_IDENTITY_NAME

Questo comando imposta l'amministratore di Microsoft Entra sull'utente connesso corrente.

Nota

È possibile creare un solo amministratore di Microsoft Entra per il server MySQL. La selezione di un'altra sovrascriverà l'amministratore di Microsoft Entra esistente configurato per il server.

2) Configurare Database di Azure per MySQL per lo sviluppo locale

2.1) Configurare una regola del firewall per l'INDIRIZZO IP locale

Le istanze di Database di Azure per MySQL sono protette per impostazione predefinita. Includono un firewall che non consente alcuna connessione in ingresso.

È possibile ignorare questo passaggio se si usa Bash perché il comando ha già rilevato l'indirizzo flexible-server create IP locale e impostarlo nel server MySQL.

Se ci si connette al server MySQL da sottosistema Windows per Linux (WSL) in un computer Windows, è necessario aggiungere l'ID host WSL al firewall. Ottenere l'indirizzo IP del computer host eseguendo il comando seguente in WSL:

cat /etc/resolv.conf

Copiare l'indirizzo IP seguendo il termine nameserver, quindi usare il comando seguente per impostare una variabile di ambiente per l'indirizzo IP WSL:

export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

Usare quindi il comando seguente per aprire il firewall del server all'app basata su WSL:

az mysql server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip-wsl \
    --server $AZ_DATABASE_SERVER_NAME \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

2.2) Creare un utente non amministratore mySQL e concedere l'autorizzazione

Creare quindi un utente Microsoft Entra non amministratore e concedere tutte le autorizzazioni per il $AZ_DATABASE_NAME database. È possibile modificare il nome $AZ_DATABASE_NAME del database in base alle proprie esigenze.

Creare uno script SQL denominato create_ad_user.sql per la creazione di un utente non amministratore. Aggiungere il contenuto seguente e salvarlo in locale:

export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '$AZ_MYSQL_AD_NON_ADMIN_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_NON_ADMIN_USERNAME'@'%';
FLUSH privileges;
EOF

Usare quindi il comando seguente per eseguire lo script SQL per creare l'utente non amministratore di Microsoft Entra:

mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Usare ora il comando seguente per rimuovere il file di script SQL temporaneo:

rm create_ad_user.sql

Nota

Per altre informazioni dettagliate sulla creazione di utenti MySQL, vedere Creare utenti in Database di Azure per MySQL.

3) Accedere ed eseguire la migrazione del codice dell'app per usare connessioni senza password

Per lo sviluppo locale, assicurarsi di essere autenticati con lo stesso account Microsoft Entra a cui è stato assegnato il ruolo in MySQL. È possibile eseguire l'autenticazione tramite l'interfaccia della riga di comando di Azure, Visual Studio, Azure PowerShell o altri strumenti come IntelliJ.

Accedere ad Azure tramite l'interfaccia della riga di comando di Azure usando il comando seguente:

az login

Usare quindi la procedura seguente per aggiornare il codice per usare connessioni senza password. Anche se concettualmente simile, ogni linguaggio usa dettagli di implementazione diversi.

  1. All'interno del progetto aggiungere il riferimento seguente al azure-identity-extensions pacchetto. Questa libreria contiene tutte le entità necessarie per implementare connessioni senza password.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Abilitare il plug-in di autenticazione MySQL di Azure nell'URL JDBC. Identificare i percorsi nel codice che attualmente creano un java.sql.Connection oggetto per connettersi a Database di Azure per MySQL. Aggiornare url e user nel file application.properties in modo che corrispondano ai valori seguenti:

    url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
    user=$AZ_MYSQL_AD_NON_ADMIN_USERNAME
    

    Nota

    Se si usa la MysqlConnectionPoolDataSource classe come origine dati nell'applicazione, assicurarsi di rimuovere defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin dall'URL.

    url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
    user=$AZ_MYSQL_AD_NON_ADMIN_USERNAME
    
  3. Sostituire una $AZ_DATABASE_SERVER_NAME variabile, una $AZ_DATABASE_NAME variabile e una $AZ_MYSQL_AD_NON_ADMIN_USERNAME variabile con i valori configurati all'inizio di questo articolo.

  4. Rimuovere l'oggetto password dall'URL JDBC.

Eseguire l'app in locale

Dopo aver apportato queste modifiche al codice, eseguire l'applicazione in locale. La nuova configurazione deve raccogliere le credenziali locali se si è connessi a un IDE compatibile o a uno strumento da riga di comando, ad esempio l'interfaccia della riga di comando di Azure, Visual Studio o IntelliJ. I ruoli assegnati all'utente di sviluppo locale in Azure consentiranno all'app di connettersi al servizio di Azure in locale.

4) Configurare l'ambiente di hosting di Azure

Dopo che l'applicazione è configurata per l'uso di connessioni senza password e viene eseguita in locale, lo stesso codice può eseguire l'autenticazione ai servizi di Azure dopo la distribuzione in Azure. Ad esempio, un'applicazione distribuita in un'istanza del servizio app Azure con un'identità gestita assegnata può connettersi a Archiviazione di Azure.

In questa sezione verranno eseguiti due passaggi per consentire l'esecuzione dell'applicazione in un ambiente di hosting di Azure in modo senza password:

  • Assegnare l'identità gestita per l'ambiente di hosting di Azure.
  • Assegnare ruoli all'identità gestita.

Nota

Azure offre anche Service Connector, che consente di connettere il servizio di hosting con PostgreSQL. Con Service Connector per configurare l'ambiente di hosting, è possibile omettere il passaggio di assegnazione dei ruoli all'identità gestita perché Service Connector lo eseguirà automaticamente. La sezione seguente descrive come configurare l'ambiente di hosting di Azure in due modi: uno tramite Service Connector e l'altro configurando direttamente ogni ambiente di hosting.

Importante

I comandi di Service Connector richiedono l'interfaccia della riga di comando di Azure 2.41.0 o versione successiva.

Assegnare l'identità gestita usando il portale di Azure

I passaggi seguenti illustrano come assegnare un'identità gestita assegnata dal sistema per vari servizi di hosting Web. L'identità gestita può connettersi in modo sicuro ad altri servizi di Azure usando le configurazioni dell'app configurate in precedenza.

  1. Nella pagina di panoramica principale dell'istanza del servizio app Azure selezionare Identità nel riquadro di spostamento.

  2. Nella scheda Assegnata dal sistema assicurarsi di impostare il campo Stato su attivato. Un'identità assegnata dal sistema viene gestita internamente da Azure e gestisce automaticamente le attività amministrative. I dettagli e gli ID dell'identità non vengono mai esposti nel codice.

È anche possibile assegnare un'identità gestita in un ambiente di hosting di Azure usando l'interfaccia della riga di comando di Azure.

È possibile assegnare un'identità gestita a un'istanza del servizio app Azure con il comando az webapp identity assign, come illustrato nell'esempio seguente:

export AZ_MI_OBJECT_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <service-instance-name> \
    --query principalId \
    --output tsv)

Assegnare ruoli all'identità gestita

Concedere quindi le autorizzazioni all'identità gestita assegnata per accedere all'istanza di MySQL.

Questi passaggi creeranno un utente di Microsoft Entra per l'identità gestita e concedono tutte le autorizzazioni per il database $AZ_DATABASE_NAME . È possibile modificare il nome $AZ_DATABASE_NAME del database in base alle proprie esigenze.

Creare prima di tutto uno script SQL denominato create_ad_user.sql per la creazione di un utente non amministratore. Aggiungere il contenuto seguente e salvarlo in locale:

export AZ_MYSQL_AD_MI_USERID=$(az ad sp show --id $AZ_MI_OBJECT_ID --query appId --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '$AZ_MYSQL_AD_MI_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_MI_USERID';
GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_MI_USERNAME'@'%';
FLUSH privileges;
EOF

Usare quindi il comando seguente per eseguire lo script SQL per creare l'utente non amministratore di Microsoft Entra:

mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Usare ora il comando seguente per rimuovere il file di script SQL temporaneo:

rm create_ad_user.sql

Testare l'app

Prima di distribuire l'app nell'ambiente di hosting, è necessario apportare un'altra modifica al codice perché l'applicazione si connetterà a MySQL usando l'utente creato per l'identità gestita.

Aggiornare il codice per usare l'utente creato per l'identità gestita:

properties.put("user", "$AZ_MYSQL_AD_MI_USERNAME");

Dopo aver apportato queste modifiche al codice, è possibile compilare e ridistribuire l'applicazione. Passare quindi all'applicazione ospitata nel browser. L'app dovrebbe essere in grado di connettersi correttamente al database MySQL. Tenere presente che la propagazione delle assegnazioni di ruolo nell'ambiente di Azure potrebbe richiedere alcuni minuti. L'applicazione è ora configurata per l'esecuzione sia in locale che in un ambiente di produzione senza che gli sviluppatori debbano gestire i segreti nell'applicazione stessa.

Passaggi successivi

In questa esercitazione si è appreso come eseguire la migrazione di un'applicazione a connessioni senza password.

È possibile leggere le risorse seguenti per esplorare i concetti illustrati in questo articolo in modo più approfondito: