Öğretici: Microsoft Entra uygulamaları kullanarak Microsoft Entra kullanıcıları oluşturma

Şunlar için geçerlidir:Azure SQL Veritabanı

Bu makalede, Azure SQL Database'da Microsoft Entra kullanıcıları oluşturabilmesi için hizmet sorumlusu yapılandırma adımları açıklanmaktadır. Bu özellik, Microsoft Entra kiracınızdaki kullanıcılar ve uygulamalar için Azure SQL kaynaklarına erişimi program aracılığıyla yönetmenize olanak tanır.

Not

Microsoft Entra ID daha önce Azure Active Directory (Azure AD) olarak biliniyordu.

Azure SQL için Microsoft Entra kimlik doğrulaması hakkında daha fazla bilgi için bkz. Microsoft Entra kimlik doğrulamasını kullanma.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Mantıksal sunucuya kimlik atama
  • Sunucu kimliğine Dizin Okuyucuları rolünü atama
  • Microsoft Entra ID'da uygulama kaydetme
  • Azure SQL Database'de bu uygulamanın hizmet sorumlusu için veritabanı kullanıcısı oluşturma
  • Hizmet sorumlusuyla Microsoft Entra veritabanı kullanıcısı oluşturma

Önkoşullar

  • Mevcut bir Azure SQL Database dağıtımı. Bu öğreticide çalışan bir SQL Veritabanınız olduğu varsayılır.
  • SQL veritabanınızın bulunduğu kiracıda Microsoft Entra Privileged Role Administrator izinleri.
  • Az.Sql PowerShell modülünün en son sürümü.
  • En son Microsoft.Graph PowerShell modülü.

Mantıksal sunucuya kimlik atama

  1. SQL veritabanınızı barındıran Microsoft Entra kiracısını belirterek Azure bağlanın. Kiracı Kimliği, Microsoft Entra ID kaynağınızın Overview sayfasında Azure portal bulunabilir. Kiracı Kimliğini kopyalayın ve aşağıdaki PowerShell komutunu çalıştırın:

    • <TenantId>’yi Kiracı Kimliğiniz ile değiştirin.
    Connect-AzAccount -Tenant <TenantId>
    

    Gelecekte kullanmak için bu öğreticiye TenantId kaydedin.

  2. Sistem tarafından atanan bir yönetilen kimlik oluşturun ve Azure içindeki mantıksal sunucuya atayın. Aşağıdaki PowerShell komutunu yürütür:

    • <ResourceGroupName> komutundaki <ServerName> ve değerlerini kaynaklarınızla değiştirin. Sunucu adınız myserver.database.windows.net ise, <ServerName> öğesini myserver ile değiştirin.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Sunucu kimliğinin başarıyla atandığını denetleyin. Aşağıdaki PowerShell komutunu yürütür:

    • <ResourceGroupName> ve <ServerName> öğelerini kaynaklarınızla değiştirin. Sunucu adınız myserver.database.windows.net ise, <ServerName> öğesini myserver ile değiştirin.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    Çıktınızda PrincipalId, Type ve TenantId gösterilir. Atanan kimlik şudur: PrincipalId.

  4. Ayrıca Azure portalına giderek de kimliği de de kontrol edebilirsiniz.

    • Microsoft Entra ID kaynağında Enterprise applications adresine gidin. Mantıksal sunucunuzun adını yazın. Kaynakta görüntülenen Nesne Kimliği , birincil sunucu kimliğinin kimliğidir.

    Bir kurumsal uygulamanın Nesne Kimliğinin nerede bulunacağı ekran görüntüsü.

İpucu

Sistem tarafından atanan yönetilen kimliğe alternatif olarak, kullanıcı tarafından atanan yönetilen kimliği kullanabilirsiniz. Kullanıcı tarafından atanan yönetilen kimlik, yönetilecek kimlik sayısını azaltan ve rol atamalarını basitleştiren birden çok mantıksal sunucu arasında paylaşılabilir. Daha fazla bilgi için bkz. Azure SQL için Microsoft Entra ID'de Kullanıcı tarafından atanan yönetilen kimlik.

