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
oPrivileged 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
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.- Sostituire
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>
conmyserver
.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
- Sostituire
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>
conmyserver
.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identity
L'output dovrebbe mostrare
PrincipalId
,Type
eTenantId
. L'identità assegnata èPrincipalId
.- Sostituire
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.
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 valoreTenantId
raccolto in precedenza. - Sostituire
<ServerName>
con il nome del server logico. Se il nome del server èmyserver.database.windows.net
, sostituire<ServerName>
conmyserver
.
# 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:
Nel portale di Azure, selezionare Microsoft Entra ID>Registrazioni app>Nuova registrazione.
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.
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.
Creare l'utente DBOwnerApp nel database SQL usando il comando T-SQL seguente:
CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER GO
Per creare altri utenti di Microsoft Entra, è necessaria almeno l'autorizzazione
ALTER ANY USER
SQL. Questa autorizzazione viene ereditata anche tramite l'appartenenza adb_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
Usare lo script seguente per creare un utente entità servizio di Microsoft Entra myApp usando l'entità servizio DBOwnerApp:
- Sostituire
<TenantId>
con il valoreTenantId
raccolto in precedenza. - Sostituire
<ClientId>
con il valoreClientId
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>
conmyserver
. - 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.- Sostituire
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
- Entità servizio Microsoft Entra con Azure SQL
- Informazioni sulle identità gestite per le risorse di Azure
- Come usare le identità gestite nel servizio app e in Funzioni di Azure
- Autenticazione dell'entità servizio di Microsoft Entra nel database SQL - Esempio di codice
- Oggetti applicazione ed entità servizio in Microsoft Entra ID
- Creare un'entità servizio di Azure con Azure PowerShell
- Ruolo amministratori che leggono la directory in Microsoft Entra ID per Azure SQL