Tutorial: Erstellen von Microsoft Entra-Benutzern mit Microsoft Entra-Anwendungen
Gilt für: Azure SQL-Datenbank
In diesem Artikel wird erläutert, wie Sie einen Dienstprinzipal konfigurieren, damit er Microsoft Entra-Benutzer in Azure SQL-Datenbank erstellen kann. Diese Funktion ermöglicht die programmgesteuerte Konfiguration der Zugriffsverwaltung für Azure SQL-Ressourcen für Benutzer und Anwendungen in Ihrem Microsoft Entra-Mandanten.
Hinweis
Microsoft Entra ID war zuvor als Azure Active Directory (Azure AD) bekannt.
Weitere Informationen zur Microsoft Entra-Authentifizierung für Azure SQL finden Sie unter Verwenden der Microsoft Entra-Authentifizierung.
In diesem Tutorial lernen Sie Folgendes:
- Zuweisen einer Identität zum logischen Server
- Zuweisen der Rolle „Verzeichnisleseberechtigte“ zur Serveridentität
- Registrieren einer Anwendung in Microsoft Entra ID
- Erstellen eines Datenbankbenutzers für den Dienstprinzipal dieser Anwendung in Azure SQL-Datenbank
- Erstellen eines Microsoft Entra-Datenbankbenutzers mit dem Dienstprinzipal
Voraussetzungen
- Eine bereits vorhandene Bereitstellung von Azure SQL-Datenbank. Wir gehen davon aus, dass Sie für dieses Tutorial über eine funktionierende SQL-Datenbank verfügen.
Global Administrator
- oderPrivileged Role Administrator
-Berechtigungen für Microsoft Entra im Mandanten, in dem sich Ihre SQL-Datenbank befindet.- Die aktuelle Version des Az.Sql PowerShell-Moduls.
- Die aktuelle Version des Microsoft Graph PowerShell-Moduls.
Zuweisen einer Identität zum logischen Server
Verbinden zu Azure unter Angabe des Microsoft Entra-Mandanten, der Ihre SQL-Datenbank hostet. Die Mandanten-ID finden Sie auf der Seite Übersicht für Ihre Microsoft Entra ID-Ressource im Azure-Portal. Kopieren Sie die Mandanten-ID und führen Sie dann den folgenden PowerShell-Befehl aus:
- Ersetzen Sie
<TenantId>
durch Ihre Mandanten-ID.
Connect-AzAccount -Tenant <TenantId>
Notieren Sie sich den
TenantId
-Wert für die spätere Verwendung in diesem Tutorial.- Ersetzen Sie
Generieren Sie eine vom System zugewiesene verwaltete Identität und weisen Sie sie dem logischen Server in Azure zu. Führen Sie den folgenden PowerShell-Befehl aus:
- Ersetzen Sie
<ResourceGroupName>
und<ServerName>
durch Ihre Ressourcen im Befehl Set-AzSqlServer. Wenn der Servernamemyserver.database.windows.net
ist, ersetzen Sie<ServerName>
durchmyserver
.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
- Ersetzen Sie
Überprüfen Sie, ob die Serveridentität erfolgreich zugewiesen wurde. Führen Sie den folgenden PowerShell-Befehl aus:
- Ersetzen Sie
<ResourceGroupName>
und<ServerName>
durch Ihre Ressourcen. Wenn der Servernamemyserver.database.windows.net
ist, ersetzen Sie<ServerName>
durchmyserver
.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identity
Ihre Ausgabe sollte Ihnen
PrincipalId
,Type
undTenantId
zeigen. Die zugewiesene Identität ist diePrincipalId
.- Ersetzen Sie
Sie können die Identität auch überprüfen, indem Sie zum Azure-Portal navigieren.
- Gehen Sie in der Ressource Microsoft Entra ID zu Unternehmensanwendungen. Geben Sie den Namen Ihres logischen Servers ein. Die Objekt-ID, die in der Ressource angezeigt wird, ist die ID der primären Serveridentität.
Hinzufügen der Serveridentität zur Rolle „Verzeichnisleseberechtigte“
Die Serveridentität erfordert Berechtigungen zum Abfragen der Microsoft Entra-ID für administrative Funktionen, die das Erstellen von Microsoft Entra-Benutzern und -Anmeldungen umfasst, und die Gruppenerweiterung, um Benutzerberechtigungen basierend auf ihrer Microsoft Entra-Gruppenmitgliedschaft anzuwenden. Wenn Serveridentitätsberechtigungen zum Abfragen der Microsoft Entra-ID widerrufen werden oder die Serveridentität gelöscht wird, funktioniert die Microsoft Entra-Authentifizierung nicht mehr.
Weisen Sie der Serveridentität Microsoft Entra-Abfrageberechtigungen zu, indem Sie sie der Rolle Verzeichnisleseberechtigte hinzufügen oder die folgenden Microsoft Graph-Berechtigungen auf niedrigerer Ebene zuweisen:
Hinweis
Dieses Skript muss von einem Global Administrator
oder Privileged Role Administrator
für Microsoft Entra ID ausgeführt werden.
Das folgende Skript gewährt dem Microsoft Entra-Verzeichnisleseberechtigten die Berechtigung für eine Identität, die den logischen Server für Azure SQL-Datenbank darstellt.
- Ersetzen Sie
<TenantId>
durch Ihre zuvor ermittelteTenantId
. - Ersetzen Sie
<ServerName>
durch den Namen Ihres logischen Servers. Wenn der Servernamemyserver.database.windows.net
ist, ersetzen Sie<ServerName>
durchmyserver
.
# 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'."
}
Hinweis
Die Ausgabe dieses Skripts gibt an, ob die Identität der Rolle Verzeichnisleseberechtigte zugewiesen ist. Wenn Sie sich nicht sicher sind, ob die Berechtigung erteilt wurde, können Sie das Skript erneut ausführen.
Eine ähnliche Vorgehensweise zum Zuweisen der Rolle Verzeichnisleseberechtigte für SQL Managed Instance finden Sie unter Microsoft Entra-Admin einstellen.
In Produktionsumgebungen besteht eine gängige Verwaltungspraxis darin, die Rolle Verzeichnisleseberechtigter einer rollenzuweisenden Gruppe in Microsoft Entra ID zuzuweisen. Gruppenbesitzer können dann der Gruppe verwaltete Identitäten hinzufügen. Dies wahrt das Prinzip der geringsten Rechte und umgeht die Notwendigkeit, dass ein globaler Administrator oder ein Administrator für privilegierte Rollen die Rolle Verzeichnisleseberechtigter für jede SQL-Instanz einzeln gewährt. Weitere Informationen zu diesem Feature finden Sie unter Rolle „Verzeichnisleseberechtigte“ in Microsoft Entra ID für Azure SQL.
Erstellen einer Anwendung in Microsoft Entra ID
Registrieren Ihrer Anwendungen. Um eine App zu registrieren, benötigen Sie mindestens die Rolle Microsoft Entra ID-Anwendungsentwickler. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zuweisen von Benutzerrollen in Microsoft Entra ID.
In diesem Lernprogramm werden zwei Dienstprinzipale verwendet. Der erste Dienstprinzipal DBOwnerApp wird verwendet, um andere Benutzer in der Datenbank zu erstellen. Der zweite Dienstprinzipal, myapp, ist die Anwendung, für die DBOwnerApp später in diesem Tutorail einen Datenbankbenutzer erstellt.
So registrieren Sie Ihre Anwendung:
Wählen Sie im Azure-Portal Microsoft Entra ID>App-Registrierungen>Neue Registrierung aus.
Nachdem die App-Registrierung erstellt wurde, wird der Wert für die Anwendungs (Client) -ID generiert und angezeigt. Notieren Sie sich diesen Wert für die spätere Verwendung in diesem Tutorial.
Erstellen eines geheimen Clientschlüssels für die Anwendung zum Anmelden. Befolgen Sie Zertifikat hochladen oder ein Geheimnis für die Anmeldung erstellen. Notieren Sie den geheimen Clientschlüssel für DBOwnerApp für die zukünftige Verwendung in diesem Tutorial.
Weitere Informationen finden Sie unter Vorgehensweise: Erstellen einer Microsoft Entra-Anwendung und eines Dienstprinzipals mit Ressourcenzugriff mithilfe des Portals.
Erstellen Sie den Dienstprinzipal-Benutzer
Fügen Sie den neu erstellten Dienstprinzipal DBOwnerApp als Benutzer in SQL-Datenbank hinzu, und weisen Sie ihm Berechtigungen zu.
Verbinden zu Ihrer SQL-Datenbank mithilfe einer Microsoft Entra-Identität, die über Berechtigungen zum Erstellen anderer Benutzer verfügt.
Wichtig
Nur Microsoft Entra-Benutzer können andere Microsoft Entra-Benutzer in Azure SQL-Datenbank erstellen. Keine Benutzer, einschließlich des Serveradministrators, können basierend auf SQL-Authentifizierung Microsoft Entra-Benutzer erstellen. Der Microsoft Entra-Administrator ist der einzige Benutzer, der anfänglich andere Microsoft Entra-Benutzer in SQL-Datenbank erstellen kann. Nachdem der Microsoft Entra-Administrator andere Benutzer erstellt hat, können alle Microsoft Entra-Benutzer mit den entsprechenden Berechtigungen andere Microsoft Entra-Benutzer erstellen.
Erstellen Sie den Benutzer DBOwnerApp in der SQL-Datenbank, indem Sie den folgenden T-SQL-Befehl verwenden:
CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER GO
Um andere Microsoft Entra-Benutzer zu erstellen, ist mindestens die
ALTER ANY USER
SQL-Berechtigung erforderlich. Diese Berechtigung wird auch durch die Mitgliedschaft indb_owner
, und durch die Zuweisung als Microsoft Entra-Administrator geerbt. Die folgenden Beispiele veranschaulichen drei verschiedene Optionen zum Zuweisen von Berechtigungen zu DBOwnerApp, die es ermöglichen, andere Microsoft Entra-Benutzer in der Datenbank zu erstellen.Sie können DBOwnerApp zur
db_owner
-Rolle mit sp_addrolemember hinzufügen:EXEC sp_addrolemember 'db_owner', [DBOwnerApp] GO
Sie können wie im folgenden T-SQL-Beispiel die
ALTER ANY USER
-Berechtigung zu DBOwnerApp zuweisen:GRANT ALTER ANY USER TO [DBOwnerApp] GO
Sie können die DBOwnerApp als Microsoft Entra-Administrator festlegen. Dazu können Sie die Befehle Azure-Portal, PowerShell oder Azure CLI verwenden. Weitere Informationen finden Sie unter Festlegen eines Microsoft Entra-Administrators.
Erstellen Sie einen Benutzer mit einem Dienstprinzipal
Verwenden Sie das folgende Skript, um mithilfe des Dienstprinzipals DBOwnerApp einen Microsoft Entra-Dienstprinzipalbenutzer myapp zu erstellen:
- Ersetzen Sie
<TenantId>
durch Ihre zuvor ermittelteTenantId
. - Ersetzen Sie
<ClientId>
durch den zuvor erfasstenClientId
-Wert. - Ersetzen Sie
<ClientSecret>
durch Ihren geheimen Clientschlüssel, der zuvor erstellt wurde. - Ersetzen Sie
<ServerName>
durch den Namen Ihres logischen Servers. Wenn der Servernamemyserver.database.windows.net
ist, ersetzen Sie<ServerName>
durchmyserver
. - Ersetzen Sie
<database name>
durch den Namen der SQL-Datenbank.
# 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()
Alternativ können Sie den folgenden Code verwenden: Microsoft Entra-Dienstprinzipalauthentifizierung zur Azure SQL-Datenbank. Ändern Sie das Skript, um die DDL-Anweisung
CREATE USER [myapp] FROM EXTERNAL PROVIDER
auszuführen. Das gleiche Skript kann verwendet werden, um einen Microsoft Entra-Benutzer oder -Gruppe in Ihrer Datenbank zu erstellen.- Ersetzen Sie
Überprüfen Sie, ob der Benutzer myapp in der Datenbank vorhanden ist, indem Sie den folgenden Befehl ausführen:
SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId FROM sys.database_principals WHERE name = 'myapp' GO
Eine ähnliche Ausgabe wie die folgende sollte angezeigt werden:
name type type_desc appId myapp E EXTERNAL_USER 6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Nächste Schritte
- Microsoft Entra Dienstprinzipal mit Azure SQL
- Was sind verwaltete Identitäten für Azure-Ressourcen?
- Verwenden verwalteter Identitäten für App Service und Azure Functions
- Microsoft Entra service principal authentication to SQL DB - Code Sample (Microsoft Entra-Dienstprinzipalauthentifizierung bei SQL DB: Codebeispiel)
- Anwendungs- und Dienstprinzipalobjekte in Microsoft Entra ID
- Erstellen eines Azure-Dienstprinzipals mit Azure PowerShell
- Rolle „Verzeichnisleseberechtigte“ in Microsoft Entra ID für Azure SQL