Sdílet prostřednictvím


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 nebo Privileged 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

  1. 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.

  2. 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 je myserver.database.windows.netnázev vašeho serveru , nahraďte <ServerName> názvem myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. 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 je myserver.database.windows.netnázev vašeho serveru , nahraďte <ServerName> názvem myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    Výstup by vám PrincipalIdměl ukázat , Typea TenantId. Přiřazená identita je PrincipalId.

  4. 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.

    Snímek obrazovky ukazuje, kde najít ID objektu pro podnikovou aplikaci.

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 Administratora .

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říve TenantId shromážděnými.
  • Nahraďte <ServerName> názvem logického serveru. Pokud je myserver.database.windows.netnázev vašeho serveru , nahraďte <ServerName> názvem myserver.
# 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 Zřízení správce Microsoft Entra (SQL Managed Instance).

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í:

  1. Na webu Azure Portal vyberte ID> Microsoft Entra Registrace aplikací> New registration.

    Snímek obrazovky se stránkou Zaregistrovat aplikaci

    Po vytvoření registrace aplikace se vygeneruje a zobrazí hodnota ID aplikace (klienta). Tuto hodnotu si poznamenejte pro budoucí použití v tomto kurzu.

    Snímek obrazovky webu Azure Portal s ID aplikace

  2. 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.

  1. 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
    
  2. 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í v db_ownerprogramu 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 Zřízení správce Microsoft Entra (SQL Database).

Vytvoření uživatele s instančním objektem

  1. 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říve TenantId shromážděnými.
    • Nahraďte <ClientId> dříve ClientId 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 je myserver.database.windows.netnázev vašeho serveru , nahraďte <ServerName> názvem myserver.
    • 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 PROVIDERDDL . Stejný skript lze použít k vytvoření uživatele nebo skupiny Microsoft Entra ve vaší databázi.

  2. 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