Migrer une application Python pour utiliser des connexions sans mot de passe avec Azure SQL Database

S’applique à : Azure SQL Database

Les requêtes des applications adressées à Azure SQL Database doivent être authentifiées. Bien qu’il existe plusieurs options pour l’authentification auprès d’Azure SQL Database, vous devez donner la priorité aux connexions sans mot de passe dans vos applications quand cela est possible. Les méthodes d’authentification traditionnelles qui utilisent des mots de passe ou des clés secrètes créent des risques et des complications de sécurité. Visitez le hub de connexions sans mot de passe pour Azure Services pour découvrir l’avantage des connexions sans mot de passe. Le tutoriel suivant explique comment migrer une application Python existante pour se connecter à Azure SQL Database afin d’utiliser des connexions sans mot de passe au lieu d’une solution avec nom d’utilisateur et mot de passe.

Configurer Azure SQL Database

Les connexions sans mot de passe utilisent l'authentification Microsoft Entra pour se connecter aux services Azure, y compris la base de données Azure SQL. L'authentification Microsoft Entra facilite la gestion des identités dans une position centrale et simplifie la gestion des autorisations. Découvrez comment configurer l'authentification Microsoft Entra pour votre base de données Azure SQL :

Pour le présent guide de migration, assurez-vous qu'un administrateur Microsoft Entra est affecté à votre base de données Azure SQL.

  1. Accédez à la page Microsoft Entra de votre serveur logique.

  2. Sélectionnez Définir l'administrateur pour ouvrir le menu à contrôle suspendu de Microsoft Entra ID.

  3. Dans le menu à contrôle suspendu de Microsoft Entra ID, recherchez l'utilisateur auquel vous souhaitez attribuer le rôle d'administrateur.

  4. Sélectionnez l’utilisateur et choisissez Sélectionner.

    Capture d’écran montrant l’activation de l’administration Microsoft Entra.

Configurer votre environnement de développement local

Les connexions sans mot de passe peuvent être configurées de telle manière qu’elles fonctionnent à la fois pour les environnements locaux et hébergés par Azure. Dans cette section, vous appliquez des configurations afin de permettre aux utilisateurs individuels de s’authentifier auprès d’Azure SQL Database pour le développement local.

Se connecter à Azure

Pour le développement local, assurez-vous que vous êtes connecté avec le même compte Azure AD que celui que vous souhaitez utiliser pour accéder à Azure SQL Database. Vous pouvez vous authentifier au moyen d’outils de développement populaires, comme Azure CLI ou Azure PowerShell. Les outils de développement avec lesquels vous pouvez vous authentifier dépendent de la langue.

Connectez-vous à Azure via Azure CLI à l’aide de la commande suivante :

az login

Créer un utilisateur de base de données et attribuer des rôles

Créez un utilisateur dans Azure SQL Database. L’utilisateur doit correspondre au compte Azure que vous avez utilisé pour vous connecter localement dans la section Se connecter à Azure.

  1. Dans le portail Azure, accédez à votre base de données SQL et sélectionnez Éditeur de requête (préversion).

  2. Sélectionnez Continuer en tant que <your-username> sur le côté droit de l’écran pour vous connecter à la base de données à l’aide de votre compte.

  3. Dans la vue de l’éditeur de requête, exécutez les commandes T-SQL suivantes :

    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
    

    Capture d’écran montrant comment utiliser l’éditeur de requête Azure.

    L’exécution de ces commandes attribue le rôle Contributeur de base de données SQL au compte spécifié. Ce rôle permet à l’identité de lire, d’écrire et de modifier les données et le schéma de votre base de données. Pour plus d’informations sur les rôles attribués, consultez Rôles de base de données fixes.

Mettre à jour la configuration de la connexion locale

