Partager via


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

Applies to :Azure SQL Database

Cet article explique comment configurer un principal de service afin qu’il puisse créer des utilisateurs Microsoft Entra dans Azure SQL Database. Cette fonctionnalité vous permet de gérer par programmation l’accès à Azure SQL ressources pour les utilisateurs et les applications de votre locataire Microsoft Entra.

Remarque

Microsoft Entra ID était précédemment appelé Azure Active Directory (Azure AD).

Pour plus d’informations sur l’authentification Microsoft Entra pour Azure SQL, consultez 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
  • Inscrire une application dans Microsoft Entra ID
  • Créer un utilisateur de base de données pour le principal de service de cette application dans Azure SQL Database
  • Créer un utilisateur de base de données de Microsoft Entra avec le principal du service

Prérequis

  • Déploiement existant d'un Azure SQL Database. Ce didacticiel part du principe que vous disposez d’une base de données SQL opérationnelle.
  • Microsoft Entra Privileged Role Administrator autorisations dans le tenant où réside 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 locataire Microsoft Entra qui héberge votre base de données SQL. L’ID de locataire se trouve dans la page Overview de votre ressource Microsoft Entra ID dans le portail Azure portail. 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 affectez-la au serveur logical 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
    

    Votre sortie affiche PrincipalId, Typeet 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, accédez aux applications Enterprise. 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.

    Capture d’écran montrant où trouver l’ID d’objet d’une application d’entreprise.

Conseil / Astuce

En guise d’alternative à une identité managée affectée par le système, vous pouvez utiliser une identité managée affectée par l’utilisateur. Une identité managée affectée par l’utilisateur peut être partagée entre plusieurs serveurs logiques, ce qui réduit le nombre d’identités à gérer et simplifie les attributions de rôles. Pour plus d’informations, consultez Identité managée affectée par l’utilisateur dans Microsoft Entra ID pour Azure SQL.

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, ce qui inclut la création d'utilisateurs Microsoft Entra et de connexions, ainsi que l'expansion de groupes pour appliquer des autorisations utilisateur en fonction de leur appartenance aux groupes Microsoft Entra. Si les autorisations d’identité du serveur pour interroger des Microsoft Entra ID sont révoquées ou que l’identité du serveur est supprimée, Microsoft Entra l’authentification cesse de fonctionner.

Attribuez des autorisations de requête Microsoft Entra à l’identité du serveur en l’ajoutant au rôle Directory Readers ou en affectant les autorisations suivantes de Microsoft Graph :

Remarque

Ce script doit être exécuté par un rôle Microsoft Entra Privileged Role Administrator ou supérieur.

Le script suivant accorde l’autorisation Microsoft Entra Directory Readers à une identité qui représente le serveur logique pour Azure SQL Database.

  • 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 **Privileged Role Administrator** or higher 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 ne savez pas si l’autorisation a été accordée.

Pour savoir comment attribuer de façon similaire le rôle de Lecteur de répertoire à une instance SQL Managed, consultez Définir l'admin Microsoft Entra.

Dans les environnements de production, une pratique de gestion courante consiste à affecter le rôle Directory Readers à un groupe assignable à un rôle dans Microsoft Entra ID. Ensuite, les propriétaires de groupes peuvent ajouter des identités managées au groupe. Cela maintient le principe des privilèges minimum et contourne la nécessité pour un administrateur de rôle privilégié d’accorder le rôle Lecteurs d’annuaire individuellement à chaque instance SQL. Pour plus d’informations sur cette fonctionnalité, consultez le rôle Directory Readers 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 Microsoft Entra ID Application Developer. Pour plus d’informations sur l’attribution de rôles, consultez Assigner des rôles d’utilisateur dans 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>App registrations>New registration.

    Capture d’écran montrant la page Inscrire une application.

    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 du portail Azure qui affiche l’ID d’application.

  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 Utilisez le portail pour créer une application et un principal de service Microsoft Entra qui peuvent accéder aux ressources.

Créer l'utilisateur principal du service

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

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

Important

Seuls Microsoft Entra utilisateurs peuvent créer d’autres utilisateurs Microsoft Entra dans Azure SQL Database. Aucun utilisateur basé sur l’authentification SQL, y compris l’administrateur du serveur, peut créer un 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, n’importe quel 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, au minimum, l’autorisation SQL ALTER ANY USER est requise. Cette autorisation est également héritée par l’appartenance à 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 l'DBOwnerApp en tant qu’administrateur Microsoft Entra. Utilisez le portail Azure, PowerShell ou les commandes Azure CLI. Pour plus d’informations, consultez Set Microsoft Entra admin.

Créer un utilisateur avec un principal de service

  1. Utilisez le script suivant pour créer un utilisateur Microsoft Entra principal de service myapp à l’aide du 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.

    Remarque

    Le script suivant nécessite l'assembly Microsoft.Data.SqlClient. Installez-le à partir du package NuGet et chargez la DLL avec Add-Type -Path "path\to\Microsoft.Data.SqlClient.dll" avant d’exécuter le script.

    # 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 Microsoft.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 Microsoft.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 pour Azure SQL Database. Modifiez le script pour exécuter l’instruction DDL CREATE USER [myapp] FROM EXTERNAL PROVIDER. Utilisez 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    aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb