Руководство по созданию пользователей Microsoft Entra с помощью приложений Microsoft Entra
Применимо к: База данных SQL Azure
В этой статье объясняется, как настроить субъект-службу, чтобы он смог создать пользователей Microsoft Entra в База данных SQL Azure. Эта возможность обеспечивает программную настройку управления доступом к ресурсам SQL Azure для пользователей и приложений в клиенте Microsoft Entra.
Примечание.
Идентификатор Microsoft Entra ранее был известен как Azure Active Directory (Azure AD).
Дополнительные сведения о проверке подлинности Microsoft Entra для SQL Azure см. в статье "Использование проверки подлинности Microsoft Entra".
В этом руководстве описано следующее:
- Назначение удостоверения логическому серверу
- Назначение роли "Читатели каталогов" удостоверениям сервера
- Регистрация приложения в идентификаторе Microsoft Entra
- Создание пользователя базы данных для субъекта-службы этого приложения в База данных SQL Azure
- Создание пользователя базы данных Microsoft Entra с субъектом-службой
Необходимые компоненты
- Существующее развертывание Базы данных SQL Azure. В этом учебнике предполагается, что вы используете службу "База данных SQL".
- Microsoft Entra
Global Administrator
илиPrivileged Role Administrator
разрешения в клиенте, где находится база данных SQL. - Последняя версия модуля Az.Sql PowerShell.
- Последняя версия модуля Microsoft.Graph PowerShell.
Назначение удостоверения логическому серверу
Подключитесь к Azure, указав клиент Microsoft Entra, на котором размещена база данных SQL. Идентификатор клиента можно найти на странице обзора ресурса Идентификатора Microsoft Entra в портал Azure. Скопируйте идентификатор клиента и выполните следующую команду PowerShell:
- Замените
<TenantId>
своим идентификатором клиента.
Connect-AzAccount -Tenant <TenantId>
Запишите
TenantId
для будущего использования в этом учебнике.- Замените
Создайте управляемое удостоверение, назначаемое системой, и назначьте его логическому серверу в Azure. Выполните указанную ниже команду PowerShell:
- Замените
<ResourceGroupName>
ресурсы и<ServerName>
своими ресурсами в команде Set-AzSqlServer . Если имя сервераmyserver.database.windows.net
, замените<ServerName>
наmyserver
.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
- Замените
Убедитесь, что удостоверение сервера успешно назначено. Выполните указанную ниже команду PowerShell:
- Замените
<ResourceGroupName>
и<ServerName>
своими ресурсами. Если имя сервераmyserver.database.windows.net
, замените<ServerName>
наmyserver
.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identity
В выходных данных должны отобразиться
PrincipalId
,Type
иTenantId
.PrincipalId
— это присваиваемое удостоверение.- Замените
Вы также можете проверить удостоверение на портале Azure.
- В ресурсе Идентификатора Microsoft Entra перейдите в корпоративные приложения. Введите имя логического сервера. Идентификатор объекта, который отображается в ресурсе, является идентификатором удостоверения сервера-источника.
Добавление удостоверения сервера в роль читателей каталогов
Для удостоверения сервера требуются разрешения на запрос идентификатора Microsoft Entra для административных функций, включая создание пользователей и имен входа Microsoft Entra, а также расширение группы для применения разрешений пользователей на основе членства в группе Microsoft Entra. Если разрешения удостоверения сервера для запроса идентификатора Microsoft Entra отозваны или удостоверение сервера удалено, проверка подлинности Microsoft Entra перестает работать.
Назначьте разрешения запроса Microsoft Entra для удостоверения сервера, добавив его в роль читателей каталогов или назначив следующие разрешения Microsoft Graph ниже.
Примечание.
Этот скрипт должен выполняться идентификатором Global Administrator
Microsoft Entra или a Privileged Role Administrator
.
В следующем скрипте предоставляется разрешение читателя каталогов Microsoft Entra для удостоверения, представляющего логический сервер для База данных SQL Azure.
- Замените
<TenantId>
наTenantId
, собранный ранее. - Замените
<ServerName>
именем логического сервера. Если имя сервераmyserver.database.windows.net
, замените<ServerName>
на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'."
}
Примечание.
Выходные данные этого скрипта указывают, назначено ли удостоверение роли "Читатели каталогов". Если вы не уверены, предоставлено ли разрешение, повторно выполните скрипт.
Аналогичный подход к назначению роли читателей каталогов для Управляемый экземпляр SQL см. в разделе "Настройка администратора Microsoft Entra".
В рабочих средах распространенная практика управления — назначение роли читателя каталогов группе с возможностью назначения ролей в идентификаторе Microsoft Entra. Затем владельцы групп могут добавлять управляемые удостоверения в группу. Это поддерживает принцип наименьших привилегий и передает необходимость глобального администратора или администратора привилегированных ролей предоставить роль читателя каталогов отдельно каждому экземпляру SQL. Дополнительные сведения об этой функции см. в разделе "Читатели каталогов" в идентификаторе Microsoft Entra для SQL Azure.
Создание приложения в идентификаторе Microsoft Entra
Зарегистрируйте приложения. Чтобы зарегистрировать приложение, вам потребуется по крайней мере роль разработчика приложений идентификатора Microsoft Entra ID. Дополнительные сведения о назначении ролей см. в разделе "Назначение ролей пользователей" в идентификаторе Microsoft Entra.
В этом руководстве используются два субъекта-службы. Первый субъект-служба DBOwnerApp используется для создания других пользователей в базе данных. Второй субъект-служба myapp — это приложение, которое DBOwnerApp создает пользователя базы данных для дальнейшего использования в этом руководстве.
Чтобы зарегистрировать приложения, выполните приведенные далее действия.
В портал Azure выберите идентификатор Microsoft Entra ID> Регистрация приложений> New.
После создания регистрации приложения значение идентификатора приложения (клиента) создается и отображается. Запишите это значение для дальнейшего использования в этом руководстве.
Создайте секрет клиента для входа в приложение. Следуйте инструкциям по отправке сертификата или создайте секрет для входа. Запишите секрет клиента для DBOwnerApp для дальнейшего использования в этом руководстве.
Дополнительные сведения см . на портале, чтобы создать приложение Microsoft Entra и субъект-службу, которые могут получить доступ к ресурсам.
Создание пользователя субъекта-службы
Добавьте только что созданный субъект-службу DBOwnerApp в качестве пользователя в База данных SQL и назначьте ему разрешения.
Подключитесь к База данных SQL с помощью удостоверения Microsoft Entra, имеющего разрешения на создание других пользователей.
Внимание
Только пользователи Microsoft Entra могут создавать других пользователей Microsoft Entra в База данных SQL Azure. Пользователи, основанные на проверке подлинности SQL, включая администратора сервера, не могут создавать пользователя Microsoft Entra. Администратор Microsoft Entra — единственный пользователь, который изначально может создавать других пользователей Microsoft Entra в База данных SQL. После того как администратор Microsoft Entra создал других пользователей, любой пользователь Microsoft Entra с соответствующими разрешениями может создавать других пользователей Microsoft Entra.
Создайте пользователь DBOwnerApp в База данных SQL с помощью следующей команды T-SQL:
CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER GO
Чтобы создать других пользователей Microsoft Entra, как минимум,
ALTER ANY USER
требуется разрешение SQL. Это разрешение также наследуется через членство вdb_owner
, а также через назначение в качестве администратора Microsoft Entra. В следующих примерах показаны три различных варианта назначения разрешений DBOwnerApp , которые позволяют создавать других пользователей Microsoft Entra в базе данных.Вы можете добавить DBOwnerApp в
db_owner
роль с помощью sp_addrolemember:EXEC sp_addrolemember 'db_owner', [DBOwnerApp] GO
Вы можете назначить
ALTER ANY USER
разрешение DBOwnerApp , как показано в следующем примере T-SQL:GRANT ALTER ANY USER TO [DBOwnerApp] GO
DbOwnerApp можно задать администратором Microsoft Entra. Это можно сделать с помощью команд портал Azure, PowerShell или Azure CLI. Дополнительные сведения см. в разделе "Настройка администратора Microsoft Entra".
Создание пользователя с субъектом-службой
Используйте следующий сценарий для создания пользователя субъекта-службы Microsoft Entra myapp с помощью dbOwnerApp субъекта-службы.
- Замените
<TenantId>
наTenantId
, собранный ранее. - Замените
<ClientId>
наClientId
, собранный ранее. - Замените
<ClientSecret>
секретом клиента, созданным ранее. - Замените
<ServerName>
именем логического сервера. Если имя сервераmyserver.database.windows.net
, замените<ServerName>
наmyserver
. - Замените
<database name>
именем службы "База данных SQL".
# 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()
Кроме того, можно использовать следующий код: проверка подлинности субъекта-службы Microsoft Entra для База данных SQL Azure. Измените скрипт для выполнения инструкции
CREATE USER [myapp] FROM EXTERNAL PROVIDER
DDL. Этот же скрипт можно использовать для создания пользователя или группы Microsoft Entra в базе данных.- Замените
Убедитесь, что в базе данных существует пользователь myapp, выполнив следующую команду:
SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId FROM sys.database_principals WHERE name = 'myapp' GO
Вы должны увидеть похожие выходные данные:
name type type_desc appId myapp E EXTERNAL_USER 6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Следующие шаги
- Субъект-служба Microsoft Entra с SQL Azure
- Что такое управляемые удостоверения для ресурсов Azure?
- Использование управляемых удостоверений в Службе приложений и Функциях Azure
- Проверка подлинности субъекта-службы Microsoft Entra в базе данных SQL — пример кода
- Сведения об объектах приложения и субъекта-службы в Microsoft Entra ID
- Создание субъекта-службы Azure с помощью Azure PowerShell
- Роль читателя каталогов в идентификаторе Microsoft Entra для SQL Azure