Esercitazione: Creare utenti Azure AD con applicazioni di Azure AD

Si applica a: Database SQL di Azure

Questo articolo illustra il processo di creazione di utenti Azure AD nel database SQL di Azure con entità servizio di Azure (applicazioni di Azure AD). Questa funzionalità esiste già in Istanza gestita di SQL di Azure, ma viene ora introdotta in Azure SQL Database. Per supportare questo scenario, è necessario generare un'identità Azure AD e assegnarla al server logico SQL di Azure.

Per altre informazioni sull'autenticazione di Azure AD per Azure SQL, vedere l'articolo Usare l'autenticazione di Azure Active Directory.

In questa esercitazione verranno illustrate le procedure per:

  • Assegnare un'identità al server logico SQL di Azure
  • Assegnare il ruolo con autorizzazioni di lettura nella directory all'identità del server logico SQL
  • Creare un'entità servizio (un'applicazione di Azure AD) in Azure AD
  • Creare un utente dell'entità servizio nel database SQL di Azure
  • Creare un utente Azure AD diverso nel database SQL usando un utente dell'entità servizio di Azure AD

Prerequisiti

  • Distribuzione del database Azure SQL esistente. Per questa esercitazione si presuppone che si disponga di un database SQL funzionante.
  • Accesso a un'istanza di Azure Active Directory già esistente.
  • Un modulo Az.Sql 2.9.0 o versioni successive se si usa PowerShell per configurare una singola applicazione di Azure AD come amministratore Azure AD per Azure SQL. Assicurarsi di aver effettuato l'aggiornamento al modulo più recente.

Assegnare un'identità al server logico SQL di Azure

  1. Connettersi ad Azure Active Directory. Sarà necessario trovare l'ID tenant. A tale scopo, passare al portale di Azure e quindi alla risorsa Azure Active Directory. Nel riquadro Panoramica dovrebbe essere visualizzato il valore di ID tenant. Eseguire il comando 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à Azure AD e assegnarla al server logico SQL di Azure. Eseguire questo comando PowerShell:

    • Sostituire <resource group> e <server name> con le proprie risorse. Se il nome del server è myserver.database.windows.net, sostituire <server name> con myserver.
    Set-AzSqlServer -ResourceGroupName <resource group> -ServerName <server name> -AssignIdentity
    

    Per altre informazioni, vedere il comando Set-AzSqlServer.

    Importante

    Se per il server logico SQL di Azure è configurata un'identità Azure AD, è necessario concedere all'identità l'autorizzazione Ruoli con autorizzazioni di lettura nella directory. Questo procedura verrà illustrata nella sezione seguente. Non ignorare questa procedura perché l'autenticazione Azure AD smetterà di funzionare.

    Con il supporto di Microsoft Graph per Azure SQL, il ruolo Lettori directory può essere sostituito con usando autorizzazioni di livello inferiore. Per altre informazioni, vedere Identità gestita assegnata dall'utente in Azure AD per Azure SQL.

    Se un'identità gestita assegnata dal sistema o assegnata dall'utente viene usata come identità del server o dell'istanza, l'eliminazione dell'identità comporterà l'impossibilità del server o dell'istanza di accedere a Microsoft Graph. L'autenticazione di Azure AD e altre funzioni avranno esito negativo. Per ripristinare la funzionalità di Azure AD, è necessario assegnare un nuovo SMI o UMI al server con autorizzazioni appropriate.

    • Se è stato usato precedentemente il comando New-AzSqlServer con il parametro AssignIdentity per la creazione di un nuovo server SQL, sarà necessario eseguire successivamente Set-AzSqlServer come comando separato per abilitare questa proprietà nell'infrastruttura di Azure.
  3. Verificare che l'identità del server sia stata assegnata correttamente. Eseguire questo comando PowerShell:

    • Sostituire <resource group> e <server name> con le proprie risorse. Se il nome del server è myserver.database.windows.net, sostituire <server name> con myserver.
    $xyz = Get-AzSqlServer  -ResourceGroupName <resource group> -ServerName <server name>
    $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 Azure Active Directory passare ad Applicazioni aziendali. Digitare il nome del server logico SQL. Si noterà che presenta un ID oggetto associato alla risorsa.

    object-id

