Tutorial: Membuat pengguna Microsoft Entra menggunakan aplikasi Microsoft Entra

Berlaku untuk:Azure SQL Database

Artikel ini menjelaskan cara mengonfigurasi perwakilan layanan sehingga dapat membuat pengguna Microsoft Entra di Azure SQL Database. Kemampuan ini memungkinkan konfigurasi terprogram manajemen akses ke sumber daya Azure SQL untuk pengguna dan aplikasi di penyewa Microsoft Entra Anda.

Catatan

ID Microsoft Entra sebelumnya dikenal sebagai Azure Active Directory (Azure AD).

Untuk informasi selengkapnya tentang autentikasi Microsoft Entra untuk Azure SQL, lihat artikel Menggunakan autentikasi Microsoft Entra.

Dalam tutorial ini, Anda akan mempelajari cara:

  • Menetapkan identitas ke server logis
  • Menetapkan peran Pembaca Direktori ke identitas server
  • Mendaftarkan aplikasi di ID Microsoft Entra
  • Membuat pengguna database untuk perwakilan layanan aplikasi tersebut di Azure SQL Database
  • Membuat pengguna database Microsoft Entra dengan perwakilan layanan

Prasyarat

Menetapkan identitas ke server logis

  1. Koneksi ke Azure, menentukan penyewa Microsoft Entra yang menghosting database SQL Anda. ID Penyewa dapat ditemukan di halaman Gambaran Umum untuk sumber daya ID Microsoft Entra Anda di portal Azure. Salin ID Penyewa lalu jalankan perintah PowerShell berikut ini:

    • Ganti <TenantId> dengan ID Penyewa Anda.
    Connect-AzAccount -Tenant <TenantId>
    

    Catat untuk TenantId digunakan di masa mendatang dalam tutorial ini.

  2. Buat identitas terkelola yang ditetapkan sistem dan tetapkan ke server logis di Azure. Jalankan perintah PowerShell berikut ini:

    • Ganti <ResourceGroupName> dan <ServerName> dengan sumber daya Anda di perintah Set-AzSqlServer . Jika nama server Anda adalah myserver.database.windows.net, ganti <ServerName> dengan myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Periksa identitas server berhasil ditetapkan. Jalankan perintah PowerShell berikut ini:

    • Ganti <ResourceGroupName> dan <ServerName> dengan sumber daya Anda. Jika nama server Anda adalah myserver.database.windows.net, ganti <ServerName> dengan myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    Output Anda harus menunjukkan kepada Anda PrincipalId, Type, dan TenantId. Identitas yang ditugaskan adalah PrincipalId.

  4. Anda juga dapat memeriksa identitas dengan masuk ke portal Microsoft Azure.

    • Di sumber daya ID Microsoft Entra, buka Aplikasi perusahaan. Ketik nama server logis Anda. ID Objek yang muncul pada sumber daya adalah ID identitas server utama.

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

Menambahkan identitas server ke peran Pembaca Direktori

Identitas server memerlukan izin untuk mengkueri ID Microsoft Entra untuk fungsi administratif, yang mencakup pembuatan pengguna dan login Microsoft Entra, dan melakukan ekspansi grup untuk menerapkan izin pengguna berdasarkan keanggotaan grup Microsoft Entra mereka. Jika izin identitas server untuk mengkueri ID Microsoft Entra dicabut, atau identitas server dihapus, autentikasi Microsoft Entra berhenti berfungsi.

Tetapkan izin kueri Microsoft Entra ke identitas server dengan menambahkannya ke peran Pembaca Direktori atau menetapkan izin Microsoft Graph tingkat bawah berikut:

Catatan

Skrip ini harus dijalankan oleh ID Global Administrator Microsoft Entra atau Privileged Role Administrator.

Skrip berikut memberikan izin Pembaca Microsoft Entra Directory ke identitas yang mewakili server logis untuk Azure SQL Database.

  • Ganti <TenantId> dengan TenantId berkumpul sebelumnya Anda.
  • Ganti <ServerName> dengan nama server logis SQL Anda. Jika nama server Anda adalah myserver.database.windows.net, ganti <ServerName> dengan 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'."
}

Catatan

Output dari skrip ini menunjukkan apakah identitas ditetapkan ke peran Pembaca Direktori. Anda dapat menjalankan kembali skrip jika Anda tidak yakin apakah izin diberikan.

Untuk pendekatan serupa tentang cara menetapkan peran Pembaca Direktori untuk SQL Managed Instance, lihat Menyediakan admin Microsoft Entra (SQL Managed Instance).

Di lingkungan produksi, praktik manajemen umum adalah menetapkan peran Pembaca Direktori ke grup yang dapat ditetapkan peran di ID Microsoft Entra. Kemudian, pemilik grup dapat menambahkan identitas terkelola ke grup. Ini mempertahankan prinsip hak istimewa paling sedikit, dan melewati kebutuhan administrator Global atau Administrator Peran Istimewa untuk memberikan peran Pembaca Direktori satu per satu ke setiap instans SQL. Untuk informasi selengkapnya tentang fitur ini, lihat Peran Pembaca Direktori di ID Microsoft Entra untuk Azure SQL.

