Zelfstudie: Microsoft Entra-gebruikers maken met behulp van Microsoft Entra-toepassingen

Van toepassing op: Azure SQL Database

In dit artikel wordt uitgelegd hoe u een service-principal configureert, zodat microsoft Entra-gebruikers in Azure SQL Database kunnen worden gemaakt. Met deze mogelijkheid kunt u programmatisch toegangsbeheer configureren voor Azure SQL-resources voor gebruikers en toepassingen in uw Microsoft Entra-tenant.

Notitie

Microsoft Entra-id is de nieuwe naam voor Azure Active Directory (Azure AD). Op dit moment wordt de documentatie bijgewerkt.

Zie het artikel Microsoft Entra-verificatie gebruiken voor Microsoft Entra-verificatie voor Azure SQL voor meer informatie.

In deze zelfstudie leert u het volgende:

  • Een identiteit toewijzen aan de logische server
  • De rol Adreslijstlezers toewijzen aan de serveridentiteit
  • Een toepassing registreren in Microsoft Entra-id
  • Een databasegebruiker maken voor de service-principal van die toepassing in Azure SQL Database
  • Een Microsoft Entra-databasegebruiker maken met de service-principal

Vereisten

  • Een bestaande Azure SQL Database-implementatie . We gaan ervan uit dat u een werkende SQL-database hebt voor deze zelfstudie.
  • Microsoft Entra Global Administrator of Privileged Role Administrator machtigingen in de tenant waarin uw SQL-database zich bevindt.
  • De nieuwste versie van de Az.Sql PowerShell-module.
  • De nieuwste versie van de Microsoft.Graph PowerShell-module.

Een identiteit toewijzen aan de logische server

  1. Verbinding maken naar Azure, waarbij u de Microsoft Entra-tenant opgeeft die als host fungeert voor uw SQL-database. De tenant-id vindt u op de overzichtspagina voor uw Microsoft Entra ID-resource in Azure Portal. Kopieer de tenant-id en voer vervolgens de volgende PowerShell-opdracht uit:

    • Vervang <TenantId> door de Tenant-id.
    Connect-AzAccount -Tenant <TenantId>
    

    Registreer de TenantId voor toekomstig gebruik in deze zelfstudie.

  2. Genereer een door het systeem toegewezen beheerde identiteit en wijs deze toe aan de logische server in Azure. Voer de volgende PowerShell-opdracht uit:

    • Vervang <ResourceGroupName> en <ServerName> door uw resources in de opdracht Set-AzSqlServer . Als de servernaam myserver.database.windows.net is, vervangt u <ServerName> door myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Controleer of het toewijzen van de server-id is geslaagd. Voer de volgende PowerShell-opdracht uit:

    • Vervang <ResourceGroupName> en <ServerName> door uw resources. Als de servernaam myserver.database.windows.net is, vervangt u <ServerName> door myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    In de uitvoer worden nu PrincipalId, Type en TenantId weergegeven. De toegewezen identiteit is de PrincipalId.

  4. U kunt de identiteit ook controleren door naar de Azure-portal te gaan.

    • Ga in de Microsoft Entra ID-resource naar Bedrijfstoepassingen. Typ de naam van de logische server. De object-id die op de resource wordt weergegeven, is de id van de primaire serveridentiteit.

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

Serveridentiteit toevoegen aan de rol Directory Readers

De serveridentiteit vereist machtigingen om een query uit te voeren op Microsoft Entra-id voor beheerfuncties, waaronder het maken van Microsoft Entra-gebruikers en aanmeldingen, en het uitvoeren van groepsuitbreiding om gebruikersmachtigingen toe te passen op basis van hun Microsoft Entra-groepslidmaatschap. Als serveridentiteitsmachtigingen voor het uitvoeren van query's op Microsoft Entra-id worden ingetrokken of als de serveridentiteit wordt verwijderd, werkt Microsoft Entra-verificatie niet meer.

Wijs Microsoft Entra-querymachtigingen toe aan de serveridentiteit door deze toe te voegen aan de rol Directory Readers of door de volgende Microsoft Graph-machtigingen op een lager niveau toe te wijzen:

Notitie

Dit script moet worden uitgevoerd door een Microsoft Entra-id Global Administrator of een Privileged Role Administrator.

Het volgende script verleent de Microsoft Entra Directory Readers toestemming voor een identiteit die de logische server voor Azure SQL Database vertegenwoordigt.

  • Vervang <TenantId> door de TenantId die eerder is verkregen.
  • Vervang door <ServerName> de naam van de logische server. Als de servernaam myserver.database.windows.net is, vervangt u <ServerName> door 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'."
}

Notitie

De uitvoer van dit script geeft aan of de identiteit is toegewezen aan de rol Directory Readers . U kunt het script opnieuw uitvoeren als u niet zeker weet of de machtiging is verleend.

Zie Microsoft Entra-beheerder inrichten (SQL Managed Instance) voor een vergelijkbare aanpak voor het toewijzen van de rol Directory Readers voor SQL Managed Instance.

