Руководство по созданию пользователей 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.

Назначение удостоверения логическому серверу

  1. Подключение в Azure, указав клиент Microsoft Entra, на котором размещена база данных SQL. Идентификатор клиента можно найти на странице обзора ресурса Идентификатора Microsoft Entra в портал 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 перейдите в корпоративные приложения. Введите имя логического сервера. Идентификатор объекта, который отображается в ресурсе, является идентификатором удостоверения сервера-источника.

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

Добавление удостоверения сервера в роль читателей каталогов

Для удостоверения сервера требуются разрешения на запрос идентификатора 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( Управляемый экземпляр SQL)".

В рабочих средах распространенная практика управления — назначение роли читателя каталогов группе с возможностью назначения ролей в идентификаторе Microsoft Entra. Затем владельцы групп могут добавлять управляемые удостоверения в группу. Это поддерживает принцип наименьшей привилегии и передает необходимость глобального Администратор istrator или привилегированной роли Администратор istrator для предоставления роли читателей каталогов отдельно каждому экземпляру SQL. Дополнительные сведения об этой функции см. в разделе "Читатели каталогов" в идентификаторе Microsoft Entra для SQL Azure.

Создание приложения в идентификаторе Microsoft Entra

Зарегистрируйте приложения. Чтобы зарегистрировать приложение, вам потребуется по крайней мере роль разработчика приложений идентификатора Microsoft Entra ID. Дополнительные сведения о назначении ролей см. в разделе "Назначение ролей пользователей" в идентификаторе Microsoft Entra.

В этом руководстве используются два субъекта-службы. Первый субъект-служба DBOwnerApp используется для создания других пользователей в базе данных. Второй субъект-служба myapp — это приложение, которое DBOwnerApp создает пользователя базы данных для дальнейшего использования в этом руководстве.

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

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

    Screenshot shows the Register an application page.

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

    Screenshot of the Azure portal that shows the App ID.

  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. Дополнительные сведения см. в разделе "Подготовка администратора Microsoft Entra" (База данных SQL).

Создание пользователя с субъектом-службой

  1. Используйте следующий сценарий для создания пользователя субъекта-службы 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 PROVIDERDDL. Этот же скрипт можно использовать для создания пользователя или группы 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	6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    

Следующие шаги