Esercitazione: creare utenti di Microsoft Entra usando applicazioni Microsoft Entra

Si applica a: Database SQL di Azure

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

Nota

Microsoft Entra ID era precedentemente conosciuto 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 amministratori che leggono la directory all'identità del server
  • Registrare un’applicazione in Microsoft Entra ID
  • Creare un utente del database per l'entità servizio dell'applicazione in database SQL di Azure
  • Creare un utente del database di Microsoft Entra con l'entità servizio

Prerequisiti

  • Una distribuzione del database SQL di Azure esistente. Per questa esercitazione si presuppone che si disponga di un database SQL funzionante.
  • Le autorizzazioni Global Administrator o Privileged Role Administrator di Microsoft Entra nel tenant in cui risiede il database SQL.
  • L'ultima versione del modulo PowerShell Az.Sql.
  • L'ultima versione del modulo PowerShell Microsoft.Graph.

Assegnare un'identità al server logico

  1. Connettersi ad Azure, specificando il tenant di Microsoft Entra che ospita il database SQL. È possibile trovare l'ID tenant nella pagina Panoramica della risorsa Microsoft Entra ID nel portale di Azure. Copiare l'ID tenant e quindi eseguire il seguente comando di PowerShell:

    • 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, selezionare Applicazioni aziendali. Digitare il nome del server logico. L'ID oggetto visualizzato nella risorsa è l'ID dell'identità del server primario.

    Screenshot che mostra dove trovare l'ID oggetto per un'applicazione aziendale.

Aggiungere l'identità del server al ruolo amministratori che leggono la 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 gruppo 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 su Microsoft Entra ID 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 amministratori che leggono la directory o assegnando le seguenti autorizzazioni Microsoft Graph di livello inferiore:

Nota

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

Lo script seguente concede l'autorizzazione amministratori che leggono la directory di Microsoft Entra a 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 amministratori che leggono la directory. È possibile eseguire di nuovo lo script se non si è certi che sia stata concessa l'autorizzazione.

Per un approccio simile per l'assegnazione del ruolo Amministratori che leggono la directory per Istanza gestita di SQL, vedere Impostare un amministratore di Microsoft Entra.

Negli ambienti di produzione, una pratica di gestione comune consiste nell'assegnare il ruolo amministratori che leggono la directory a un gruppo assegnabile al ruolo 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 amministratore globale o di un amministratore ruolo con privilegi per concedere singolarmente il ruolo amministratori che leggono la directory a ogni istanza di SQL. Per altre informazioni su questa funzionalità, vedere Ruolo amministratori che leggono la directory in Microsoft Entra ID per Azure SQL.

Creare un'applicazione in Microsoft Entra ID

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

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

Per registrare le applicazioni:

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

    Screenshot che mostra la pagina Registra un'applicazione.

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

    Screenshot del portale di Azure che mostra l’ID app.

  2. Creare un segreto client con cui accedere all'applicazione. Seguire caricare un certificato o creare un segreto per l'accesso. Registrare il segreto client per DBOwnerApp per un uso futuro in questa esercitazione.

Per altre informazioni, consultare Usare il portale per creare un'applicazione Microsoft Entra e un'entità servizio che possano accedere alle risorse.

Creare l'utente dell'entità servizio

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

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

Importante

Solo gli utenti Microsoft Entra possono creare altri utenti Microsoft Entra in database SQL di Azure. Nessun utente basato sull'autenticazione SQL, incluso l'amministratore del server, può creare un utente Microsoft Entra. L'amministratore di Microsoft Entra è l'unico utente che inizialmente può creare altri utenti Microsoft Entra in database SQL. Dopo che l'amministratore di Microsoft Entra ha creato altri utenti, qualsiasi utente Microsoft Entra con autorizzazioni appropriate può creare altri utenti 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 altri utenti di Microsoft Entra, è necessaria almeno l'autorizzazione ALTER ANY USER SQL. Questa autorizzazione viene ereditata anche tramite l'appartenenza a db_owner e 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 ruolo db_owner con sp_addrolemember:

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

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

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    È possibile impostare DBOwnerApp come amministratore 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 Impostare l'amministratore di Microsoft Entra.

Creare un utente con un'entità servizio

  1. Usare lo script seguente per creare un utente entità servizio di 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 di Microsoft Entra per database SQL di Azure. Modificare lo script per eseguire l'istruzione DDL CREATE USER [myapp] FROM EXTERNAL PROVIDER. Lo stesso script può essere usato per creare un utente o un gruppo 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