Assegnare il ruolo con autorizzazioni di lettura nella directory all'identità del server logico SQL

Per consentire il corretto funzionamento dell'identità Azure AD assegnata per Azure SQL, è necessario concedere l'autorizzazione Directory Readers di Azure AD all'identità del server.

Per concedere questa autorizzazione obbligatoria, eseguire lo script seguente.

Nota

Questo script deve essere eseguito da un utente Global Administrator o Privileged Roles Administrator di Azure AD.

È possibile assegnare il Directory Readers ruolo a un gruppo in Azure AD. I proprietari del gruppo possono quindi aggiungere l'identità gestita come membro di questo gruppo, evitando così la necessità di un Global Administrator o Privileged Roles Administrator che conceda il ruolo Directory Readers. Per altre informazioni su questa funzionalità, vedere Ruolo con autorizzazioni di lettura nella directory in Azure Active Directory per Azure SQL.

  • Sostituire <TenantId> con il valore TenantId raccolto in precedenza.
  • Sostituire <server name> con il nome del server logico SQL. Se il nome del server è myserver.database.windows.net, sostituire <server name> con myserver.
# This script grants Azure "Directory Readers" permission to a Service Principal representing the Azure SQL logical server
# It can be executed only by a "Global Administrator" or "Privileged Roles Administrator" type of user.
# To check if the "Directory Readers" permission was granted, execute this script again

Import-Module AzureAD
Connect-AzureAD -TenantId "<TenantId>"    #Enter your actual TenantId
$AssignIdentityName = "<server name>"     #Enter Azure SQL logical server name
 
# Get Azure AD role "Directory Users" and create if it doesn't exist
$roleName = "Directory Readers"
$role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq $roleName}
if ($role -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-AzureADDirectoryRoleTemplate | Where-Object {$_.displayName -eq $roleName}
    Enable-AzureADDirectoryRole -RoleTemplateId $roleTemplate.ObjectId
    $role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq $roleName}
}
 
# Get service principal for server
$roleMember = Get-AzureADServicePrincipal -SearchString $AssignIdentityName
$roleMember.Count
if ($roleMember -eq $null) {
    Write-Output "Error: No Service Principals with name '$($AssignIdentityName)', make sure that AssignIdentityName parameter was entered correctly."
    exit
}

if (-not ($roleMember.Count -eq 1)) {
    Write-Output "Error: More than one service principal with name pattern '$($AssignIdentityName)'"
    Write-Output "Dumping selected service principals...."
    $roleMember
    exit
}
 
# Check if service principal is already member of readers role
$allDirReaders = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId
$selDirReader = $allDirReaders | where{$_.ObjectId -match $roleMember.ObjectId}
 
if ($selDirReader -eq $null) {
    # Add principal to readers role
    Write-Output "Adding service principal '$($AssignIdentityName)' to 'Directory Readers' role'..."
    Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId $roleMember.ObjectId
    Write-Output "'$($AssignIdentityName)' service principal added to 'Directory Readers' role'..."
 
    #Write-Output "Dumping service principal '$($AssignIdentityName)':"
    #$allDirReaders = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId
    #$allDirReaders | where{$_.ObjectId -match $roleMember.ObjectId}
} else {
    Write-Output "Service principal '$($AssignIdentityName)' is already member of 'Directory Readers' role'."
}

Nota

L'output dello script precedente indicherà se è stato concesso all'identità il ruolo con autorizzazioni di lettura nella directory. È possibile eseguire di nuovo lo script se non si è certi che sia stata concessa l'autorizzazione.

Per un approccio simile per l'impostazione dell'autorizzazione Ruoli con autorizzazioni di lettura nella directory per Istanza gestita di SQL, vedere Effettuare il provisioning di amministrazione di Azure AD (Istanza gestita di SQL).

Creare un'entità servizio (un'applicazione di Azure AD) in Azure AD

Registrare l'applicazione se non è già stato fatto. Per registrare un'app, è necessario essere un amministratore di Azure AD o un utente a cui è stato assegnato il ruolo Sviluppatore di applicazioni di Azure AD. Per altre informazioni sull'assegnazione dei ruoli, vedere Assegnare ruoli di amministratore e non amministratore agli utenti con Azure Active Directory.