Dizin Okuyucuları rolüne sunucu kimliği ekleme

Sunucu kimliği, Microsoft Entra kullanıcıları ve oturum açma bilgilerini oluşturmayı ve Microsoft Entra grup üyeliklerine göre kullanıcı izinlerini uygulamak için grup genişletmeyi içeren yönetim işlevleri için Microsoft Entra ID sorgulama izinleri gerektirir. Microsoft Entra ID sorgulamak için sunucu kimliği izinleri iptal edilirse veya sunucu kimliği silinirse Microsoft Entra kimlik doğrulaması çalışmayı durdurur.

Directory Readers rolüne ekleyerek veya aşağıdaki alt düzey Microsoft Graph izinlerini atayarak sunucu kimliğine Microsoft Entra sorgu izinleri atayın:

Not

Bu betik Microsoft Entra Privileged Role Administrator veya daha yüksek bir rol tarafından yürütülmelidir.

Aşağıdaki betik, Azure SQL Database için mantıksal sunucuyu temsil eden bir kimliğe Microsoft Entra Directory Readers izni verir.

  • Daha önce topladığınız <TenantId> ile TenantId değerini değiştirin.
  • Mantıksal sunucu adınızı değiştirin <ServerName> ile. Sunucu adınız myserver.database.windows.net ise, <ServerName> öğesini myserver ile değiştirin.
# 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'."
}

Not

Bu betikten elde edilen çıkış, kimliğin Dizin Okuyucuları rolüne atanmış olup olmadığını gösterir. İzin verilip verilmediğini bilmiyorsanız betiği yeniden çalıştırabilirsiniz.

SQL Managed Instance için Directory Readers rolünü atamaya yönelik benzer bir yaklaşım için bkz. Microsoft Entra admin ayarlama.

Üretim ortamlarında yaygın bir yönetim uygulaması, Directory Readers rolünü Microsoft Entra ID rol atanabilir bir gruba atamaktır. Ardından, grup sahipleri gruba yönetilen kimlikler ekleyebilir. Bu, en az ayrıcalık ilkesini korur ve Her SQL örneğine Dizin Okuyucuları rolünü tek tek vermek için Ayrıcalıklı Rol Yöneticisi gereksinimini atlar. Bu özellik hakkında daha fazla bilgi için bkz. Azure SQL için Microsoft Entra ID Directory Okuyucuları rolü.

Microsoft Entra ID'de uygulama oluşturma

Uygulamalarınızı kaydedin. Bir uygulamayı kaydetmek için en azından Microsoft Entra ID Application Developer rolüne sahip olmanız gerekir. Rol atama hakkında daha fazla bilgi için bkz. Microsoft Entra ID'da kullanıcı rolleri atama.

Bu öğreticide iki hizmet ilkesi kullanılır. veritabanında başka kullanıcılar oluşturmak için ilk hizmet sorumlusu olan DBOwnerApp kullanılır. İkinci hizmet ilkesel öğesi myapp adlı uygulama, DBOwnerApp'in bu eğitimin ilerleyen bölümlerinde veritabanı kullanıcısı oluşturacağı uygulamadır.

Uygulamalarınızı kaydetmek için:

  1. Azure portalında Microsoft Entra ID>App registrations>Yeni kayıt öğesini seçin.

    Uygulama kaydetme sayfasını gösteren ekran görüntüsü.

    Uygulama kaydı oluşturulduktan sonra Uygulama (istemci) kimliği değeri oluşturulur ve görüntülenir. Bu öğreticide gelecekte kullanmak üzere bu değeri kaydedin.

    Azure portalının Uygulama Kimliğini gösteren ekran görüntüsü.

  2. Uygulamanın oturum açması için bir istemci sırrı oluşturun. Oturum açmak için bir sertifika yükleyin veya bir gizli anahtar oluşturun. Bu öğreticide ileri kullanım için DBOwnerApp için istemci sırrını kaydedin.

Daha fazla bilgi için Kaynaklara erişebilen bir Microsoft Entra uygulaması ve hizmet sorumlusu oluşturmak için portalı kullanın.

