Руководство по созданию пользователей Azure AD с помощью приложений Azure AD

Область применения: База данных SQL Azure

В этой статье описывается процесс создания пользователей Azure AD в службе "База данных SQL Azure" с помощью субъектов-служб Azure (приложения Azure AD). Эта функция уже существует в Управляемом экземпляре SQL Azure, но теперь она появилась в Базе данных SQL Azure. Для поддержки этого сценария необходимо создать удостоверение Azure AD и назначить его логическому серверу SQL Azure.

Дополнительные сведения о проверке подлинности Azure AD для SQL Azure см. в статье Использование проверки подлинности Azure Active Directory.

В этом руководстве описано следующее:

  • Назначение удостоверения для логического сервера SQL Azure.
  • Назначение разрешения читателей каталогов для удостоверения логического сервера SQL.
  • Создание субъекта-службы (приложение Azure AD) в Azure AD.
  • Создание пользователя субъекта-службы в службе "База данных SQL Azure".
  • Создание другого пользователя Azure AD в службе "База данных SQL" с помощью пользователя субъекта-службы Azure AD.

Предварительные требования

  • Существующее развертывание Базы данных SQL Azure. В этом учебнике предполагается, что вы используете службу "База данных SQL".
  • Доступ к уже существующей Azure Active Directory.
  • Для настройки отдельного приложения Azure AD в качестве администратора Azure AD для SQL Azure с помощью PowerShell необходим модуль Az.Sql 2.9.0 или более поздней версии. Убедитесь, что используется последняя версия модуля.

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

  1. Подключитесь к Azure Active Directory. Необходимо будет найти идентификатор клиента. Для этого перейдите на портал Azure и выберите ресурс Azure Active Directory. В области Обзор отобразится идентификатор клиента. Выполните следующую команду PowerShell:

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

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

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

    • Замените <resource group> и <server name> своими ресурсами. Если имя сервера myserver.database.windows.net, замените <server name> на myserver.
    Set-AzSqlServer -ResourceGroupName <resource group> -ServerName <server name> -AssignIdentity
    

    Дополнительные сведения см. в описании команды Set-AzSqlServer.

    Важно!

    Если удостоверение Azure AD настроено для логического сервера SQL Azure, то ему должно быть предоставлено разрешение читателей каталога. Этот шаг будет рассмотрен в следующем разделе. Не пропустите этот шаг, так как проверка подлинности Azure AD перестанет работать.

    Благодаря поддержке Microsoft Graph для Azure SQL можно заменить роль "Читатели каталогов" разрешениями более низкого уровня. Дополнительные сведения см. в статье об управляемом удостоверении, назначаемом пользователем, в Azure AD для Azure SQL.

    Если в качестве удостоверения сервера или экземпляра используется управляемое удостоверение, назначаемое системой или пользователем, после удаления удостоверения сервер или экземпляр не сможет получить доступ к Microsoft Graph. Проверка подлинности и другие функции Azure AD нельзя будет выполнить. Чтобы восстановить функциональность Azure AD, серверу нужно назначить новое удостоверение SMI или UMI с соответствующими разрешениями.

    • Если вы ранее использовали команду New-AzSqlServer с параметром AssignIdentity для создания SQL Server, вам потребуется выполнить команду Set-AzSqlServer в качестве отдельной команды, чтобы включить это свойство в структуре Azure.
  3. Убедитесь, что удостоверение сервера успешно назначено. Выполните указанную ниже команду PowerShell:

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

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

  4. Вы также можете проверить удостоверение на портале Azure.

    • В области ресурса Azure Active Directory выберите Корпоративные приложения. Введите имя логического сервера SQL. Вы увидите, что у него есть идентификатор объекта, присоединенный к ресурсу.

    object-id

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

Чтобы обеспечить правильную работу назначенного удостоверения Azure AD для SQL Azure, удостоверению сервера необходимо предоставить разрешение Directory Readers Azure AD.

Чтобы предоставить это требуемое разрешение, выполните указанный ниже скрипт.

Примечание

Этот скрипт должен выполняться Global Administrator или Privileged Roles Administrator Azure AD.