Completando la registrazione di un'app viene generato e visualizzato un ID applicazione.

Per registrare l'applicazione:

  1. Nella portale di Azure selezionare Azure Active Directory>Registrazioni app>Nuova registrazione.

    Registrazione delle app

    Dopo aver creato la registrazione dell'app, il valore dell'ID applicazione viene generato e visualizzato.

    ID applicazione visualizzato

  2. Sarà anche necessario creare un segreto client per l'accesso. Seguire le indicazioni fornite qui per caricare un certificato o creare un segreto per l'accesso.

  3. Registrare quanto segue dalla registrazione dell'applicazione. Dovrebbe essere disponibile nel riquadro Panoramica:

    • ID applicazione
    • ID tenant: deve essere come quello precedente

In questa esercitazione si useranno AppSP come entità servizio principale e myapp come secondo utente entità servizio che verrà creato in Azure SQL da AppSP. Sarà necessario creare due applicazioni, AppSP e myapp.

Per altre informazioni su come creare un'applicazione di Azure AD, vedere l'articolo Procedura: Usare il portale per creare un'entità servizio e applicazione di Azure AD che possano accedere alle risorse.

Creare l'utente dell'entità servizio nel database SQL di Azure

Una volta creata un'entità servizio in Azure AD, creare l'utente nel database SQL. È necessario connettersi al database SQL con un account di accesso valido con le autorizzazioni per la creazione di utenti nel database.

Importante

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

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

    CREATE USER [AppSP] FROM EXTERNAL PROVIDER
    GO
    
  2. Concedere l'autorizzazione db_owner ad AppSP in modo che l'utente possa creare altri utenti Azure AD nel database.

    EXEC sp_addrolemember 'db_owner', [AppSP]
    GO
    

    Per altre informazioni, vedere sp_addrolemember.

    In alternativa, è possibile concedere l'autorizzazione ALTER ANY USER anziché assegnare il ruolo db_owner. In questo modo l'entità servizio potrà aggiungere altri utenti Azure AD.

    GRANT ALTER ANY USER TO [AppSp]
    GO
    

    Nota

    L'impostazione precedente non è obbligatoria se AppSP è impostata come amministratore Azure AD per il server. Per impostare l'entità servizio come amministratore AD per il server logico SQL, è possibile usare i comandi del portale di Azure, di PowerShell o dell'interfaccia della riga di comando di Azure. Per altre informazioni, vedere Effettuare il provisioning di amministrazione di Azure AD (database SQL).

Creare un utente Azure AD nel database SQL usando un'entità servizio di Azure AD

Importante

L'entità servizio usata per accedere al database SQL deve disporre di un segreto client. Se non dispone di un segreto client, seguire il passaggio 2 in Creare un'entità servizio (un'applicazione di Azure AD) in Azure AD. Questo segreto client deve essere aggiunto come parametro di input nello script seguente.

  1. Usare lo script seguente per creare un utente entità servizio di Azure AD MyApp usando l'entità servizio AppSP.

    • 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 <server name> con il nome del server logico SQL. Se il nome del server è myserver.database.windows.net, sostituire <server name> con myserver.
    • Sostituire <database name> con il nome del database SQL.
    # PowerShell script for creating a new SQL user called myapp using application AppSP with secret
    # AppSP is part of an Azure AD admin for the Azure SQL server below
    
    # Download latest  MSAL  - https://www.powershellgallery.com/packages/MSAL.PS
    Import-Module MSAL.PS
    
    $tenantId = "<TenantId>"   # tenantID (Azure Directory ID) were AppSP resides
    $clientId = "<ClientId>"   # AppID also ClientID for AppSP     
    $clientSecret = "<ClientSecret>"   # Client secret for AppSP 
    $scopes = "https://database.windows.net/.default" # The end-point
    
    $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 = "<server name>"    # Azure SQL 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 l'esempio di codice nel blog Azure AD Service Principal authentication to SQL DB - Code Sample (Autenticazione dell'entità servizio di Azure AD nel database SQL - Esempio di codice). Modificare lo script per eseguire un'istruzione DDL CREATE USER [myapp] FROM EXTERNAL PROVIDER. Lo stesso script può essere usato per creare un normale utente di Azure AD o un gruppo in database SQL.

  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