Поделиться через


Руководство. Создание пользователей Microsoft Entra с помощью приложений Microsoft Entra

Применимо к:База данных 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.

Присвоить идентификатор логическому серверу

  1. Подключитесь к Azure, указав клиент Microsoft Entra, на котором размещена база данных SQL. Идентификатор клиента можно найти на странице Overview для ресурса Microsoft Entra ID на портале Azure. Скопируйте идентификатор клиента и выполните следующую команду PowerShell:

    • Замените <TenantId> своим идентификатором клиента.
    Connect-AzAccount -Tenant <TenantId>
    

    Запишите TenantId для будущего использования в этом руководстве.

  2. Создайте управляемое удостоверение, назначаемое системой, и назначьте его логическому серверу в Azure. Выполните указанную ниже команду PowerShell:

    • Замените <ResourceGroupName> и <ServerName> вашими ресурсами в команде Set-AzSqlServer. Если имя сервера myserver.database.windows.net, замените <ServerName> на myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Убедитесь, что идентификатор сервера успешно назначен. Выполните указанную ниже команду PowerShell:

    • Замените <ResourceGroupName> и <ServerName> своими ресурсами. Если имя сервера myserver.database.windows.net, замените <ServerName> на myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    Выходные данные отображаются PrincipalId, Type и TenantId. PrincipalId — это присваиваемое удостоверение.

  4. Вы также можете проверить удостоверение, перейдя на портал 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 создает пользователя базы данных позже в этом руководстве.

Чтобы зарегистрировать приложения, выполните приведенные далее действия.

  1. На портале Azure выберите Microsoft Entra ID>Регистрация приложений>New registration.

    Снимок экрана: страница регистрации приложения.

    После создания регистрации приложения значение идентификатора приложения (клиента) генерируется и отображается. Запишите это значение для дальнейшего использования в этом руководстве.

    Снимок экрана портала Azure, на котором отображается идентификатор приложения.

  2. Создайте секрет клиента для входа в приложение. Следуйте инструкциям по отправке сертификата или создайте секрет для входа. Запишите секрет клиента для 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 пользователей.

  1. Создайте пользователя DBOwnerApp в базе данных SQL с помощью следующей команды T-SQL.

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Чтобы создать других 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. Дополнительные сведения см. в разделе Set Microsoft Entra admin.

Создание пользователя с служебным принципалом

  1. Используйте следующий скрипт, чтобы создать пользователя 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 пользователя или группы в базе данных.

  2. Убедитесь, что в базе данных существует пользователь 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