Tutoriel : Créer des utilisateurs Microsoft Entra à l’aide d’applications Microsoft Entra

S’applique à Azure SQL Database

Cet article explique comment configurer un principal de service afin de pouvoir créer des utilisateurs Microsoft Entra dans la base de données Azure SQL. Cette capacité permet la configuration programmatique de la gestion des accès aux ressources Azure SQL pour les utilisateurs et les applications de votre client Microsoft Entra.

Remarque

Microsoft Entra ID était précédemment connu sous le nom d’Azure Active Directory (Azure AD).

Pour plus d’informations sur l’authentification Microsoft Entra pour Azure SQL, consultez l’article suivant : Utiliser l’authentification Microsoft Entra.

Dans ce tutoriel, vous allez apprendre à :

  • Attribuer une identité au serveur logique
  • Attribuer le rôle Lecteurs de répertoire à l’identité du serveur
  • Inscrivez une application dans Microsoft Entra ID
  • Créer un utilisateur de base de données pour le principal de service de cette application dans la base de données Azure SQL
  • Créer un utilisateur de base de données Microsoft Entra avec le principal de service

Prérequis

  • Un déploiement Azure SQL Database existant. Nous supposons que vous disposez d’une base de données SQL opérationnelle pour ce tutoriel.
  • Autorisations Microsoft Entra Global Administrator ou Privileged Role Administrator dans le client où se trouve votre base de données SQL.
  • La dernière version du module PowerShell Az.Sql.
  • La dernière version du module PowerShell Microsoft.Graph.

Attribuer une identité au serveur logique

  1. Connectez-vous à Azure, en spécifiant le client Microsoft Entra qui héberge votre SQL Database. L’identifiant du client se trouve sur la page de présentation de votre ressource Microsoft Entra ID dans le portail Azure. Copiez l’ID de client, puis exécutez la commande PowerShell suivante :

    • Remplacez <TenantId> par votre ID de locataire.
    Connect-AzAccount -Tenant <TenantId>
    

    Enregistrez le TenantId. Vous l’utiliserez plus tard dans ce tutoriel.

  2. Générez une identité managée affectée par le système et attribuez-la au serveur logique dans Azure. Exécutez la commande PowerShell suivante :

    • Remplacez <ResourceGroupName> et <ServerName> par vos ressources dans la commande Set-AzSqlServer. Si le nom de votre serveur est myserver.database.windows.net, remplacez <ServerName> par myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Vérifiez que l’identité du serveur a été correctement attribuée. Exécutez la commande PowerShell suivante :

    • Remplacez <ResourceGroupName> et <ServerName> par vos ressources. Si le nom de votre serveur est myserver.database.windows.net, remplacez <ServerName> par myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    La sortie doit indiquer PrincipalId, Type et TenantId. L’identité attribuée est le PrincipalId.

  4. Vous pouvez également vérifier l’identité en accédant au portail Azure.

    • Dans la ressource Microsoft Entra ID, allez dans Applications d'entreprise. Tapez le nom de votre serveur logique. L’ID d’objet qui apparaît sur la ressource est l’ID de l’identité du serveur principal.

    Screenshot shows where to find the Object ID for an enterprise application.

Ajouter l’identité du serveur au rôle Lecteurs de répertoire

L’identité du serveur nécessite des autorisations pour interroger Microsoft Entra ID pour les fonctions d’administration. Cela inclut la création d’utilisateurs et de connexions Microsoft Entra et le développement de groupes pour appliquer des autorisations utilisateur en fonction de leur appartenance au groupe Microsoft Entra. Si les autorisations d’identité du serveur pour interroger Microsoft Entra ID sont révoquées ou que l’identité du serveur est supprimée, l’authentification Microsoft Entra cesse de fonctionner.

Attribuez des autorisations de requête Microsoft Entra à l’identité du serveur en l’ajoutant au rôle Lecteurs de répertoire ou en attribuant les autorisations Microsoft Graph de niveau inférieur suivantes :

Remarque

Ce script doit être exécuté par un Global Administrator Microsoft Entra ID ou un Privileged Role Administrator.

Le script suivant accorde l’autorisation Lecteurs de répertoire Microsoft Entra à une identité qui représente le serveur logique pour la base de données Azure SQL.

  • Remplacez <TenantId> par le TenantId récupéré précédemment.
  • Remplacez <ServerName> par le nom de votre serveur logique. Si le nom de votre serveur est myserver.database.windows.net, remplacez <ServerName> par myserver.
# This script grants "Directory Readers" permission to a service principal representing a logical server for Azure SQL Database
# It can be executed only by a user who is a member of the **Global Administrator** or **Privileged Role Administrator** role.
# To check if the "Directory Readers" role was granted, re-execute this script

Import-Module Microsoft.Graph.Authentication
$ServerIdentityName = "<ServerName>"    # Enter your logical server name
$TenantId = "<TenantId>"                # Enter your tenant ID

