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- oder Privileged 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

  1. 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.

  2. 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 Servername myserver.database.windows.net ist, ersetzen Sie <ServerName> durch myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Ü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 Servername myserver.database.windows.net ist, ersetzen Sie <ServerName> durch myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    Ihre Ausgabe sollte Ihnen PrincipalId, Typeund TenantIdzeigen. Die zugewiesene Identität ist die PrincipalId.

  4. 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.

    Screenshot zeigt, wo die Objekt-ID für eine Unternehmensanwendung zu finden ist.

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 ermittelte TenantId.
  • Ersetzen Sie <ServerName> durch den Namen Ihres logischen Servers. Wenn der Servername myserver.database.windows.net ist, ersetzen Sie <ServerName> durch 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'."
}

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:

  1. Wählen Sie im Azure-Portal Microsoft Entra ID>App-Registrierungen>Neue Registrierung aus.

    Screenshot zeigt die Seite „Anwendung registrieren“.

    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.

    Screenshot der App-ID im Azure-Portal.

  2. 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.

  1. Erstellen Sie den Benutzer DBOwnerApp in der SQL-Datenbank, indem Sie den folgenden T-SQL-Befehl verwenden:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Um andere Microsoft Entra-Benutzer zu erstellen, ist mindestens die ALTER ANY USER SQL-Berechtigung erforderlich. Diese Berechtigung wird auch durch die Mitgliedschaft in db_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

  1. Verwenden Sie das folgende Skript, um mithilfe des Dienstprinzipals DBOwnerApp einen Microsoft Entra-Dienstprinzipalbenutzer myapp zu erstellen:

    • Ersetzen Sie <TenantId> durch Ihre zuvor ermittelte TenantId.
    • Ersetzen Sie <ClientId> durch den zuvor erfassten ClientId-Wert.
    • Ersetzen Sie <ClientSecret> durch Ihren geheimen Clientschlüssel, der zuvor erstellt wurde.
    • Ersetzen Sie <ServerName> durch den Namen Ihres logischen Servers. Wenn der Servername myserver.database.windows.net ist, ersetzen Sie <ServerName> durch myserver.
    • 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.

  2. Ü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