Вы можете назначить роль Directory Readers группе в Azure AD. Владельцы групп могут добавить управляемое удостоверение в качестве члена этой группы, что позволит обойти потребность в правах уровня Global Administrator или Privileged Roles Administrator для назначения роли Directory Readers. Дополнительные сведения об этой функции см. в статье Роль "Читатели каталогов" в Azure Active Directory для Azure SQL.

  • Замените <TenantId> на TenantId, собранный ранее.
  • Замените <server name> именем логического сервера SQL. Если имя сервера myserver.database.windows.net, замените <server name> на myserver.
# This script grants Azure "Directory Readers" permission to a Service Principal representing the Azure SQL logical server
# It can be executed only by a "Global Administrator" or "Privileged Roles Administrator" type of user.
# To check if the "Directory Readers" permission was granted, execute this script again

Import-Module AzureAD
Connect-AzureAD -TenantId "<TenantId>"    #Enter your actual TenantId
$AssignIdentityName = "<server name>"     #Enter Azure SQL logical server name
 
# Get Azure AD role "Directory Users" and create if it doesn't exist
$roleName = "Directory Readers"
$role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq $roleName}
if ($role -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-AzureADDirectoryRoleTemplate | Where-Object {$_.displayName -eq $roleName}
    Enable-AzureADDirectoryRole -RoleTemplateId $roleTemplate.ObjectId
    $role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq $roleName}
}
 
# Get service principal for server
$roleMember = Get-AzureADServicePrincipal -SearchString $AssignIdentityName
$roleMember.Count
if ($roleMember -eq $null) {
    Write-Output "Error: No Service Principals with name '$($AssignIdentityName)', make sure that AssignIdentityName parameter was entered correctly."
    exit
}

if (-not ($roleMember.Count -eq 1)) {
    Write-Output "Error: More than one service principal with name pattern '$($AssignIdentityName)'"
    Write-Output "Dumping selected service principals...."
    $roleMember
    exit
}
 
# Check if service principal is already member of readers role
$allDirReaders = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId
$selDirReader = $allDirReaders | where{$_.ObjectId -match $roleMember.ObjectId}
 
if ($selDirReader -eq $null) {
    # Add principal to readers role
    Write-Output "Adding service principal '$($AssignIdentityName)' to 'Directory Readers' role'..."
    Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId $roleMember.ObjectId
    Write-Output "'$($AssignIdentityName)' service principal added to 'Directory Readers' role'..."
 
    #Write-Output "Dumping service principal '$($AssignIdentityName)':"
    #$allDirReaders = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId
    #$allDirReaders | where{$_.ObjectId -match $roleMember.ObjectId}
} else {
    Write-Output "Service principal '$($AssignIdentityName)' is already member of 'Directory Readers' role'."
}

Примечание

Выходные данные в приведенном выше скрипте указывают, предоставлено ли удостоверению разрешение читателей каталога. Если вы не уверены, предоставлено ли разрешение, повторно выполните скрипт.

Вы можете ознакомиться с аналогичным подходом по установке разрешений читателей каталога для Управляемого экземпляра SQL в статье Подготовка администратора Azure AD (Управляемый экземпляр SQL).

Создание субъекта-службы (приложение Azure AD) в Azure AD

Зарегистрируйте приложение, если это еще не сделано. Чтобы зарегистрировать приложение, необходимо быть администратором Azure AD или пользователем с назначенной ролью разработчика приложений Azure AD. Дополнительные сведения о назначении ролей см. в статье Назначение ролей администратора и других ролей пользователям с помощью Azure Active Directory.

По завершении регистрации приложения создается и отображается идентификатор приложения.

Для регистрации приложения:

  1. На портале Azure последовательно выберите Azure Active Directory>Регистрация приложений>Новая регистрация.

    Регистрация приложений

    После создания регистрации приложения создается и отображается значение идентификатора приложения.

    Отображение идентификатора приложения

  2. Кроме того, понадобится создать секрет клиента для входа. Следуйте указаниям из этого раздела, чтобы отправить сертификат или создать секрет для входа.

  3. Запишите следующие сведения из регистрации приложения. Они должны быть доступны на панели Обзор.

    • Идентификатор приложения
    • Идентификатор клиента. Он должен остаться таким же, как прежде.

