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.
Kommentar
Microsoft Entra-ID är det nya namnet för Azure Active Directory (Azure AD). Vi uppdaterar dokumentationen just nu.
Mer information om Microsoft Entra-autentisering för Azure SQL finns i artikeln Använda Microsoft Entra-autentisering.
I den här självstudien lär du dig att:
- 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 Database för den här självstudien.
- Microsoft Entra
Global Administrator
ellerPrivileged Role Administrator
behörigheter i 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. Klientorganisations-ID:t finns på sidan Översikt för din Microsoft Entra-ID-resurs i Azure-portalen. Kopiera klientorganisations-ID:t och kör sedan följande PowerShell-kommando:
- Ersätt
<TenantId>
med ditt klientorganisations-ID.
Connect-AzAccount -Tenant <TenantId>
TenantId
Registrera fö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.net
ersätter du<ServerName>
medmyserver
.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
- Ersätt
Kontrollera att serveridentiteten har tilldelats. Kör följande PowerShell-kommando:
- Ersätt
<ResourceGroupName>
och<ServerName>
med dina resurser. Om servernamnet ärmyserver.database.windows.net
ersätter du<ServerName>
medmyserver
.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identity
Dina utdata bör visa dig
PrincipalId
,Type
ochTenantId
. Den tilldelade identitetenPrincipalId
är .- 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å:
Kommentar
Det här skriptet måste köras av ett Microsoft Entra-ID Global Administrator
eller ett Privileged Role Administrator
.
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>
med dinTenantId
insamlade tidigare. - Ersätt
<ServerName>
med namnet på den logiska servern. Om servernamnet ärmyserver.database.windows.net
ersä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 **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'."
}
Kommentar
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 Etablera Microsoft Entra-administratör (SQL Managed Instance).
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 global administratör eller 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 program. Om du vill registrera en app behöver du minst rollen Programutvecklare för Microsoft Entra-ID. Mer information om hur du tilldelar roller finns i Tilldela användarroller i Microsoft Entra-ID.
I den här självstudien används två huvudnamn för tjänsten. 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.
Så här registrerar du 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 användning i den här självstudien.
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 finns i Använda portalen för att skapa ett Microsoft Entra-program och tjänstens huvudnamn som kan komma åt resurser.
Skapa tjänstens huvudnamnsanvä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 GO
För att skapa andra Microsoft Entra-användare krävs minst
ALTER ANY USER
SQL-behörigheten. Den här behörigheten ärvs också genom medlemskap idb_owner
och 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_owner
rollen med sp_addrolemember:EXEC sp_addrolemember 'db_owner', [DBOwnerApp] GO
Du kan tilldela behörigheten
ALTER ANY USER
till DBOwnerApp som följande T-SQL-exempel:GRANT ALTER ANY USER TO [DBOwnerApp] GO
Du 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 Etablera Microsoft Entra-administratör (SQL Database).
Skapa en användare med tjänstens huvudnamn
Använd följande skript för att skapa en Microsoft Entra-tjänsthuvudnamnsanvändare med hjälp av tjänstens huvudnamn DBOwnerApp:
- Ersätt
<TenantId>
med dinTenantId
insamlade tidigare. - Ersätt
<ClientId>
med dinClientId
insamlade tidigare. - Ersätt
<ClientSecret>
med din klienthemlighet som skapades tidigare. - Ersätt
<ServerName>
med namnet på den logiska servern. Om servernamnet ärmyserver.database.windows.net
ersä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änstens huvudnamnsautentisering 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' GO
Du bör se utdata som liknar följande:
name type type_desc appId myapp E EXTERNAL_USER 6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Nästa steg
- Microsoft Entra-tjänstens huvudnamn 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