Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:Azure SQL Database
Den här artikeln beskriver hur du konfigurerar ett huvudnamn för tjänsten så att den kan skapa Microsoft Entra-användare i Azure SQL Database. Den här funktionen möjliggör programmatisk konfiguration av åtkomsthantering till Azure SQL-resurser för användare och program i din Microsoft Entra-klientorganisation.
Anmärkning
Microsoft Entra-ID kallades tidigare Azure Active Directory (Azure AD).
Mer information om Microsoft Entra-autentisering för Azure SQL finns i artikeln Använda Microsoft Entra-autentisering.
I den här tutorialen lär du dig följande:
- Tilldela en identitet till den logiska servern
- Tilldela rollen Katalogläsare till serveridentiteten
- Registrera ett program i Microsoft Entra ID
- Skapa en databasanvändare för programmets tjänsthuvudnamn i Azure SQL Database
- Skapa en Microsoft Entra-databasanvändare med tjänstens huvudnamn
Förutsättningar
- En befintlig Azure SQL Database-distribution . Vi antar att du har en fungerande SQL-databas för den här handledningen.
- Microsoft Entra-behörigheter
Privileged Role Administratori klientorganisationen där SQL-databasen finns. - Den senaste versionen av Az.Sql PowerShell-modulen.
- Den senaste versionen av Microsoft.Graph PowerShell-modulen.
Tilldela en identitet till den logiska servern
Anslut till Azure och ange den Microsoft Entra-klientorganisation som är värd för din SQL-databas. Klient-ID finns på sidan Översikt för din Microsoft Entra ID-resurs i Azure-portalen. Kopiera tenant-ID och kör sedan följande PowerShell-kommando:
- Ersätt
<TenantId>med ditt Tenant ID.
Connect-AzAccount -Tenant <TenantId>Registrera
TenantIdför framtida användning i den här självstudien.- Ersätt
Generera en systemtilldelad hanterad identitet och tilldela den till den logiska servern i Azure. Kör följande PowerShell-kommando:
- Ersätt
<ResourceGroupName>och<ServerName>med dina resurser i kommandot Set-AzSqlServer . Om servernamnet ärmyserver.database.windows.netersätter du<ServerName>medmyserver.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity- Ersätt
Kontrollera att serveridentiteten har tilldelats framgångsrikt. Kör följande PowerShell-kommando:
- Ersätt
<ResourceGroupName>och<ServerName>med dina resurser. Om servernamnet ärmyserver.database.windows.netersätter du<ServerName>medmyserver.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identityDina utdata bör visa dig
PrincipalId,TypeochTenantId. Den tilldelade identiteten ärPrincipalId.- Ersätt
Du kan också kontrollera identiteten genom att gå till Azure-portalen.
- Gå till Företagsprogram i Microsoft Entra-ID-resursen. Ange namnet på den logiska servern. Objekt-ID:t som visas på resursen är ID för den primära serveridentiteten.
Lägga till serveridentitet i katalogläsarrollen
Serveridentiteten kräver behörighet att fråga Microsoft Entra-ID för administrativa funktioner, vilket innefattar att skapa Microsoft Entra-användare och inloggningar och göra gruppexpansion för att tillämpa användarbehörigheter baserat på deras Microsoft Entra-gruppmedlemskap. Om serveridentitetsbehörigheter för att fråga Microsoft Entra-ID återkallas eller om serveridentiteten tas bort slutar Microsoft Entra-autentiseringen att fungera.
Tilldela Microsoft Entra-frågebehörigheter till serveridentiteten genom att lägga till den i rollen Katalogläsare eller tilldela följande Microsoft Graph-behörigheter på lägre nivå:
Anmärkning
Det här skriptet måste köras av en Microsoft Entra Privileged Role Administrator - eller högre roll.
Följande skript ger Microsoft Entra Directory Readers behörighet till en identitet som representerar den logiska servern för Azure SQL Database.
- Ersätt
<TenantId>medTenantIdsom du samlade in tidigare. - Ersätt
<ServerName>med namnet på den logiska servern. Om servernamnet ärmyserver.database.windows.netersätter du<ServerName>medmyserver.
# 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 **Privileged Role Administrator** or higher 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'."
}
Anmärkning
Utdata från det här skriptet anger om identiteten har tilldelats rollen Katalogläsare . Du kan köra skriptet igen om du är osäker på om behörigheten har beviljats.
En liknande metod för hur du tilldelar katalogläsarrollen för SQL Managed Instance finns i Ange Microsoft Entra-administratör.
I produktionsmiljöer är en vanlig hanteringspraxis att tilldela rollen Katalogläsare till en rolltilldelningsbar grupp i Microsoft Entra-ID. Sedan kan gruppägare lägga till hanterade identiteter i gruppen. Detta upprätthåller principen om minsta behörighet och kringgår behovet av att en privilegierad rolladministratör beviljar katalogläsarrollen individuellt till varje SQL-instans. Mer information om den här funktionen finns i Katalogläsarroll i Microsoft Entra-ID för Azure SQL.
Skapa ett program i Microsoft Entra-ID
Registrera dina applikationer. Om du vill registrera en app behöver du minst rollen Applikationsutvecklare för Microsoft Entra ID. Mer information om hur du tilldelar roller finns i Tilldela användarroller i Microsoft Entra-ID.
I denna handledning används två tjänsteprincipaler. Det första tjänstens huvudnamn, DBOwnerApp, används för att skapa andra användare i databasen. Det andra tjänstens huvudnamn, myapp, är programmet som DBOwnerApp skapar en databasanvändare för senare i den här självstudien.
Registrera dina program:
I Azure-portalen väljer du Microsoft Entra ID>Appregistreringar>Ny registrering.
När appregistreringen har skapats genereras och visas värdet program-ID (klient-ID ). Registrera det här värdet för framtida bruk i den här handledningen.
Skapa en klienthemlighet för programmet att logga in med. Följ ladda upp ett certifikat eller skapa en hemlighet för inloggning. Registrera klienthemligheten för DBOwnerApp för framtida användning i den här självstudien.
Mer information hittar du i Använd portalen för att skapa ett Microsoft Entra-program och tjänstehuvudnamn som kan komma åt resurser.
Skapa tjänstens principanvändare
Lägg till det nyligen skapade tjänstens huvudnamn , DBOwnerApp, som en användare i SQL Database och tilldela behörigheter till den.
Anslut till din SQL Database med hjälp av en Microsoft Entra-identitet som har behörighet att skapa andra användare.
Viktigt!
Endast Microsoft Entra-användare kan skapa andra Microsoft Entra-användare i Azure SQL Database. Inga användare baserat på SQL-autentisering, inklusive serveradministratören, kan skapa en Microsoft Entra-användare. Microsoft Entra-administratören är den enda användare som först kan skapa andra Microsoft Entra-användare i SQL Database. När Microsoft Entra-administratören har skapat andra användare kan alla Microsoft Entra-användare med rätt behörighet skapa andra Microsoft Entra-användare.
Skapa användaren DBOwnerApp i SQL Database med följande T-SQL-kommando:
CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER GOFör att skapa andra Microsoft Entra-användare krävs minst
ALTER ANY USERSQL-behörigheten. Den här behörigheten ärvs också genom medlemskap idb_owneroch genom tilldelning som Microsoft Entra-administratör. I följande exempel visas tre olika alternativ för att tilldela behörigheter till DBOwnerApp som gör att den kan skapa andra Microsoft Entra-användare i databasen.Du kan lägga till DBOwnerApp i
db_ownerrollen med sp_addrolemember:EXEC sp_addrolemember 'db_owner', [DBOwnerApp] GODu kan tilldela behörigheten
ALTER ANY USERtill DBOwnerApp som följande T-SQL-exempel:GRANT ALTER ANY USER TO [DBOwnerApp] GODu kan ange DBOwnerApp som Microsoft Entra-administratör. Detta kan göras med hjälp av Azure-portalen, PowerShell eller Azure CLI-kommandon. Mer information finns i Ange Microsoft Entra-administratör.
Skapa en användare med tjänstens huvudnamn
Använd följande skript för att skapa en Microsoft Entra-tjänsteanvändare myapp med hjälp av tjänsthuvudet DBOwnerApp:
- Ersätt
<TenantId>med denTenantIdsom du samlade in tidigare. - Ersätt
<ClientId>medClientIdsom du samlade in tidigare. - Ersätt
<ClientSecret>med din klienthemlighet som skapades tidigare. - Ersätt
<ServerName>med namnet på den logiska servern. Om servernamnet ärmyserver.database.windows.netersätter du<ServerName>medmyserver. - Ersätt
<database name>med ditt SQL Database-namn.
# 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()Du kan också använda följande kod: Microsoft Entra tjänsthuvudautentisering till Azure SQL Database. Ändra skriptet för att köra DDL-instruktionen
CREATE USER [myapp] FROM EXTERNAL PROVIDER. Samma skript kan användas för att skapa en Microsoft Entra-användare eller -grupp i databasen.- Ersätt
Kontrollera om användarens myapp finns i databasen genom att köra följande kommando:
SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId FROM sys.database_principals WHERE name = 'myapp' GODu bör se liknande utdata:
name type type_desc appId myapp E EXTERNAL_USER aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
Relaterat innehåll
- Microsoft Entra tjänsthuvudman med Azure SQL
- Vad är hanterade identiteter för Azure-resurser?
- Så här använder du hanterade identiteter för App Service och Azure Functions
- Microsoft Entra-tjänstens huvudnamnsautentisering till SQL DB – kodexempel
- Översikt över program- och tjänstobjekt i Microsoft Entra ID
- Skapa ett Huvudnamn för Azure-tjänsten med Azure PowerShell
- Katalogläsarroll i Microsoft Entra-ID för Azure SQL