Esercitazione: Creare utenti di Microsoft Entra usando le applicazioni Microsoft Entra

Si applica a:database SQL di Azure

Questo articolo illustra come configurare un'entità servizio in modo che possa creare utenti di Microsoft Entra in database SQL di Azure. Questa funzionalità abilita la configurazione programmatica della gestione degli accessi alle risorse SQL di Azure per utenti e applicazioni nel tenant di Microsoft Entra.

Nota

Microsoft Entra ID era precedentemente noto come Azure Active Directory (Azure AD).

Per altre informazioni sull'autenticazione di Microsoft Entra per Azure SQL, vedere l'articolo Usare l'autenticazione di Microsoft Entra.

In questa esercitazione apprenderai a:

  • Assegnare un'identità al server logico
  • Assegnare il ruolo Lettori directory all'identità del server
  • Registrare un'applicazione in Microsoft Entra ID
  • Creare un utente di database per l'entità servizio dell'applicazione in database SQL di Azure
  • Creare un utente del database Microsoft Entra con l'entità servizio

Prerequisiti

  • Una distribuzione di database SQL di Azure esistente. Per questa esercitazione si presuppone che si disponga di un database SQL funzionante.
  • Microsoft Entra Global Administrator o Privileged Role Administrator le autorizzazioni nel tenant in cui risiede il database SQL.
  • Versione più recente del modulo Az.Sql PowerShell.
  • Versione più recente del modulo Microsoft.Graph PowerShell.

Assegnare un'identità al server logico

  1. Connessione ad Azure, specificando il tenant di Microsoft Entra che ospita il database SQL. L'ID tenant è reperibile nella pagina Panoramica per la risorsa ID di Microsoft Entra nella portale di Azure. Copiare l'ID tenant e quindi eseguire il comando di PowerShell seguente:

    • Sostituire <TenantId> con il proprio valore di ID tenant.
    Connect-AzAccount -Tenant <TenantId>
    

    Registrare il valore TenantId per un uso futuro in questa esercitazione.

  2. Generare un'identità gestita assegnata dal sistema e assegnarla al server logico in Azure. Eseguire questo comando PowerShell:

    • Sostituire <ResourceGroupName> e <ServerName> con le risorse nel comando Set-AzSqlServer . Se il nome del server è myserver.database.windows.net, sostituire <ServerName> con myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Verificare che l'identità del server sia stata assegnata correttamente. Eseguire questo comando PowerShell:

    • Sostituire <ResourceGroupName> e <ServerName> con le proprie risorse. Se il nome del server è myserver.database.windows.net, sostituire <ServerName> con myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    L'output dovrebbe mostrare PrincipalId, Type e TenantId. L'identità assegnata è PrincipalId.

  4. Per controllare l'identità, è anche possibile passare al portale di Azure.

    • Nella risorsa MICROSOFT Entra ID passare ad Applicazioni aziendali. Digitare il nome del server logico. L'ID oggetto visualizzato nella risorsa è l'ID dell'identità del server primario.

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

Aggiungere l'identità del server al ruolo Lettori directory

L'identità del server richiede autorizzazioni per eseguire query su Microsoft Entra ID per le funzioni amministrative, che include la creazione di utenti e account di accesso di Microsoft Entra e l'espansione dei gruppi per applicare le autorizzazioni utente in base all'appartenenza al gruppo Microsoft Entra. Se vengono revocate le autorizzazioni di identità del server per eseguire query sull'ID Microsoft Entra o l'identità del server viene eliminata, l'autenticazione di Microsoft Entra smette di funzionare.

Assegnare le autorizzazioni di query Di Microsoft Entra all'identità del server aggiungendola al ruolo Lettori directory o assegnando le autorizzazioni di microsoft Graph di livello inferiore seguenti:

Nota

Questo script deve essere eseguito da un ID Global Administrator Microsoft Entra o da un Privileged Role Administratoroggetto .

Lo script seguente concede all'identità un'identità che rappresenta il server logico per database SQL di Azure.

  • Sostituire <TenantId> con il valore TenantId raccolto in precedenza.
  • Sostituire <ServerName> con il nome del server logico. Se il nome del server è myserver.database.windows.net, sostituire <ServerName> con 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'."
}

Nota

L'output di questo script indica se l'identità è assegnata al ruolo Lettori directory. È possibile eseguire di nuovo lo script se non si è certi che sia stata concessa l'autorizzazione.

Per un approccio simile su come assegnare il ruolo Lettori directory per Istanza gestita di SQL, vedere Effettuare il provisioning dell'amministratore di Microsoft Entra (Istanza gestita di SQL).For a similar approach on how to assign the Directory Reader role for Istanza gestita di SQL, see Provision Microsoft Entra admin (Istanza gestita di SQL).