Le code de l’application existante qui se connecte à Azure SQL Database en utilisant le pilote SQL Python - pyodbc continue de fonctionner avec des connexions sans mot de passe moyennant des modifications mineures. Par exemple, le code suivant fonctionne à la fois avec des connexions via l’authentification SQL et avec des connexions sans mot de passe lors d’une exécution locale et quand il est déployé sur Azure App Service.

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

Conseil

Dans cet exemple de code, la variable d’environnement App Service WEBSITE_HOSTNAME est utilisée pour déterminer l’environnement dans lequel le code s’exécute. Pour d’autres scénarios de déploiement, vous pouvez utiliser d’autres variables d’environnement pour déterminer l’environnement.

Pour mettre à jour la chaîne de connexion référencée (AZURE_SQL_CONNECTIONSTRING) pour le développement local, utilisez le format de chaîne de connexion sans mot de passe :

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

Tester l’application

Exécutez votre application localement et vérifiez que les connexions à Azure SQL Database fonctionnent comme prévu. N’oubliez pas qu’il peut falloir plusieurs minutes pour que les modifications des utilisateurs et des rôles se propagent dans l’environnement Azure. Votre application est désormais configurée pour s’exécuter localement sans que les développeurs ne doivent gérer les secrets dans l’application elle-même.

Configurer l’environnement d’hébergement Azure

Une fois que votre application est configurée pour utiliser des connexions sans mot de passe localement, le même code peut s’authentifier auprès d’Azure SQL Database après son déploiement sur Azure. Les sections suivantes expliquent comment configurer une application déployée pour se connecter à Azure SQL Database à l’aide d’une identité managée. Les identités managées fournissent une identité managée automatiquement dans Microsoft Entra ID (anciennement Azure Active Directory) que les applications peuvent utiliser lors de la connexion à des ressources qui prennent en charge l’authentification Microsoft Entra. En savoir plus sur les identités managées :

Créer l’identité managée

Créez une identité managée affectée par l’utilisateur à l’aide du portail Azure ou de l’interface Azure CLI. Votre application utilise l’identité pour s’authentifier auprès d’autres services.

  1. À partir du Portail Azure, recherchez Identités managées. Sélectionnez le résultat Identités managées.
  2. Sélectionnez + Créer en haut de la page de présentation des Identités managées.
  3. Sous l’onglet Informations de base, entrez les valeurs suivantes :
    • Abonnement : sélectionnez l’option souhaitée.
    • Groupe de ressources : sélectionnez votre groupe de ressources souhaité.
    • Région : sélectionnez une région proche de votre emplacement.
    • Nom : entrez un nom reconnaissable pour votre identité, par exemple MigrationIdentity.
  4. Au bas de la page, sélectionnez Examiner et créer.
  5. Une fois les vérifications de validation terminées, sélectionnez Créer. Azure crée une identité affectée par l’utilisateur.

Une fois la ressource créée, sélectionnez Accéder à la ressource pour afficher les détails de l’identité managée.

Capture d’écran montrant comment créer une identité managée à l’aide du portail Azure.

Associer l’identité managée à votre application web

Configurez votre application web pour utiliser l’identité managée affectée par l’utilisateur créée.

Procédez comme suit dans le portail Azure pour associer une identité managée affectée par l’utilisateur à votre application. Ces mêmes étapes s’appliquent aux services Azure suivants :

  • Azure Spring Apps
  • Azure Container Apps
  • Machines virtuelles Azure
  • Azure Kubernetes Service
  • Accédez à la page de présentation de votre application web front-end.
  1. Sélectionnez Identité dans la barre de navigation de gauche.

  2. Dans la page Identité, basculez vers l’onglet Utilisateur affecté.

  3. Sélectionnez + Ajouter pour ouvrir le menu volant Ajouter une identité managée affectée par l’utilisateur.

  4. Sélectionnez l’abonnement utilisé précédemment pour créer l’identité.

  5. Recherchez MigrationIdentity par nom et sélectionnez-le dans les résultats de la recherche.

  6. Sélectionnez Ajouter pour associer l’identité à votre application.

    Capture d’écran montrant comment attribuer une identité managée.

