Migrer une application Node.js 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 Node.js 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 pour fonctionner dans 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

  1. Créez des paramètres d’environnement pour votre application.

    AZURE_SQL_SERVER=<YOURSERVERNAME>.database.windows.net
    AZURE_SQL_DATABASE=<YOURDATABASENAME>
    AZURE_SQL_PORT=1433
    
  2. Le code de l’application existante qui se connecte à Azure SQL Database en utilisant le pilote SQL Node.js - tedious continue de fonctionner avec des connexions sans mot de passe moyennant des modifications mineures. Pour utiliser une identité managée affectée par l’utilisateur, passez les propriétés authentication.type et options.clientId.

    import sql from 'mssql';
    
    // Environment settings - no user or password
    const server = process.env.AZURE_SQL_SERVER;
    const database = process.env.AZURE_SQL_DATABASE;
    const port = parseInt(process.env.AZURE_SQL_PORT);
    
    // Passwordless configuration
    const config = {
        server,
        port,
        database,
        authentication: {
            type: 'azure-active-directory-default',
        },
        options: {
            encrypt: true,
            clientId: process.env.AZURE_CLIENT_ID  // <----- user-assigned managed identity        
        }
    };
    
    // Existing applicaton code
    export default class Database {
        config = {};
        poolconnection = null;
        connected = false;
    
        constructor(config) {
            this.config = config;
            console.log(`Database: config: ${JSON.stringify(config)}`);
        }
    
        async connect() {
            try {
                console.log(`Database connecting...${this.connected}`);
                if (this.connected === false) {
                    this.poolconnection = await sql.connect(this.config);
                    this.connected = true;
                    console.log('Database connection successful');
                } else {
                    console.log('Database already connected');
                }
            } catch (error) {
                console.error(`Error connecting to database: ${JSON.stringify(error)}`);
            }
        }
    
        async disconnect() {
            try {
                this.poolconnection.close();
                console.log('Database connection closed');
            } catch (error) {
                console.error(`Error closing database connection: ${error}`);
            }
        }
    
        async executeQuery(query) {
            await this.connect();
            const request = this.poolconnection.request();
            const result = await request.query(query);
    
            return result.rowsAffected[0];
        }
    }
    
    const databaseClient = new Database(config);
    const result = await databaseClient.executeQuery(`select * from mytable where id = 10`);
    

    La variable d’environnement AZURE_CLIENT_ID est créée plus loin dans ce tutoriel.

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 :

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.

Si vous devez utiliser une identité managée affectée par le système, omettez la propriété options.clientId. Vous devez quand même passer la propriété authentication.type.

const config = {
  server,
  port,
  database,
  authentication: {
    type: 'azure-active-directory-default'
  },
  options: {
    encrypt: true
  }
};

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 :