Negli ambienti di produzione, una pratica di gestione comune consiste nell'assegnare il ruolo Lettori directory a un gruppo assegnabile a ruoli in Microsoft Entra ID. I proprietari dei gruppi possono quindi aggiungere identità gestite al gruppo. In questo modo viene mantenuto il principio dei privilegi minimi e viene ignorata la necessità di un Amministrazione istrator globale o di un ruolo con privilegi Amministrazione istrator per concedere singolarmente il ruolo Lettori directory a ogni istanza di SQL. Per altre informazioni su questa funzionalità, vedere Ruolo Lettori directory in Microsoft Entra ID for Azure SQL.

Creare un'applicazione in Microsoft Entra ID

Registrare le applicazioni. Per registrare un'app, è necessario almeno il ruolo Microsoft Entra ID Application Developer . Per altre informazioni sull'assegnazione dei ruoli, vedere Assegnare ruoli utente in Microsoft Entra ID.

Questa esercitazione usa due entità servizio. La prima entità servizio, DBOwnerApp, viene usata per creare altri utenti nel database. La seconda entità servizio, myapp, è l'applicazione che DBOwnerApp crea un utente di database per più avanti in questa esercitazione.

Per registrare le applicazioni:

  1. Nel portale di Azure selezionare Microsoft Entra ID> Registrazioni app> Nuova registrazione.

    Screenshot shows the Register an application page.

    Dopo aver creato la registrazione dell'app, viene generato e visualizzato il valore ID applicazione (client). Registrare questo valore per un uso futuro in questa esercitazione.

    Screenshot of the Azure portal that shows the App ID.

  2. Creare un segreto client per l'applicazione con cui accedere. Seguire il caricamento di un certificato o la creazione di un segreto per l'accesso. Registrare il segreto client per DBOwnerApp per usarlo in futuro in questa esercitazione.

Per altre informazioni, vedere Usare il portale per creare un'applicazione Microsoft Entra e un'entità servizio in grado di accedere alle risorse.

Creare l'utente dell'entità servizio

Aggiungere l'entità servizio appena creata, DBOwnerApp, come utente in database SQL e assegnarvi le autorizzazioni.

Connessione all'database SQL usando un'identità di Microsoft Entra con autorizzazioni per creare altri utenti.

Importante

Solo gli utenti di Microsoft Entra possono creare altri utenti di Microsoft Entra in database SQL di Azure. Nessun utente basato sull'autenticazione SQL, incluso l'amministratore del server, può creare un utente di Microsoft Entra. L'amministratore di Microsoft Entra è l'unico utente che inizialmente può creare altri utenti di Microsoft Entra in database SQL. Dopo che l'amministratore di Microsoft Entra ha creato altri utenti, qualsiasi utente di Microsoft Entra con autorizzazioni appropriate può creare altri utenti di Microsoft Entra.

  1. Creare l'utente DBOwnerApp nel database SQL usando il comando T-SQL seguente:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Per creare almeno altri utenti di Microsoft Entra, è necessaria l'autorizzazione ALTER ANY USER SQL. Questa autorizzazione viene ereditata anche tramite l'appartenenza a db_ownere tramite l'assegnazione come amministratore di Microsoft Entra. Gli esempi seguenti illustrano tre diverse opzioni per assegnare le autorizzazioni a DBOwnerApp che consentono di creare altri utenti di Microsoft Entra nel database.

    È possibile aggiungere DBOwnerApp al db_owner ruolo con sp_addrolemember:

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    È possibile assegnare l'autorizzazione ALTER ANY USER a DBOwnerApp come l'esempio T-SQL seguente:

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    È possibile impostare DBOwnerApp come amministratore di Microsoft Entra. Questa operazione può essere eseguita usando i comandi portale di Azure, PowerShell o dell'interfaccia della riga di comando di Azure. Per altre informazioni, vedere Effettuare il provisioning dell'amministratore di Microsoft Entra (database SQL).

Creare un utente con un'entità servizio

  1. Usare lo script seguente per creare un utente dell'entità servizio Microsoft Entra myapp usando l'entità servizio DBOwnerApp:

    • Sostituire <TenantId> con il valore TenantId raccolto in precedenza.
    • Sostituire <ClientId> con il valore ClientId raccolto in precedenza.
    • Sostituire <ClientSecret> con il segreto client creato in precedenza.
    • Sostituire <ServerName> con il nome del server logico. Se il nome del server è myserver.database.windows.net, sostituire <ServerName> con myserver.
    • Sostituire <database name> con il nome del database 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()
    

    In alternativa, è possibile usare il codice seguente: autenticazione dell'entità servizio Microsoft Entra per database SQL di Azure. Modificare lo script per eseguire l'istruzione CREATE USER [myapp] FROM EXTERNAL PROVIDERDDL . Lo stesso script può essere usato per creare un utente o un gruppo di Microsoft Entra nel database.

  2. Controllare se è presente l'utente myapp nel database eseguendo questo comando:

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

    Verrà visualizzato un output simile al seguente:

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

Passaggi successivi