Samouczek: tworzenie użytkowników entra firmy Microsoft przy użyciu aplikacji Firmy Microsoft Entra

Dotyczy:Azure SQL Database

W tym artykule wyjaśniono, jak skonfigurować jednostkę usługi, aby umożliwić tworzenie użytkowników usługi Microsoft Entra w usłudze Azure SQL Database. Ta funkcja umożliwia programową konfigurację zarządzania dostępem do zasobów usługi Azure SQL dla użytkowników i aplikacji w dzierżawie firmy Microsoft Entra.

Uwaga

Microsoft Entra ID był wcześniej znany jako Azure Active Directory (Azure AD).

Aby uzyskać więcej informacji na temat uwierzytelniania entra firmy Microsoft dla usługi Azure SQL, zobacz artykuł Use Microsoft Entra authentication (Korzystanie z uwierzytelniania entra firmy Microsoft).

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Przypisywanie tożsamości do serwera logicznego
  • Przypisywanie roli Czytelnicy katalogu do tożsamości serwera
  • Rejestrowanie aplikacji w identyfikatorze Entra firmy Microsoft
  • Tworzenie użytkownika bazy danych dla jednostki usługi tej aplikacji w usłudze Azure SQL Database
  • Tworzenie użytkownika bazy danych Entra firmy Microsoft przy użyciu jednostki usługi

Wymagania wstępne

  • Istniejące wdrożenie usługi Azure SQL Database . Załóżmy, że masz działającą usługę SQL Database na potrzeby tego samouczka.
  • Microsoft Entra Global Administrator lub Privileged Role Administrator uprawnienia w dzierżawie, w której znajduje się baza danych SQL.
  • Najnowsza wersja modułu Az.Sql PowerShell.
  • Najnowsza wersja modułu Microsoft.Graph PowerShell.

Przypisywanie tożsamości do serwera logicznego

  1. Połączenie na platformę Azure, określając dzierżawę firmy Microsoft Entra, która hostuje bazę danych SQL. Identyfikator dzierżawy można znaleźć na stronie Przegląd zasobu Microsoft Entra ID w witrynie Azure Portal. Skopiuj identyfikator dzierżawy, a następnie uruchom następujące polecenie programu PowerShell:

    • Zastąp <TenantId> element identyfikatorem dzierżawy.
    Connect-AzAccount -Tenant <TenantId>
    

    Zarejestruj element TenantId do użycia w przyszłości w tym samouczku.

  2. Wygeneruj tożsamość zarządzaną przypisaną przez system i przypisz ją do serwera logicznego na platformie Azure. Wykonaj następujące polecenie programu PowerShell:

    • Zastąp <ResourceGroupName> wartości i <ServerName> swoimi zasobami w poleceniu Set-AzSqlServer . Jeśli nazwa serwera to myserver.database.windows.net, zastąp ciąg <ServerName> ciąg .myserver
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Sprawdź, czy tożsamość serwera została pomyślnie przypisana. Wykonaj następujące polecenie programu PowerShell:

    • Zastąp <ResourceGroupName> wartości i <ServerName> swoimi zasobami. Jeśli nazwa serwera to myserver.database.windows.net, zastąp ciąg <ServerName> ciąg .myserver
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    Dane wyjściowe powinny zawierać PrincipalIdwartości , Typei TenantId. Przypisana tożsamość to PrincipalId.

  4. Tożsamość można również sprawdzić, przechodząc do witryny Azure Portal.

    • W zasobie Microsoft Entra ID przejdź do pozycji Aplikacje dla przedsiębiorstw. Wpisz nazwę serwera logicznego. Identyfikator obiektu wyświetlany w zasobie jest identyfikatorem tożsamości serwera podstawowego.

    Screenshot shows where to find the Object ID for an enterprise application.

Dodawanie tożsamości serwera do roli Czytelnicy katalogu