Créer un utilisateur de base de données pour l’identité et attribuer des rôles

Créez un utilisateur de base de données SQL mappé à l’identité managée affectée par l’utilisateur. Attribuez également les rôles SQL nécessaires à l’utilisateur pour autoriser votre application à lire, écrire et modifier les données et le schéma de votre base de données.

  1. Dans le Portail Azure, accédez à votre base de données SQL et sélectionnez Éditeur de requête (préversion).

  2. Sélectionnez Continuer en tant que <username> sur le côté droit de l’écran pour vous connecter à la base de données à l’aide de votre compte.

  3. Dans la vue de l’éditeur de requête, exécutez les commandes T-SQL suivantes :

    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
    

    Capture d’écran montrant comment utiliser l’éditeur de requête Azure afin de créer un utilisateur SQL pour une identité managée.

    L’exécution de ces commandes attribue le rôle Contributeur de base de données SQL à l’identité managée affectée par l’utilisateur. Ce rôle permet à l’identité de lire, d’écrire et de modifier les données et le schéma de votre base de données.


Important

Faites preuve de précaution quand vous attribuez des rôles d’utilisateur de base de données dans des environnements de production d’entreprise. Dans ces scénarios, l’application ne doit pas effectuer toutes les opérations en utilisant une même identité avec privilèges élevés. Essayez d’implémenter le principe des privilèges minimum en configurant plusieurs identités disposant d’autorisations spécifiques pour des tâches spécifiques.

Vous pouvez en apprendre plus sur la configuration des rôles de base de données et la sécurité avec les ressources suivantes :

Mettre à jour la chaîne de connexion

Mettez à jour la configuration de votre application Azure pour utiliser le format de chaîne de connexion sans mot de passe. Le format doit être le même que celui utilisé dans votre environnement local.

Les chaînes de connexion peuvent être stockées en tant que variables d’environnement dans votre environnement d’hébergement d’applications. Les instructions suivantes se concentrent sur App Service, mais d’autres services d’hébergement Azure fournissent des configurations similaires.

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>est le nom de votre serveur de base de données Azure SQL et <database-name> est le nom de votre base de données Azure SQL.

Créer un paramètre d’application pour l’ID client de l’identité managée

Pour utiliser l’identité managée affectée par l’utilisateur, créez une variable d’environnement AZURE_CLIENT_ID et définissez-la sur l’ID client de l’identité managée. Vous pouvez définir cette variable dans la section Configuration de votre application dans le portail Azure. Vous trouverez l’ID client dans la section Vue d’ensemble de la ressource d’identité managée dans le portail Azure.

Enregistrez vos modifications et redémarrez l’application si elle ne redémarre pas automatiquement.

Notes

L’exemple de code de connexion présenté dans ce guide de migration utilise la classe DefaultAzureCredential lors du déploiement. Plus précisément, il utilise DefaultAzureCredential sans passer au constructeur l’ID client de l’identité managée affectée par l’utilisateur. Dans ce cas, la solution de repli consiste à vérifier la variable d’environnement AZURE_CLIENT_ID. Si la variable d’environnement AZURE_CLIENT_ID n’existe pas, une identité managée affectée par le système est utilisée si elle est configurée.

Si vous passez l’ID client de l’identité managée dans le constructeur DefaultAzureCredential, le code de connexion peut toujours être utilisé localement et déployé, car le processus d’authentification revient à l’authentification interactive dans le scénario local. Pour plus d’informations, consultez Bibliothèque cliente d’identité Azure pour Python.

Tester l’application

Testez votre application pour vous assurer de son bon fonctionnement. La propagation de l’ensemble des modifications dans votre environnement Azure peut prendre quelques minutes.

Étapes suivantes

Dans ce didacticiel, vous avez appris à migrer une application vers des connexions sans mot de passe.

Vous pouvez lire les ressources suivantes pour explorer les concepts abordés dans cet article plus en détails :