Condividi tramite


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

Si applica a:database SQL di Azure

Le richieste dell'applicazione al database SQL di Azure devono essere autenticate. Anche se sono disponibili più opzioni per l'autenticazione al database SQL di Azure, è consigliabile assegnare priorità alle connessioni senza password nelle applicazioni, laddove possibile. I metodi di autenticazione tradizionali che utilizzano password o chiavi private generano rischi e complicazioni per la sicurezza. Visitare l’hub delle connessioni senza password per i servizi di Azure per ricevere altre informazioni sui vantaggi del passaggio alle connessioni senza password. L'esercitazione seguente spiega come eseguire la migrazione di un'applicazione Python esistente per la connessione a Database SQL di Azure al fine di usare connessioni senza password anziché una soluzione che preveda nome utente e password.

Configurare il database SQL di Azure

Le connessioni senza password usano l'autenticazione di Microsoft Entra per connettersi ai servizi di Azure, compreso Database SQL di Azure. Con l'autenticazione di Microsoft Entra, è possibile gestire centralmente le identità per semplificare la gestione delle autorizzazioni. Informazioni su come configurare l'autenticazione di Microsoft Entra per Database SQL di Azure:

Per questa guida alla migrazione, verificare di disporre di un amministratore di Microsoft Entra assegnato al database SQL di Azure.

  1. Passare alla pagina Microsoft Entra del server logico.

  2. Selezionare Imposta amministratore per aprire il menu a comparsa Microsoft Entra ID.

  3. Nel menu a comparsa Microsoft Entra ID, cercare l'utente da assegnare come amministratore.

  4. Selezionare l’utente e scegliere Seleziona.

    A screenshot showing how to enable Microsoft Entra admin.

Configurare l'ambiente di sviluppo locale

Le connessioni senza password possono essere configurate in modo da funzionare sia per gli ambienti locali che per quelli ospitati in Azure. In questa sezione vengono applicate configurazioni per consentire ai singoli utenti di eseguire l'autenticazione a database SQL di Azure per lo sviluppo locale.

Accedere ad Azure

Per lo sviluppo locale, verificare di aver eseguito l'accesso con lo stesso account Azure AD che si vuole usare per accedere al database SQL di Azure. È possibile eseguire l'autenticazione tramite strumenti di sviluppo diffusi, come l'interfaccia della riga di comando di Azure o Azure PowerShell. Gli strumenti di sviluppo con cui è possibile eseguire l'autenticazione variano a seconda dei linguaggi.

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

az login

Creare un utente del database e assegnare i ruoli

Creare un utente nel database SQL di Azure. L'utente deve corrispondere all'account Azure usato per accedere in locale nella sezione Accedi ad Azure.

  1. Nel portale di Azure, passare al database SQL e selezionare Editor di query (anteprima).

  2. Selezionare Continua come <your-username> sul lato destro della schermata per accedere al database con il proprio account.

  3. Nella visualizzazione dell'editor di query eseguire i seguenti comandi T-SQL:

    CREATE USER [user@domain] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [user@domain];
    ALTER ROLE db_datawriter ADD MEMBER [user@domain];
    ALTER ROLE db_ddladmin ADD MEMBER [user@domain];
    GO
    

    A screenshot showing how to use the Azure Query editor.

    L'esecuzione di questi comandi assegna il ruolo Collaboratore database SQL all'account specificato. Questo ruolo consente all'identità di leggere, scrivere e modificare i dati e lo schema del database. Per altre informazioni sui ruoli assegnati, vedere Ruoli predefiniti del database.

Aggiornare la configurazione della connessione locale

Il codice dell'applicazione esistente che si connette a database SQL di Azure tramite il driver SQL Python - pyodbc continua a funzionare con connessioni senza password apportando modifiche minime. Ad esempio, il codice seguente funziona sia con l'autenticazione SQL che con le connessioni senza password quando viene eseguito localmente e quando viene distribuito nel servizio app di Azure.

import os
import pyodbc, struct
from azure.identity import DefaultAzureCredential