Tożsamość serwera wymaga uprawnień do wykonywania zapytań dotyczących identyfikatora Entra firmy Microsoft dla funkcji administracyjnych, w tym tworzenia użytkowników i identyfikatorów logowania firmy Microsoft oraz rozszerzania grupy w celu zastosowania uprawnień użytkowników na podstawie członkostwa w grupie Microsoft Entra. Jeśli uprawnienia tożsamości serwera do wykonywania zapytań dotyczących identyfikatora Entra firmy Microsoft zostaną odwołane lub tożsamość serwera zostanie usunięta, uwierzytelnianie Microsoft Entra przestanie działać.

Przypisz uprawnienia kwerendy firmy Microsoft do tożsamości serwera, dodając je do roli Czytelnicy katalogu lub przypisując następujące uprawnienia niższego poziomu programu Microsoft Graph:

Uwaga

Ten skrypt musi być wykonywany przez identyfikator Global Administrator entra firmy Microsoft lub .Privileged Role Administrator

Poniższy skrypt udziela czytelnikom usługi Microsoft Entra Directory uprawnienia do tożsamości reprezentującej serwer logiczny dla usługi Azure SQL Database.

  • Zastąp <TenantId>TenantId element zebranym wcześniej.
  • Zastąp <ServerName> ciąg nazwą serwera logicznego. Jeśli nazwa serwera to myserver.database.windows.net, zastąp ciąg <ServerName> ciąg .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'."
}

Uwaga

Dane wyjściowe tego skryptu wskazują, czy tożsamość jest przypisana do roli Czytelnicy katalogu. Jeśli nie masz pewności, czy udzielono uprawnień, możesz ponownie uruchomić skrypt.

