Dela via


Självstudie: Skapa Microsoft Entra-användare med hjälp av Microsoft Entra-program

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 Administrator 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

  1. 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 TenantId för framtida användning i den här självstudien.

  2. 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 är myserver.database.windows.netersätter du <ServerName> med myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Kontrollera att serveridentiteten har tilldelats framgångsrikt. Kör följande PowerShell-kommando:

    • Ersätt <ResourceGroupName> och <ServerName> med dina resurser. Om servernamnet är myserver.database.windows.netersätter du <ServerName> med myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    Dina utdata bör visa dig PrincipalId, Typeoch TenantId. Den tilldelade identiteten är PrincipalId.

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

    Skärmbild som visar var du hittar objekt-ID:t för ett företagsprogram.

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> med TenantId som du samlade in tidigare.
  • Ersätt <ServerName> med namnet på den logiska servern. Om servernamnet är myserver.database.windows.netersätter du <ServerName> med 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 **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:

  1. I Azure-portalen väljer du Microsoft Entra ID>Appregistreringar>Ny registrering.

    Skärmbild som visar sidan Registrera ett program.

    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.

    Skärmbild av Azure-portalen som visar app-ID:t.

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

  1. Skapa användaren DBOwnerApp i SQL Database med följande T-SQL-kommando:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. 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 i db_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_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 Ange Microsoft Entra-administratör.

Skapa en användare med tjänstens huvudnamn

  1. 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 den TenantId som du samlade in tidigare.
    • Ersätt <ClientId> med ClientId som du samlade in tidigare.
    • Ersätt <ClientSecret> med din klienthemlighet som skapades tidigare.
    • Ersätt <ServerName> med namnet på den logiska servern. Om servernamnet är myserver.database.windows.netersätter du <ServerName> med myserver.
    • 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.

  2. 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 liknande utdata:

    name    type    type_desc    appId
    myapp    E    EXTERNAL_USER    aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb