Kurz: Vytváření uživatelů Microsoft Entra pomocí aplikací Microsoft Entra
Platí pro: Azure SQL Database
Tento článek vysvětluje, jak nakonfigurovat instanční objekt, aby mohl vytvářet uživatele Microsoft Entra ve službě Azure SQL Database. Tato funkce umožňuje programovou konfiguraci správy přístupu k prostředkům Azure SQL pro uživatele a aplikace ve vašem tenantovi Microsoft Entra.
Poznámka:
ID Microsoft Entra se dříve označovalo jako Azure Active Directory (Azure AD).
Další informace o ověřování Microsoft Entra pro Azure SQL naleznete v článku Použití ověřování Microsoft Entra.
V tomto kurzu se naučíte:
- Přiřazení identity logickému serveru
- Přiřazení role Čtenáři adresáře k identitě serveru
- Registrace aplikace v Microsoft Entra ID
- Vytvoření uživatele databáze pro instanční objekt této aplikace ve službě Azure SQL Database
- Vytvoření uživatele databáze Microsoft Entra pomocí instančního objektu
Požadavky
- Existující nasazení služby Azure SQL Database . Předpokládáme, že pro tento kurz máte funkční službu SQL Database.
- Microsoft Entra
Global Administrator
neboPrivileged Role Administrator
oprávnění v tenantovi, ve kterém se nachází vaše databáze SQL. - Nejnovější verze modulu Az.Sql PowerShell.
- Nejnovější verze modulu Microsoft.Graph PowerShell.
Přiřazení identity logickému serveru
Připojte se k Azure a zadejte tenanta Microsoft Entra, který je hostitelem vaší databáze SQL. ID tenanta najdete na stránce Přehled vašeho prostředku Microsoft Entra ID na webu Azure Portal. Zkopírujte ID tenanta a spusťte následující příkaz PowerShellu:
- Nahraďte
<TenantId>
ID tenanta.
Connect-AzAccount -Tenant <TenantId>
Poznamenejte si
TenantId
budoucí použití v tomto kurzu.- Nahraďte
Vygenerujte spravovanou identitu přiřazenou systémem a přiřaďte ji logickému serveru v Azure. Spusťte následující příkaz PowerShellu:
- Nahraďte
<ResourceGroupName>
a<ServerName>
nahraďte prostředky v příkazu Set-AzSqlServer . Pokud jemyserver.database.windows.net
název vašeho serveru , nahraďte<ServerName>
názvemmyserver
.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
- Nahraďte
Zkontrolujte, jestli se identita serveru úspěšně přiřadila. Spusťte následující příkaz PowerShellu:
- Nahraďte
<ResourceGroupName>
prostředky a<ServerName>
nahraďte je. Pokud jemyserver.database.windows.net
název vašeho serveru , nahraďte<ServerName>
názvemmyserver
.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identity
Výstup by vám
PrincipalId
měl ukázat ,Type
aTenantId
. Přiřazená identita jePrincipalId
.- Nahraďte
Identitu můžete také zkontrolovat na webu Azure Portal.
- V prostředku Microsoft Entra ID přejděte do podnikových aplikací. Zadejte název logického serveru. ID objektu, které se zobrazí v prostředku, je ID identity primárního serveru.
Přidání identity serveru do role Čtenáři adresáře
Identita serveru vyžaduje oprávnění k dotazování Microsoft Entra ID pro funkce pro správu, včetně vytváření uživatelů a přihlášení Microsoft Entra, a rozšíření skupiny pro použití uživatelských oprávnění na základě členství ve skupině Microsoft Entra. Pokud dojde k odvolání oprávnění identity serveru k dotazování id Microsoft Entra nebo se odstraní identita serveru, přestane ověřování Microsoft Entra fungovat.
Přiřaďte identitě serveru oprávnění dotazu Microsoft Entra tak, že je přidáte do role Čtenář adresáře nebo přiřadíte následující oprávnění Microsoft Graphu nižší úrovně:
Poznámka:
Tento skript musí být spuštěn pomocí Microsoft Entra ID Global Administrator
nebo Privileged Role Administrator
a .
Následující skript uděluje oprávnění Microsoft Entra Directory Readers identitě, která představuje logický server pro Azure SQL Database.
- Nahraďte
<TenantId>
dříveTenantId
shromážděnými. - Nahraďte
<ServerName>
názvem logického serveru. Pokud jemyserver.database.windows.net
název vašeho serveru , nahraďte<ServerName>
názvemmyserver
.
# 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'."
}
Poznámka:
Výstup z tohoto skriptu označuje, jestli je identita přiřazena k roli Čtenáři adresáře. Skript můžete znovu spustit, pokud si nejste jisti, jestli bylo uděleno oprávnění.
Podobný přístup k přiřazení role Čtenář adresáře pro službu SQL Managed Instance najdete v tématu Nastavení správce Microsoft Entra.
V produkčních prostředích je běžným postupem správy přiřadit roli Čtenáři adresáře ke skupině přiřaditelné roli role v Microsoft Entra ID. Vlastníci skupin pak můžou do skupiny přidávat spravované identity. To zachovává princip nejnižších oprávnění a obchází potřebu globálního správce nebo správce privilegovaných rolí udělit roli Čtenáři adresáře jednotlivě každé instanci SQL. Další informace o této funkci naleznete v tématu Role Čtenář adresáře v Microsoft Entra ID pro Azure SQL.
Vytvoření aplikace v Microsoft Entra ID
Zaregistrujte své aplikace. K registraci aplikace potřebujete alespoň roli Vývojáře aplikací Microsoft Entra ID. Další informace o přiřazování rolí naleznete v tématu Přiřazení uživatelských rolí v Microsoft Entra ID.
Tento kurz používá dva instanční objekty. První instanční objekt DBOwnerApp se používá k vytvoření dalších uživatelů v databázi. Druhý instanční objekt, myapp, je aplikace, kterou DBOwnerApp vytvoří uživatele databáze pro pozdější účely tohoto kurzu.
Registrace aplikací:
Na webu Azure Portal vyberte ID> Microsoft Entra Registrace aplikací> New registration.
Po vytvoření registrace aplikace se vygeneruje a zobrazí hodnota ID aplikace (klienta). Tuto hodnotu si poznamenejte pro budoucí použití v tomto kurzu.
Vytvořte tajný klíč klienta pro aplikaci, pomocí které se má přihlásit. Postupujte podle pokynů k nahrání certifikátu nebo vytvořte tajný kód pro přihlášení. Poznamenejte si tajný klíč klienta pro DBOwnerApp pro budoucí použití v tomto kurzu.
Další informace najdete na portálu k vytvoření aplikace Microsoft Entra a instančního objektu, který má přístup k prostředkům.
Vytvoření uživatele instančního objektu
Přidejte nově vytvořený instanční objekt DBOwnerApp jako uživatele ve službě SQL Database a přiřaďte mu oprávnění.
Připojte se ke službě SQL Database pomocí identity Microsoft Entra, která má oprávnění k vytváření dalších uživatelů.
Důležité
V Azure SQL Database můžou vytvářet další uživatele Microsoft Entra pouze uživatelé Microsoft Entra. Žádný uživatel založený na ověřování SQL, včetně správce serveru, nemůže vytvořit uživatele Microsoft Entra. Správce Microsoft Entra je jediný uživatel, který může zpočátku vytvářet další uživatele Microsoft Entra ve službě SQL Database. Jakmile správce Microsoft Entra vytvoří další uživatele, může každý uživatel Microsoft Entra s odpovídajícími oprávněními vytvářet další uživatele Microsoft Entra.
Vytvořte uživatele DBOwnerApp ve službě SQL Database pomocí následujícího příkazu T-SQL:
CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER GO
Aby bylo možné vytvořit další uživatele Microsoft Entra,
ALTER ANY USER
vyžaduje se minimálně oprávnění SQL. Toto oprávnění se také dědí prostřednictvím členství vdb_owner
programu a prostřednictvím přiřazení jako správce Microsoft Entra. Následující příklady ukazují tři různé možnosti přiřazení oprávnění k DBOwnerApp , které umožňují vytvořit další uživatele Microsoft Entra v databázi.Do role můžete přidat dbOwnerApp
db_owner
pomocí sp_addrolemember:EXEC sp_addrolemember 'db_owner', [DBOwnerApp] GO
Oprávnění můžete přiřadit
ALTER ANY USER
dbOwnerApp, jako je následující ukázka T-SQL:GRANT ALTER ANY USER TO [DBOwnerApp] GO
Můžete nastavit DBOwnerApp jako správce Microsoft Entra. Můžete to provést pomocí webu Azure Portal, PowerShellu nebo příkazů Azure CLI. Další informace naleznete v tématu Nastavení správce Microsoft Entra.
Vytvoření uživatele s instančním objektem
Pomocí následujícího skriptu vytvořte uživatele instančního objektu Microsoft Entra myapp pomocí instančního objektu DBOwnerApp:
- Nahraďte
<TenantId>
dříveTenantId
shromážděnými. - Nahraďte
<ClientId>
dříveClientId
shromážděnými. - Nahraďte
<ClientSecret>
dříve vytvořeným tajným kódem klienta. - Nahraďte
<ServerName>
názvem logického serveru. Pokud jemyserver.database.windows.net
název vašeho serveru , nahraďte<ServerName>
názvemmyserver
. - Nahraďte
<database name>
názvem služby SQL Database.
# 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()
Případně můžete použít následující kód: Ověřování instančního objektu Microsoft Entra ve službě Azure SQL Database. Upravte skript tak, aby se spustil příkaz
CREATE USER [myapp] FROM EXTERNAL PROVIDER
DDL . Stejný skript lze použít k vytvoření uživatele nebo skupiny Microsoft Entra ve vaší databázi.- Nahraďte
Spuštěním následujícího příkazu zkontrolujte, jestli uživatel myapp v databázi existuje:
SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId FROM sys.database_principals WHERE name = 'myapp' GO
Měl by se zobrazit podobný výstup:
name type type_desc appId myapp E EXTERNAL_USER 6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Další kroky
- Instanční objekt Microsoft Entra s Azure SQL
- Co jsou spravované identity pro prostředky Azure?
- Jak používat spravované identity pro App Service a Azure Functions
- Ověřování instančního objektu Microsoft Entra do databáze SQL – ukázka kódu
- Přehled objektů aplikace a instančního objektu v Microsoft Entra ID
- Vytvoření instančního objektu Azure pomocí Azure PowerShellu
- Role Čtenáři adresářů v Microsoft Entra ID pro Azure SQL