В этом учебнике в качестве основного субъекта-службы будет использоваться AppSP, а myapp — в качестве второго пользователя субъекта-службы, который будет создан в SQL Azure с помощью AppSP. Необходимо создать два приложения: AppSP и myapp.

Дополнительные сведения о создании приложения Azure AD см. в статье Практическое руководство. Создание приложения Azure Active Directory и субъект-службы с доступом к ресурсам с помощью портала.

Создание пользователя субъекта-службы в службе "База данных SQL Azure"

После создания субъекта-службы в Azure AD создайте пользователя в службе "База данных SQL". Необходимо подключиться к службе "База данных SQL" с действующим именем входа с разрешениями на создание пользователей в базе данных.

Важно!

Только Azure AD пользователи могут создавать других пользователей Azure AD в базе данных Azure SQL. Любой пользователь SQL с проверкой подлинности SQL, включая администратора сервера, не может создать Azure AD пользователя. Администратор Azure AD является единственным пользователем, который изначально может создавать Azure AD пользователей в База данных SQL. После того как администратор Azure AD создал других пользователей, любой Azure AD пользователь с соответствующими разрешениями может создать других Azure AD пользователей.

  1. Создайте пользователя AppSP в службе "База данных SQL", выполнив указанную ниже команду T-SQL.

    CREATE USER [AppSP] FROM EXTERNAL PROVIDER
    GO
    
  2. Предоставьте для AppSP разрешение db_owner, которое позволяет пользователю создавать других пользователей Azure AD в базе данных.

    EXEC sp_addrolemember 'db_owner', [AppSP]
    GO
    

    Дополнительные сведения см. в статье sp_addrolemember.

    Кроме того, вместо назначения роли db_owner можно предоставить разрешение ALTER ANY USER. Это позволит субъекту-службе добавлять других пользователей Azure AD.

    GRANT ALTER ANY USER TO [AppSp]
    GO
    

    Примечание

    Указанный выше параметр не требуется, если AppSP установлен в качестве администратора Azure AD для сервера. Установить субъект-службу в качестве администратора AD для логического сервера SQL можно с помощью портала Azure, PowerShell или команд Azure CLI. Дополнительные сведения см. в разделе о подготовке администратора Azure AD (служба "База данных SQL").

Создание пользователя Azure AD в службе "База данных SQL" с помощью субъекта-службы Azure AD

Важно!

Субъект-служба, используемая для входа в службу "База данных SQL", должна иметь секрет клиента. Если он отсутствует, выполните шаг 2 раздела по созданию субъекта-службы (приложение Azure AD) в Azure AD. Этот секрет клиента необходимо добавить в указанный ниже скрипт в качестве входного параметра.

  1. Используйте следующий скрипт, чтобы создать пользователя субъекта-службы Azure AD myapp с помощью субъекта-службы AppSP.

    • Замените <TenantId> на TenantId, собранный ранее.
    • Замените <ClientId> на ClientId, собранный ранее.
    • Замените <ClientSecret> секретом клиента, созданным ранее.
    • Замените <server name> именем логического сервера SQL. Если имя сервера myserver.database.windows.net, замените <server name> на myserver.
    • Замените <database name> именем службы "База данных SQL".
    # PowerShell script for creating a new SQL user called myapp using application AppSP with secret
    # AppSP is part of an Azure AD admin for the Azure SQL server below
    
    # Download latest  MSAL  - https://www.powershellgallery.com/packages/MSAL.PS
    Import-Module MSAL.PS
    
    $tenantId = "<TenantId>"   # tenantID (Azure Directory ID) were AppSP resides
    $clientId = "<ClientId>"   # AppID also ClientID for AppSP     
    $clientSecret = "<ClientSecret>"   # Client secret for AppSP 
    $scopes = "https://database.windows.net/.default" # The end-point
    
    $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 = "<server name>"    # Azure SQL 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()
    

    Кроме того, вы можете использовать пример кода, приведенный в блоге, посвященном проверке подлинности субъекта-службы Azure AD в базе данных SQL. Измените скрипт, чтобы выполнить инструкцию DDL CREATE USER [myapp] FROM EXTERNAL PROVIDER. Этот же скрипт можно использовать для создания обычного пользователя или группы Azure AD в Базе данных SQL.

  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
    

Дальнейшие действия