Connect-MgGraph -TenantId "<TenantId>" -Scopes "RoleManagement.ReadWrite.Directory,Application.Read.All"

# Get Microsoft Entra "Directory Readers" role and create if it doesn't exist
$roleName = "Directory Readers"
$role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
if ($role -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-MgDirectoryRoleTemplate -Filter "DisplayName eq '$roleName'"
    New-MgDirectoryRoleTemplate -RoleTemplateId $roleTemplate.Id
    $role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
}

# Get service principal for server
$roleMember = Get-MgServicePrincipal -Filter "DisplayName eq '$ServerIdentityName'"
$roleMember.Count
if ($roleMember -eq $null) {
    Write-Output "Error: No service principal with name '$($ServerIdentityName)' found, make sure that ServerIdentityName parameter was entered correctly."
    exit
}
if (-not ($roleMember.Count -eq 1)) {
    Write-Output "Error: Multiple service principals with name '$($ServerIdentityName)'"
    Write-Output $roleMember | Format-List DisplayName, Id, AppId
    exit
}

# Check if service principal is already member of Directory Readers role
$isDirReader = Get-MgDirectoryRoleMember -DirectoryRoleId $role.Id -Filter "Id eq '$($roleMember.Id)'"

if ($isDirReader -eq $null) {
    # Add principal to Directory Readers role
    Write-Output "Adding service principal '$($ServerIdentityName)' to 'Directory Readers' role'..."
    $body = @{
        "@odata.id"= "https://graph.microsoft.com/v1.0/directoryObjects/{$($roleMember.Id)}"
    }
    New-MgDirectoryRoleMemberByRef -DirectoryRoleId $role.Id -BodyParameter $body
    Write-Output "'$($ServerIdentityName)' service principal added to 'Directory Readers' role'."
} else {
    Write-Output "Service principal '$($ServerIdentityName)' is already member of 'Directory Readers' role'."
}

Remarque

La production de ce script indique si l’identité est attribuée au rôle Lecteurs de répertoire. Vous pouvez réexécuter le script si vous n’êtes pas certain que l’autorisation a été accordée.

Vous trouverez dans l’article Provisionner un administrateur Microsoft Entra (SQL Managed Instance) une approche similaire sur la manière d’attribuer le rôle Lecteurs de répertoire pour SQL Managed Instance.

Dans les environnements de production, une pratique de gestion courante consiste à attribuer le rôle Lecteurs de répertoire à un groupe assignable de rôle dans Microsoft Entra ID. Ensuite, les propriétaires de groupes peuvent ajouter des identités managées au groupe. Cela permet de maintenir le principe du moindre privilège et d’éviter qu’un Administrateur général ou un Administrateur de rôle privilégié n’octroie le rôle de Lecteurs de répertoire à chaque instance SQL. Pour plus d’informations sur cette fonctionnalité, consultez Rôle de Lecteurs de répertoire dans Microsoft Entra ID pour Azure SQL.

Créer une application dans Microsoft Entra ID

Inscrire vos applications. Pour inscrire une application, vous avez besoin au moins du rôle Développeur d’applications Microsoft Entra ID. Pour obtenir des informations sur la procédure d’attribution de rôles, consultez Attribuer des rôles Microsoft Entra ID.

Ce tutoriel utilise deux principaux de service. Le premier principal de service, DBOwnerApp, est utilisé pour créer d’autres utilisateurs dans la base de données. Le deuxième principal de service, myapp, est l’application pour laquelle DBOwnerApp crée un utilisateur de base de données, plus loin dans ce tutoriel.

Pour inscrire vos applications :

  1. Dans le portail Azure, sélectionnez Microsoft Entra ID > Inscriptions d’applications > Nouvelle inscription.

    Screenshot shows the Register an application page.

    Une fois l’inscription d’application créée, la valeur de l’ID d’application (client) est générée et affichée. Enregistrez cette valeur. Vous l’utiliserez plus tard dans ce tutoriel.

    Screenshot of the Azure portal that shows the App ID.

  2. Créer une clé secrète client avec laquelle l’application se connectera. Téléchargez ensuite un certificat ou créez une clé secrète pour vous connecter. Enregistrez la clé secrète client pour DBOwnerApp. Vous l’utiliserez plus tard dans ce tutoriel.

Pour plus d’informations, consultez Utiliser le portail pour créer une application et un principal de service Microsoft Entra pouvant accéder aux ressources.

Créer l’utilisateur du principal de service

Ajoutez le principal de service nouvellement créé, DBOwnerApp, en tant qu’utilisateur dans SQL Database et attribuez-lui des autorisations.

Connectez-vous à votre SQL Database à l’aide d’une identité Microsoft Entra qui dispose des autorisations nécessaires pour créer d’autres utilisateurs.