Podobne podejście do przypisywania roli Czytelników katalogów dla usługi SQL Managed Instance można znaleźć w temacie Provision Microsoft Entra admin (SQL Managed Instance) (Aprowizuj administratora firmy Microsoft (SQL Managed Instance).

W środowiskach produkcyjnych powszechną praktyką zarządzania jest przypisanie roli Czytelnicy katalogu do grupy z możliwością przypisania roli w identyfikatorze Entra firmy Microsoft. Następnie właściciele grup mogą dodawać tożsamości zarządzane do grupy. Zapewnia to zasadę najniższych uprawnień i pomija potrzebę roli globalnej Administracja istratora lub roli uprzywilejowanej Administracja istratora, aby przyznać rolę Czytelników katalogu indywidualnie do każdego wystąpienia SQL. Aby uzyskać więcej informacji na temat tej funkcji, zobacz Rola czytelników katalogów w usłudze Microsoft Entra ID dla usługi Azure SQL.

Tworzenie aplikacji w identyfikatorze Entra firmy Microsoft

Rejestrowanie aplikacji. Aby zarejestrować aplikację, musisz mieć co najmniej rolę dewelopera aplikacji Entra ID firmy Microsoft. Aby uzyskać więcej informacji na temat przypisywania ról, zobacz Przypisywanie ról użytkowników w usłudze Microsoft Entra ID.

W tym samouczku są używane dwie jednostki usługi. Pierwsza jednostka usługi, DBOwnerApp, służy do tworzenia innych użytkowników w bazie danych. Druga jednostka usługi myapp to aplikacja, która dbOwnerApp tworzy użytkownika bazy danych w dalszej części tego samouczka.

Aby zarejestrować aplikacje:

  1. W witrynie Azure Portal wybierz pozycję Microsoft Entra ID> Rejestracje aplikacji> Nowa rejestracja.

    Screenshot shows the Register an application page.

    Po utworzeniu rejestracji aplikacji zostanie wygenerowana i wyświetlona wartość identyfikatora aplikacji (klienta). Zapisz tę wartość do użycia w przyszłości w tym samouczku.

    Screenshot of the Azure portal that shows the App ID.

  2. Utwórz wpis tajny klienta dla aplikacji, aby się zalogować. Postępuj zgodnie z instrukcjami przekazywania certyfikatu lub utwórz wpis tajny na potrzeby logowania. Zarejestruj wpis tajny klienta dla aplikacji DBOwnerApp do użycia w przyszłości w tym samouczku.

Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji i jednostki usługi Microsoft Entra przy użyciu portalu, które mogą uzyskiwać dostęp do zasobów.

Tworzenie użytkownika jednostki usługi

Dodaj nowo utworzoną jednostkę usługi DBOwnerApp jako użytkownika w usłudze SQL Database i przypisz do niej uprawnienia.

Połączenie do usługi SQL Database przy użyciu tożsamości firmy Microsoft Entra, która ma uprawnienia do tworzenia innych użytkowników.

Ważne

Tylko użytkownicy firmy Microsoft Entra mogą tworzyć innych użytkowników usługi Microsoft Entra w usłudze Azure SQL Database. Żaden użytkownik oparty na uwierzytelnianiu SQL, w tym administrator serwera, nie może utworzyć użytkownika firmy Microsoft Entra. Administrator firmy Microsoft Entra jest jedynym użytkownikiem, który może początkowo tworzyć innych użytkowników usługi Microsoft Entra w usłudze SQL Database. Po utworzeniu innych użytkowników przez administratora firmy Microsoft Entra każdy użytkownik firmy Microsoft Entra z odpowiednimi uprawnieniami może utworzyć innych użytkowników firmy Microsoft Entra.

  1. Utwórz użytkownika DBOwnerApp w usłudze SQL Database przy użyciu następującego polecenia T-SQL:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Aby utworzyć co najmniej innych użytkowników firmy Microsoft Entra, ALTER ANY USER wymagane jest uprawnienie SQL. To uprawnienie jest również dziedziczone za pośrednictwem członkostwa w db_ownerprogramie i za pośrednictwem przypisania jako administrator firmy Microsoft Entra. W poniższych przykładach przedstawiono trzy różne opcje przypisywania uprawnień do aplikacji DBOwnerApp , które umożliwiają tworzenie innych użytkowników usługi Microsoft Entra w bazie danych.

    Aplikację db_owner DBOwnerApp można dodać do roli za pomocą sp_addrolemember:

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    Możesz przypisać uprawnienie do aplikacji ALTER ANY USER DBOwnerApp, podobnie jak w poniższym przykładzie języka T-SQL:

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    Nazwę DBOwnerApp można ustawić jako administratora firmy Microsoft Entra. Można to zrobić za pomocą poleceń witryny Azure Portal, programu PowerShell lub interfejsu wiersza polecenia platformy Azure. Aby uzyskać więcej informacji, zobacz Provision Microsoft Entra admin (SQL Database) (Aprowizuj administratora firmy Microsoft (SQL Database).

Tworzenie użytkownika z jednostką usługi

  1. Użyj następującego skryptu, aby utworzyć użytkownika jednostki usługi Microsoft Entra przy użyciu jednostki usługi DBOwnerApp:

    • Zastąp <TenantId>TenantId element zebranym wcześniej.
    • Zastąp <ClientId>ClientId element zebranym wcześniej.
    • Zastąp element <ClientSecret> wpisem tajnym klienta utworzonym wcześniej.
    • Zastąp <ServerName> ciąg nazwą serwera logicznego. Jeśli nazwa serwera to myserver.database.windows.net, zastąp ciąg <ServerName> ciąg .myserver
    • Zastąp <database name> ciąg nazwą usługi 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()
    

    Alternatywnie możesz użyć następującego kodu: uwierzytelnianie jednostki usługi Microsoft Entra w usłudze Azure SQL Database. Zmodyfikuj skrypt, aby wykonać instrukcję CREATE USER [myapp] FROM EXTERNAL PROVIDERDDL . Za pomocą tego samego skryptu można utworzyć użytkownika lub grupę firmy Microsoft w bazie danych.

  2. Sprawdź, czy użytkownik myapp istnieje w bazie danych, wykonując następujące polecenie:

    SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId
    FROM sys.database_principals
    WHERE name = 'myapp'
    GO
    

    Powinny zostać wyświetlone następujące dane wyjściowe:

    name	type	type_desc	appId
    myapp	E	EXTERNAL_USER	6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    

Następne kroki