Membuat aplikasi di MICROSOFT Entra ID

Daftarkan aplikasi Anda. Untuk mendaftarkan aplikasi, Anda memerlukan setidaknya peran Pengembang Aplikasi MICROSOFT Entra ID. Untuk informasi selengkapnya tentang menetapkan peran, lihat Menetapkan peran pengguna di ID Microsoft Entra.

Tutorial ini menggunakan dua perwakilan layanan. Perwakilan layanan pertama, DBOwnerApp, digunakan untuk membuat pengguna lain dalam database. Perwakilan layanan kedua, myapp, adalah aplikasi yang dibuat DBOwnerApp pengguna database untuk nanti dalam tutorial ini.

Untuk mendaftarkan aplikasi Anda:

  1. Di portal Azure, pilih ID> Microsoft Entra Pendaftaran aplikasi> Pendaftaran baru.

    Screenshot shows the Register an application page.

    Setelah pendaftaran aplikasi dibuat, nilai ID Aplikasi (klien) dihasilkan dan ditampilkan. Catat nilai ini untuk digunakan di masa mendatang dalam tutorial ini.

    Screenshot of the Azure portal that shows the App ID.

  2. Buat rahasia klien agar aplikasi dapat masuk. Ikuti unggah sertifikat atau buat rahasia untuk masuk. Catat rahasia klien untuk DBOwnerApp untuk digunakan di masa mendatang dalam tutorial ini.

Untuk informasi selengkapnya, tinjau Menggunakan portal untuk membuat aplikasi Microsoft Entra dan perwakilan layanan yang dapat mengakses sumber daya.

Membuat pengguna perwakilan layanan

Tambahkan perwakilan layanan yang baru dibuat, DBOwnerApp, sebagai pengguna di SQL Database dan tetapkan izin untuk itu.

Koneksi ke SQL Database Anda menggunakan identitas Microsoft Entra yang memiliki izin untuk membuat pengguna lain.

Penting

Hanya pengguna Microsoft Entra yang dapat membuat pengguna Microsoft Entra lainnya di Azure SQL Database. Tidak ada pengguna berdasarkan autentikasi SQL, termasuk admin server, yang dapat membuat pengguna Microsoft Entra. Admin Microsoft Entra adalah satu-satunya pengguna yang awalnya dapat membuat pengguna Microsoft Entra lainnya di SQL Database. Setelah admin Microsoft Entra membuat pengguna lain, setiap pengguna Microsoft Entra dengan izin yang tepat dapat membuat pengguna Microsoft Entra lainnya.

  1. Buat pengguna DBOwnerApp di SQL Database menggunakan perintah T-SQL berikut:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Untuk membuat pengguna Microsoft Entra lainnya, minimal, ALTER ANY USER izin SQL diperlukan. Izin ini juga diwariskan melalui keanggotaan di db_owner, dan melalui penugasan sebagai admin Microsoft Entra. Contoh berikut menunjukkan tiga opsi berbeda untuk menetapkan izin ke DBOwnerApp yang memungkinkannya membuat pengguna Microsoft Entra lainnya dalam database.

    Anda dapat menambahkan DBOwnerApp ke db_owner peran dengan sp_addrolemember:

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    Anda dapat menetapkan ALTER ANY USER izin ke DBOwnerApp seperti sampel T-SQL berikut:

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    Anda dapat mengatur DBOwnerApp sebagai admin Microsoft Entra. Ini dapat dilakukan menggunakan perintah portal Azure, PowerShell, atau Azure CLI. Untuk informasi selengkapnya, lihat Menyediakan admin Microsoft Entra (SQL Database).

Membuat pengguna dengan perwakilan layanan

  1. Gunakan skrip berikut untuk membuat pengguna perwakilan layanan Microsoft Entra myapp menggunakan perwakilan layanan DBOwnerApp:

    • Ganti <TenantId> dengan TenantId berkumpul sebelumnya Anda.
    • Ganti <ClientId> dengan ClientId berkumpul sebelumnya Anda.
    • Ganti <ClientSecret> dengan rahasia klien Anda yang dibuat sebelumnya.
    • Ganti <ServerName> dengan nama server logis SQL Anda. Jika nama server Anda adalah myserver.database.windows.net, ganti <ServerName> dengan myserver.
    • Ganti <database name> dengan nama Microsoft Azure SQL Database Anda.
    # 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()
    

    Atau, Anda dapat menggunakan kode berikut: Autentikasi perwakilan layanan Microsoft Entra ke Azure SQL Database. Ubah skrip untuk menjalankan pernyataan CREATE USER [myapp] FROM EXTERNAL PROVIDERDDL . Skrip yang sama dapat digunakan untuk membuat pengguna atau grup Microsoft Entra di database Anda.

  2. Periksa apakah pengguna myapp ada di database dengan menjalankan perintah berikut:

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

    Anda akan melihat output serupa:

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

Langkah berikutnya