connection_string = os.environ["AZURE_SQL_CONNECTIONSTRING"]

def get_all():
    with get_conn() as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM Persons")
        # Do something with the data
    return

def get_conn():
    credential = DefaultAzureCredential(exclude_interactive_browser_credential=False)
    token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
    token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
    SQL_COPT_SS_ACCESS_TOKEN = 1256  # This connection option is defined by microsoft in msodbcsql.h
    conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
    return conn

Suggerimento

In questo codice di esempio viene usata la variabile WEBSITE_HOSTNAME dell’ambiente del servizio app per determinare l'ambiente in cui è in esecuzione il codice. Per altri scenari di distribuzione, è possibile usare altre variabili di ambiente per stabilire l'ambiente.

Per aggiornare la stringa di connessione di riferimento (AZURE_SQL_CONNECTIONSTRING) per lo sviluppo locale, usare il formato di stringa di connessione senza password:

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

Testare l'app

Eseguire l'app in locale e verificare che le connessioni al database SQL di Azure funzionino come previsto. Considerare che potrebbero essere necessari alcuni minuti prima che le modifiche apportate agli utenti e ai ruoli di Azure vengano propagate nell'ambiente Azure. L'applicazione è ora configurata per l'esecuzione in locale senza che gli sviluppatori debbano gestire i segreti nell'applicazione stessa.

Configurare l'ambiente host di Azure

Dopo aver configurato l'app per l'uso delle connessioni senza password in locale, lo stesso codice può eseguire l'autenticazione al database SQL di Azure dopo la distribuzione in Azure. Le sezioni seguenti spiegano come configurare un'applicazione distribuita per la connessione a database SQL di Azure usando un'identità gestita. Le identità gestite forniscono un'identità gestita automaticamente in Microsoft Entra ID (precedentemente Azure Active Directory) per le applicazioni da usare per la connessione alle risorse che supportano l'autenticazione di Microsoft Entra. Vedere altre informazioni sulle identità gestite:

Creare l'identità gestita

Creare un'identità gestita assegnata dall'utente tramite il portale di Azure o l’interfaccia della riga di comando di Azure. L'applicazione utilizza l'identità per eseguire l'autenticazione ad altri servizi.

  1. Nella parte superiore della portale di Azure, cercare Identità gestite. Selezionare il risultato Identità gestite.
  2. Selezionare + Crea nella parte superiore della pagina di panoramica delle Identità gestite.
  3. Nella scheda Dati principali immettere i valori seguenti:
    • Sottoscrizione: selezionare la sottoscrizione desiderata.
    • Gruppo di risorse: selezionare il gruppo di risorse desiderato.
    • Area: selezionare un'area vicina alla propria posizione.
    • Nome: immettere un nome riconoscibile per l'identità, ad esempio MigrationIdentity.
  4. Selezionare Rivedi e crea nella parte inferiore della pagina.
  5. Al termine della convalida, selezionare Crea. Azure crea una nuova identità assegnata dall'utente.

Dopo aver creato la risorsa, selezionare Vai alla risorsa per visualizzare i dettagli dell'identità gestita.

A screenshot showing how to create a managed identity using the Azure portal.

Associare l'identità gestita all'app Web

Configurare l'app Web per usare l'identità gestita assegnata creata dall'utente.

Completare i passaggi seguenti nel portale di Azure per associare l'identità gestita assegnata dall'utente all'app. Gli stessi passaggi si applicano ai servizi di Azure seguenti:

  • Azure Spring Apps
  • App contenitore di Azure
  • Macchine virtuali di Azure
  • Servizio Azure Kubernetes
  • Passare alla pagina di panoramica dell'app Web.
  1. Selezionare Identità nel riquadro di spostamento a sinistra.

  2. Nella pagina Identità, passare alla scheda Assegnata dall'utente.

  3. Selezionare + Aggiungi per aprire il riquadro a comparsa Aggiungi identità gestita assegnata dall'utente.

  4. Selezionare la sottoscrizione utilizzata in precedenza per creare l'identità.

  5. Cercare MigrationIdentity per nome e selezionarlo dai risultati della ricerca.

  6. Selezionare Aggiungi per associare l'identità all'app.

    A screenshot showing how to assign a managed identity.

