Aracılığıyla paylaş


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

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

Bu makalede, Azure SQL Veritabanı'de 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şim yönetiminin program aracılığıyla yapılandırılmasını sağlar.

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 Microsoft Entra kimlik doğrulamasını kullanma makalesine bakın.

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'de uygulama kaydetme
  • Azure SQL Veritabanı'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

Mantıksal sunucuya kimlik atama

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

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

    Bu öğreticide TenantId gelecekte kullanmak üzere öğesini kaydedin.

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

    • Set-AzSqlServer komutundaki ve değerlerini kaynaklarınızla değiştirin<ResourceGroupName>.<ServerName> Sunucu adınız ise myserver.database.windows.netdeğerini ile myserverdeğiştirin<ServerName>.
    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:

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

    Çıkışınızda , Typeve TenantIdgösterilmelidirPrincipalId. Atanan kimlik şeklindedir PrincipalId.

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

    • Microsoft Entra Id kaynağında Kurumsal uygulamalar'a 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ü.

Dizin Okuyucuları rolüne sunucu kimliği ekleme

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

Sunucu kimliğine, Dizin Okuyucuları rolüne ekleyerek veya aşağıdaki alt düzey Microsoft Graph izinlerini atayarak Microsoft Entra sorgu izinlerini atayın:

Not

Bu betik bir Microsoft Entra Kimliği Global Administrator veya ile Privileged Role Administratoryürütülmelidir.

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

  • değerini daha önce toplanmış olanla TenantId değiştirin<TenantId>.
  • değerini mantıksal sunucu adınız ile değiştirin <ServerName> . Sunucu adınız ise myserver.database.windows.netdeğerini ile myserverdeğiştirin<ServerName>.
# 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'."
}

Not

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

SQL Yönetilen Örneği için Dizin Okuyucuları rolünü atamaya yönelik benzer bir yaklaşım için bkz. Microsoft Entra yöneticisini ayarlama.

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

Microsoft Entra Id'de uygulama oluşturma

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

Bu öğreticide iki hizmet sorumlusu kullanılır. veritabanında başka kullanıcılar oluşturmak için ilk hizmet sorumlusu olan DBOwnerApp kullanılır. İkinci hizmet sorumlusu olan myapp, DBOwnerApp'in bu öğreticinin ilerleyen bölümlerinde veritabanı kullanıcısı oluşturduğu uygulamadır.

Uygulamalarınızı kaydetmek için:

  1. Azure portalında Microsoft Entra Id> Uygulama kayıtları> Yeni kayıt'ı 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.

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

  2. Uygulamanın oturum açması için bir istemci gizli dizisi oluşturun. Bir sertifikayı karşıya yüklemeyi veya oturum açmak için gizli dizi oluşturmayı izleyin. Bu öğreticide daha sonra kullanmak üzere DBOwnerApp için istemci gizli dizisini kaydedin.

Daha fazla bilgi için portalı kullanarak kaynaklara erişebilen bir Microsoft Entra uygulaması ve hizmet sorumlusu oluşturma makalesini gözden geçirin.

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ı bağlanın.

Önemli

Azure SQL Veritabanı'da yalnızca Microsoft Entra kullanıcıları diğer Microsoft Entra kullanıcılarını oluşturabilir. Sunucu yöneticisi de dahil olmak üzere SQL kimlik doğrulamasını temel alan hiçbir kullanıcı Microsoft Entra kullanıcısı oluşturamıyor. Microsoft Entra yöneticisi, başlangıçta SQL Veritabanı'da diğer Microsoft Entra kullanıcılarını oluşturabilen tek kullanıcıdır. Microsoft Entra yöneticisi başka kullanıcılar oluşturduktan sonra, uygun izinlere sahip tüm Microsoft Entra kullanıcıları diğer Microsoft Entra kullanıcılarını 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ını oluşturmak için en azından ALTER ANY USER SQL izni gerekir. Bu izin, içinde üyelik db_ownerve 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 izin veren üç farklı seçenek gösterilmektedir.

    DBOwnerApp'i role sp_addrolemember ile ekleyebilirsiniz: 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'i Microsoft Entra yöneticisi olarak ayarlayabilirsiniz. Bu işlem Azure portalı, PowerShell veya Azure CLI komutları kullanılarak yapılabilir. Daha fazla bilgi için bkz . Microsoft Entra yöneticisini ayarlama.

Hizmet sorumlusu olan bir kullanıcı oluşturma

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

    • değerini daha önce toplanmış olanla TenantId değiştirin<TenantId>.
    • değerini daha önce toplanmış olanla ClientId değiştirin<ClientId>.
    • değerini daha önce oluşturulan istemci gizli dizinizle değiştirin <ClientSecret> .
    • değerini mantıksal sunucu adınız ile değiştirin <ServerName> . Sunucu adınız ise myserver.database.windows.netdeğerini ile myserverdeğiştirin<ServerName>.
    • değerini SQL Veritabanı adınız ile değiştirin<database name>.
    # 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()
    

    Alternatif olarak, şu kodu kullanabilirsiniz: Azure SQL Veritabanı için Microsoft Entra hizmet sorumlusu kimlik doğrulaması. DDL deyimini CREATE USER [myapp] FROM EXTERNAL PROVIDERyürütmek için betiği değiştirin. Aynı betik, veritabanınızda bir Microsoft Entra kullanıcısı veya grubu oluşturmak için de kullanılabilir.

  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	6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    

Sonraki adımlar