In productieomgevingen is het gebruikelijk om de rol Adreslijstlezers toe te wijzen aan een groep die kan worden toegewezen aan Microsoft Entra-id. Vervolgens kunnen groepseigenaren beheerde identiteiten toevoegen aan de groep. Hiermee wordt het principe van minimale bevoegdheden gehandhaafd en wordt de noodzaak voor een globale Beheer istrator of bevoorrechte rol Beheer istrator om de rol Directory Readers afzonderlijk toe te kennen aan elk SQL-exemplaar. Zie de rol Directory Readers in Microsoft Entra ID voor Azure SQL voor meer informatie over deze functie.

Een toepassing maken in Microsoft Entra-id

Registreer uw toepassingen. Als u een app wilt registreren, hebt u ten minste de rol Microsoft Entra ID Application Developer nodig. Zie Gebruikersrollen toewijzen in Microsoft Entra ID voor meer informatie over het toewijzen van rollen.

In deze zelfstudie worden twee service-principals gebruikt. De eerste service-principal, DBOwnerApp, wordt gebruikt om andere gebruikers in de database te maken. De tweede service-principal, myapp, is de toepassing die DBOwnerApp maakt voor later in deze zelfstudie een databasegebruiker.

Uw toepassingen registreren:

  1. Selecteer Microsoft Entra ID> App-registraties> Nieuwe registratie in de Azure-portal.

    Screenshot shows the Register an application page.

    Nadat de app-registratie is gemaakt, wordt de waarde voor de toepassings-id (client) gegenereerd en weergegeven. Noteer deze waarde voor toekomstig gebruik in deze zelfstudie.

    Screenshot of the Azure portal that shows the App ID.

  2. Maak een clientgeheim waarmee de toepassing zich kan aanmelden. Volg het uploaden van een certificaat of maak een geheim om u aan te melden. Noteer het clientgeheim voor DBOwnerApp voor toekomstig gebruik in deze zelfstudie.

Zie De portal gebruiken om een Microsoft Entra-toepassing en service-principal te maken die toegang heeft tot resources voor meer informatie.

De service-principalgebruiker maken

Voeg de zojuist gemaakte service-principal DBOwnerApp toe als gebruiker in SQL Database en wijs er machtigingen aan toe.

Verbinding maken naar uw SQL Database met behulp van een Microsoft Entra-identiteit met machtigingen voor het maken van andere gebruikers.

Belangrijk

Alleen Microsoft Entra-gebruikers kunnen andere Microsoft Entra-gebruikers maken in Azure SQL Database. Er kunnen geen gebruikers op basis van SQL-verificatie, met inbegrip van de serverbeheerder, een Microsoft Entra-gebruiker maken. De Microsoft Entra-beheerder is de enige gebruiker die in eerste instantie andere Microsoft Entra-gebruikers in SQL Database kan maken. Nadat de Microsoft Entra-beheerder andere gebruikers heeft gemaakt, kan elke Microsoft Entra-gebruiker met de juiste machtigingen andere Microsoft Entra-gebruikers maken.

  1. Maak de gebruiker DBOwnerApp in de SQL Database met behulp van de volgende T-SQL-opdracht:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Als u minimaal andere Microsoft Entra-gebruikers wilt maken, is de ALTER ANY USER SQL-machtiging vereist. Deze machtiging wordt ook overgenomen via lidmaatschap van db_owneren via toewijzing als Microsoft Entra-beheerder. In de volgende voorbeelden ziet u drie verschillende opties voor het toewijzen van machtigingen aan DBOwnerApp waarmee andere Microsoft Entra-gebruikers in de database kunnen worden gemaakt.

    U kunt DBOwnerApp toevoegen aan de db_owner rol met sp_addrolemember:

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    U kunt de ALTER ANY USER machtiging toewijzen aan DBOwnerApp , zoals het volgende T-SQL-voorbeeld:

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    U kunt dbOwnerApp instellen als Microsoft Entra-beheerder. U kunt dit doen met behulp van de Azure Portal-, PowerShell- of Azure CLI-opdrachten. Zie Microsoft Entra-beheerder (SQL Database) inrichten voor meer informatie.

Een gebruiker maken met een service-principal

  1. Gebruik het volgende script om een Microsoft Entra-service-principalgebruiker myapp te maken met behulp van de service-principal DBOwnerApp:

    • Vervang <TenantId> door de TenantId die eerder is verkregen.
    • Vervang <ClientId> door de ClientId die eerder is verkregen.
    • Vervang <ClientSecret> door het clientgeheim dat u eerder hebt gemaakt.
    • Vervang door <ServerName> de naam van de logische server. Als de servernaam myserver.database.windows.net is, vervangt u <ServerName> door myserver.
    • Vervang <database name> door de naam van de SQL-database.
    # 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()
    

    U kunt ook de volgende code gebruiken: Verificatie van de Microsoft Entra-service-principal voor Azure SQL Database. Wijzig het script om de DDL-instructie CREATE USER [myapp] FROM EXTERNAL PROVIDERuit te voeren. Hetzelfde script kan worden gebruikt voor het maken van een Microsoft Entra-gebruiker of -groep in uw database.

  2. Controleer of de gebruiker myapp bestaat in de database door de volgende opdracht uit te voeren:

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

    De uitvoer moet er ongeveer als volgt uitzien:

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

Volgende stappen