Creare un utente del database per l’identità e assegnare i ruoli

Creare un utente del database SQL che esegua il mapping con l'identità gestita assegnata dall'utente. Assegnare i ruoli SQL necessari all'utente per consentire all'app di leggere, scrivere e modificare i dati e lo schema del database.

  1. Nel portale di Azure, passare al database SQL e selezionare Editor di query (anteprima).

  2. Selezionare Continua come <username> sul lato destro della schermata per accedere al database con il proprio account.

  3. Nella visualizzazione dell'editor di query eseguire i seguenti comandi T-SQL:

    CREATE USER [user-assigned-identity-name] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [user-assigned-identity-name];
    ALTER ROLE db_datawriter ADD MEMBER [user-assigned-identity-name];
    ALTER ROLE db_ddladmin ADD MEMBER [user-assigned-identity-name];
    GO
    

    A screenshot showing how to use the Azure Query editor to create a SQL user for a managed identity.

    L'esecuzione di questi comandi assegna il ruolo Collaboratore database SQL all'identità gestita assegnata dall'utente. Questo ruolo consente all'identità di leggere, scrivere e modificare i dati e lo schema del database.


Importante

Prestare attenzione mentre si assegnano ruoli utente del database in ambienti di produzione aziendali. In tali scenari l'app non deve eseguire tutte le operazioni mediante un'unica identità con privilegi elevati. Provare ad adottare il principio dei privilegi minimi configurando più identità con autorizzazioni specifiche per attività specifiche.

Per altre informazioni sulle configurazioni di ruoli del database e sicurezza, vedere le seguenti risorse:

Aggiornare la stringa di connessione

Aggiornare la configurazione dell'app di Azure in modo che usi il formato di stringa di connessione senza password. Il formato deve essere lo stesso utilizzato nell'ambiente locale.

Le stringhe di connessione possono essere archiviate come variabili di ambiente nell'ambiente host dell'app. Le istruzioni seguenti sono incentrate sul servizio app, ma altri servizi di hosting di Azure forniscono configurazioni simili.

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

<database-server-name> è il nome del server database SQL di Azure e <database-name> è il nome del Database SQL di Azure.

Creare un'impostazione app per l'ID client dell'identità gestita

Per usare l'identità gestita assegnata dall'utente, creare una variabile di ambiente AZURE_CLIENT_ID e impostarla in maniera equivalente all’ID client dell'identità gestita. È possibile impostare questa variabile nella sezione Configurazione dell'app nel portale di Azure. È possibile trovare l'ID client nella sezione Panoramica della risorsa di identità gestita nel portale di Azure.

Salvare le modifiche e riavviare l'applicazione, se ciò non avviene automaticamente.

Nota

Il codice di connessione di esempio illustrato in questa guida alla migrazione usa la classe DefaultAzureCredential quando viene distribuita. Nello specifico, usa DefaultAzureCredential senza passare l'ID client dell'identità gestita assegnata dall'utente al costruttore. In questo scenario il fallback consiste nel verificare la presenza della variabile di ambiente AZURE_CLIENT_ID. Se la variabile di ambiente AZURE_CLIENT_ID non esiste, verrà usata un'identità gestita assegnata dal sistema, se configurata.

Se si passa l'ID client dell'identità gestita nel costruttore DefaultAzureCredential, il codice di connessione può ancora essere usato in locale e distribuito perché il processo di autenticazione esegue il fallback all'autenticazione interattiva nello scenario locale. Per altre informazioni, vedere la libreria client di Identità di Azure per Python.

Testare l'applicazione

Testare l’app, verificando che tutto funzioni ancora. La propagazione delle modifiche nell'ambiente di Azure potrebbe richiedere alcuni minuti.

Passaggi successivi

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

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