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
- Enregistrer 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
ouPrivileged 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
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.- Remplacez
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 estmyserver.database.windows.net
, remplacez<ServerName>
parmyserver
.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
- Remplacez
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 estmyserver.database.windows.net
, remplacez<ServerName>
parmyserver
.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identity
La sortie doit indiquer
PrincipalId
,Type
etTenantId
. L’identité attribuée est lePrincipalId
.- Remplacez
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.
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 leTenantId
récupéré précédemment. - Remplacez
<ServerName>
par le nom de votre serveur logique. Si le nom de votre serveur estmyserver.database.windows.net
, remplacez<ServerName>
parmyserver
.
# 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.
Pour une approche similaire sur la façon d'attribuer le rôle de Lecteurs de répertoire pour SQL Managed Instance, voir Configurer Microsoft Entra admin.
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 :
Dans le portail Azure, sélectionnez Microsoft Entra ID > Inscriptions d’applications > Nouvelle inscription.
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.
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.
Créez l’utilisateur DBOwnerApp dans la SQL Database à l’aide de la commande T-SQL suivante :
CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER GO
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. Si vous souhaitez obtenir plus d’informations, consultez Définir l’administrateur Microsoft Entra.
Créer un utilisateur avec un principal de service
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 leTenantId
récupéré précédemment. - Remplacez
<ClientId>
par leClientId
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 estmyserver.database.windows.net
, remplacez<ServerName>
parmyserver
. - 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.- Remplacez
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
- Principal de service Microsoft Entra avec Azure SQL
- Que sont les identités managées pour les ressources Azure ?
- Guide pratique pour utiliser des identités managées avec App Service et Azure Functions
- Authentification du principal de service Microsoft Entra à la base de données SQL - Exemple de code
- Objets application et principal de service dans Microsoft Entra ID
- Créer un principal de service Azure avec Azure PowerShell
- Rôle de Lecteurs de répertoire dans Microsoft Entra ID pour Azure SQL