Hizmet sorumlusu kullanıcısını oluşturma

Yeni oluşturulan dbOwnerApp hizmet sorumlusunu SQL Veritabanı kullanıcı olarak ekleyin ve ona izinler atayın.

Diğer kullanıcıları oluşturma izinlerine sahip bir Microsoft Entra kimliği kullanarak SQL Veritabanınıza bağlanın.

Önemli

Azure SQL Database'da yalnızca Microsoft Entra kullanıcılar başka Microsoft Entra kullanıcıları oluşturabilir. Sunucu yöneticisi de dahil olmak üzere SQL kimlik doğrulamasını temel alan hiçbir kullanıcı Microsoft Entra kullanıcı oluşturamıyor. başlangıçta SQL Veritabanı'nda başka Microsoft Entra kullanıcıları oluşturabilen tek kullanıcı Microsoft Entra yöneticisidir. Microsoft Entra yöneticisi başka kullanıcılar oluşturduktan sonra, uygun izinlere sahip tüm Microsoft Entra kullanıcılar başka Microsoft Entra kullanıcıları oluşturabilir.

  1. Aşağıdaki T-SQL komutunu kullanarak SQL Veritabanı dbOwnerApp kullanıcısını oluşturun:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Diğer Microsoft Entra kullanıcıları oluşturmak için en azından ALTER ANY USER SQL izni gerekir. Bu izin, db_owner üyeliği ve Microsoft Entra yöneticisi olarak atama yoluyla da devralınır. Aşağıdaki örneklerde, DBOwnerApp'e veritabanında başka Microsoft Entra kullanıcıları oluşturmasına olanak sağlayan üç farklı seçenek gösterilmektedir.

    DBOwnerApp'i, sp_addrolemember kullanarak rolüne db_owner.

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    DBOwnerApp'e ALTER ANY USER izni aşağıdaki T-SQL örneğinde olduğu gibi atayabilirsiniz:

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    DBOwnerApp Microsoft Entra yöneticisi olarak ayarlayabilirsiniz. Azure portalı, PowerShell veya Azure CLI komutlarını kullanın. Daha fazla bilgi için bkz. Set Microsoft Entra admin.

Hizmet ilkesi ile bir kullanıcı oluşturma

  1. Microsoft Entra hizmet sorumlusu kullanıcı myapp'i, hizmet sorumlusu DBOwnerApp kullanarak oluşturmak için aşağıdaki betiği kullanın:

    • Daha önce topladığınız <TenantId> ile TenantId değerini değiştirin.
    • Daha önce topladığınız <ClientId> ile ClientId değerini değiştirin.
    • <ClientSecret> değerini, daha önce oluşturduğunuz istemci gizli anahtarınızla değiştirin.
    • Mantıksal sunucu adınızı değiştirin <ServerName> ile. Sunucu adınız myserver.database.windows.net ise, <ServerName> öğesini myserver ile değiştirin.
    • değerini SQL Veritabanı adınız ile değiştirin<database name>.

    Not

    Aşağıdaki betik Microsoft.Data.SqlClient derlemesini gerektirir. NuGet paketinden yükleyin ve betiği çalıştırmadan önce DLL'yi Add-Type -Path "path\to\Microsoft.Data.SqlClient.dll" ile yükleyin.

    # 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 Microsoft.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 Microsoft.Data.SqlClient.SqlCommand($ddlstmt, $conn)
    
    Write-host "results"
    $command.ExecuteNonQuery()
    $conn.Close()
    

    Alternatif olarak, şu kodu kullanabilirsiniz: Azure SQL Database'e Microsoft Entra hizmet ilkesi kimlik doğrulaması. Betiği değiştirin ve DDL ifadesini CREATE USER [myapp] FROM EXTERNAL PROVIDER çalıştırın. Veritabanınızda Microsoft Entra bir kullanıcı veya grup oluşturmak için aynı betiği kullanın.

  2. Aşağıdaki komutu yürüterek myapp kullanıcısının veritabanında mevcut olup olmadığını denetleyin:

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

    Şuna benzer bir çıktı görmeniz gerekir:

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