Important

Seuls les utilisateurs De Microsoft Entra peuvent créer d’autres utilisateurs Microsoft Entra dans Azure SQL Database. Aucun utilisateur SQL avec authentification SQL, y compris l’administrateur du serveur, ne peut créer d’utilisateur Microsoft Entra. L’administrateur Microsoft Entra est le seul utilisateur qui peut initialement créer d’autres utilisateurs Microsoft Entra dans SQL Database. Une fois que l’administrateur Microsoft Entra a créé d’autres utilisateurs, tout utilisateur Microsoft Entra disposant d’autorisations appropriées peut créer d’autres utilisateurs Microsoft Entra.

  1. Créez l’utilisateur DBOwnerApp dans la SQL Database à l’aide de la commande T-SQL suivante :

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Pour créer d’autres utilisateurs Microsoft Entra, vous avez besoin au minimum d’une autorisation SQL ALTER ANY USER. Cette autorisation est également héritée par l’abonnement à db_owner, et par le biais de l’affectation en tant qu’administrateur Microsoft Entra. Les exemples suivants illustrent trois options différentes pour attribuer des autorisations à DBOwnerApp qui lui permettent de créer d’autres utilisateurs Microsoft Entra dans la base de données.

    Vous pouvez ajouter DBOwnerApp au rôle db_owner avec sp_addrolemember :

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    Vous pouvez attribuer l’autorisation ALTER ANY USER à DBOwnerApp comme l’exemple T-SQL suivant :

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    Vous pouvez définir DBOwnerApp comme administrateur Microsoft Entra. Cette opération peut être effectuée à l’aide des commandes Portail Azure, PowerShell ou Azure CLI. Pour plus d’informations, consultez Provisionner un administrateur Microsoft Entra (SQL Database).

Créer un utilisateur avec un principal de service

  1. Utilisez le script suivant pour créer un utilisateur de principal de service Microsoft Entra myapp avec le principal de service DBOwnerApp :

    • Remplacez <TenantId> par le TenantId récupéré précédemment.
    • Remplacez <ClientId> par le ClientId récupéré précédemment.
    • Remplacez <ClientSecret> par le secret client créé précédemment.
    • Remplacez <ServerName> par le nom de votre serveur logique. Si le nom de votre serveur est myserver.database.windows.net, remplacez <ServerName> par myserver.
    • Remplacez <database name> par le nom de votre base de données SQL.
    # PowerShell script for creating a new SQL user called myapp using application DBOwnerApp with secret
    # DBOwnerApp is an admin for the server
    
    # Download latest  MSAL  - https://www.powershellgallery.com/packages/MSAL.PS
    Import-Module MSAL.PS
    
    $tenantId = "<TenantId>"   # Microsoft Entra tenant ID where DBOwnerApp resides
    $clientId = "<ClientId>"   # Application (client) ID recorded earlier for DBOwnerApp
    $clientSecret = "<ClientSecret>"   # Client secret for DBOwnerApp 
    $scopes = "https://database.windows.net/.default" # The endpoint
    
    $result = Get-MsalToken -RedirectUri $uri -ClientId $clientId -ClientSecret (ConvertTo-SecureString $clientSecret -AsPlainText -Force) -TenantId $tenantId -Scopes $scopes
    
    $Tok = $result.AccessToken
    #Write-host "token"
    $Tok
    
    $SQLServerName = "<ServerName>"    # Logical server name 
    $DatabaseName = "<database name>"   # Azure SQL database name
    
    Write-Host "Create SQL connection string"
    $conn = New-Object System.Data.SqlClient.SQLConnection 
    $conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30"
    $conn.AccessToken = $Tok
    
    Write-host "Connect to database and execute SQL script"
    $conn.Open() 
    $ddlstmt = 'CREATE USER [myapp] FROM EXTERNAL PROVIDER;'
    Write-host " "
    Write-host "SQL DDL command"
    $ddlstmt
    $command = New-Object -TypeName System.Data.SqlClient.SqlCommand($ddlstmt, $conn)       
    
    Write-host "results"
    $command.ExecuteNonQuery()
    $conn.Close()
    

    Vous pouvez également utiliser le code suivant : Authentification du principal de service Microsoft Entra sur la base de données Azure SQL. Modifiez le script pour exécuter l’instruction DDL CREATE USER [myapp] FROM EXTERNAL PROVIDER. Vous pouvez utiliser le même script pour créer un utilisateur ou un groupe Microsoft Entra dans votre base de données.

  2. Vérifiez si l’utilisateur myapp existe dans la base de données en exécutant la commande suivante :

    SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId
    FROM sys.database_principals
    WHERE name = 'myapp'
    GO
    

    La sortie doit ressembler à celle-ci :

    name	type	type_desc	appId
    myapp	E	EXTERNAL_USER	6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    

Étapes suivantes