Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:База данных SQL Azure
В этой статье объясняется, как настроить учетную запись службы для возможности создания пользователей Microsoft Entra в База данных SQL Azure. Эта возможность позволяет программно управлять доступом к ресурсам Azure SQL для пользователей и приложений в клиенте Microsoft Entra.
Примечание.
Microsoft Entra ID ранее был известен как Azure Active Directory (Azure AD).
Дополнительные сведения о проверке подлинности Microsoft Entra для Azure SQL см. в статье Use Microsoft Entra authentication.
В этом руководстве описано следующее:
- Присвоить идентификатор логическому серверу
- Назначьте роль "Читатели каталогов" идентификатору сервера
- Регистрация приложения в Microsoft Entra ID
- Создание пользователя базы данных для субъекта-службы этого приложения в База данных SQL Azure
- Создание пользователя базы данных Microsoft Entra с помощью учетной записи службы
Предварительные условия
- Существующее развертывание База данных SQL Azure. В этом руководстве предполагается, что у вас есть рабочая база данных SQL.
- Microsoft Entra
Privileged Role Administratorразрешения в клиенте, где находится база данных SQL. - Последняя версия модуля Az.Sql PowerShell.
- Последняя версия модуля Майкрософт.Graph PowerShell.
Присвоить идентификатор логическому серверу
Подключитесь к Azure, указав клиент Microsoft Entra, на котором размещена база данных SQL. Идентификатор клиента можно найти на странице Overview для ресурса Microsoft Entra ID на портале 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 ID перейдите к приложениям Enterprise. Введите имя логического сервера. Идентификатор объекта, который указан на ресурсе, является идентификатором основной серверной идентичности.
Подсказка
В качестве альтернативы управляемому удостоверению, назначаемого системой, можно использовать управляемое удостоверение, назначаемое пользователем. Пользовательское управляемое удостоверение можно совместно использовать на разных логических серверах, что сокращает количество удостоверений для управления и упрощения процесса назначения ролей. Дополнительные сведения см. в разделе Пользовательски назначаемое управляемое удостоверение в Microsoft Entra ID для Azure SQL.
Добавление удостоверения сервера в роль «Читателей каталогов»
Удостоверение сервера требует разрешений на запросы к идентификации Microsoft Entra для выполнения административных функций, включая создание пользователей и имен входа Microsoft Entra, а также развертывание групп для применения разрешений пользователей на основе их членства в группах Microsoft Entra. Если разрешения удостоверения сервера на запросы к Microsoft Entra ID отозваны или удостоверение сервера удалено, проверка подлинности Microsoft Entra перестает функционировать.
Назначьте разрешения на выполнение запросов Microsoft Entra удостоверению сервера, добавив его в роль Directory Readers или назначив более низкоуровневые разрешения Microsoft Graph.
Примечание.
Этот скрипт должен выполняться ролью Microsoft Entra Privileged Role Administrator или более высокой ролью.
В следующем скрипте предоставляется разрешение Microsoft Entra Directory Readers для идентификатора, представляющего логический сервер для База данных 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 **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'."
}
Примечание.
Выходные данные этого скрипта указывают, назначено ли удостоверение роли "Читатели каталогов". Вы можете повторно запустить скрипт, если вы не уверены, было ли предоставлено разрешение.
Аналогичный подход к назначению роли Directory Readers для Управляемый экземпляр SQL см. в разделе Set Microsoft Entra admin.
В рабочих средах распространенная практика управления — назначить роль Directory Readers группе, доступной для назначения ролей, в Microsoft Entra ID. Затем владельцы групп могут добавлять управляемые удостоверения в группу. Это поддерживает принцип наименьшей привилегии и избегает необходимости для администратора привилегированных ролей предоставлять роль читателя каталогов каждой SQL инстанции. Дополнительные сведения об этой функции см. в разделе роль Directory Readers в Microsoft Entra ID для Azure SQL.
Создание приложения в Microsoft Entra ID
Зарегистрируйте приложения. Чтобы зарегистрировать приложение, необходимо иметь по крайней мере роль Microsoft Entra ID Application Developer. Дополнительные сведения о назначении ролей см. в разделе Назначение ролей пользователей в Microsoft Entra ID.
В этом руководстве используются два субъекта-службы. Первый служебный принципал DBOwnerApp используется для создания других учетных записей пользователей в базе данных. Второй объект-служба myapp — это приложение, для которого DBOwnerApp создает пользователя базы данных позже в этом руководстве.
Чтобы зарегистрировать приложения, выполните приведенные далее действия.
На портале Azure выберите Microsoft Entra ID>Регистрация приложений>New registration.
После создания регистрации приложения значение идентификатора приложения (клиента) генерируется и отображается. Запишите это значение для дальнейшего использования в этом руководстве.
Создайте секрет клиента для входа в приложение. Следуйте инструкциям по отправке сертификата или создайте секрет для входа. Запишите секрет клиента для 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 USERSQL. Это разрешение также наследуется через членство в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. Дополнительные сведения см. в разделе Set Microsoft Entra admin.
Создание пользователя с служебным принципалом
Используйте следующий скрипт, чтобы создать пользователя Microsoft Entra для субъекта-службы myapp с помощью субъекта-службы DBOwnerApp:
- Замените
<TenantId>наTenantId, собранное ранее. - Замените
<ClientId>наClientId, собранное ранее. - Замените
<ClientSecret>секретом клиента, созданным ранее. - Замените
<ServerName>именем логического сервера. Если имя сервераmyserver.database.windows.net, замените<ServerName>наmyserver. - Замените
<database name>именем службы "База данных SQL".
Примечание.
Для следующего сценария требуется сборка Майкрософт.Data.SqlClient. Установите его из пакета NuGet и загрузите библиотеку DLL с
Add-Type -Path "path\to\Майкрософт.Data.SqlClient.dll"перед запуском скрипта.# 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()Кроме того, можно использовать следующий код: аутентификация субъекта-службы Microsoft Entra для База данных SQL Azure. Измените скрипт для выполнения оператора DDL
CREATE USER [myapp] FROM EXTERNAL PROVIDER. Используйте тот же сценарий для создания 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 aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
Связанный контент
- представители службы Microsoft Entra с Azure SQL
- Что такое управляемые удостоверения для ресурсов Azure?
- Как использовать управляемые удостоверения для Службы приложений и Функции Azure
- Аутентификация учетной записи службы Microsoft Entra в базе данных SQL — пример кода
- Объекты приложения и служебного принципала в Microsoft Entra ID
- Создать служебный принципал Azure с помощью Azure PowerShell
- Роль Читатель каталога в Microsoft Entra ID для Azure SQL