Использование Azure PowerShell для создания субъекта-службы с сертификатом

При наличии приложения или сценария, которому требуется доступ к ресурсам, можно настроить удостоверение для приложения и аутентифицировать его с помощью собственных учетных данных. Этот идентификатор известен как субъект-служба. Такой подход позволяет выполнить следующие действия:

  • Назначить удостоверению приложения разрешения, которые отличаются от ваших разрешений. Как правило, приложение получает именно те разрешения, которые требуются для его работы.
  • Использовать сертификат для аутентификации при выполнении автоматического сценария.

Важно!

Вместо создания субъекта-службы вы можете применить управляемые удостоверения ресурсов Azure в качестве удостоверения приложения. Если код выполняется в службе, которая поддерживает управляемые удостоверения и обращается к ресурсам, которые поддерживают проверку подлинности Azure Active Directory (Azure AD), то управляемые удостоверения будут оптимальным выбором. Дополнительные сведения об управляемых удостоверениях для ресурсов Azure, включая службы, которые в настоящее время поддерживают их, см. в разделе Что такое управляемые удостоверения для ресурсов Azure?

В этой статье показано, как создать субъект-службу, который выполняет аутентификацию с помощью сертификата. Настройка субъекта-службы с паролем описана в статье Создание субъекта-службы Azure с помощью Azure PowerShell.

Для выполнения задач из этой статься требуется Azure PowerShell последней версии.

Примечание

В этой статье предусмотрено использование модуля Azure Az PowerShell, который является рекомендуемым модулем PowerShell для взаимодействия с Azure. Чтобы начать работу с модулем Az PowerShell, ознакомьтесь со статьей Установка Azure PowerShell. Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.

Необходимые разрешения

Для работы с этой статьей у вас должен быть достаточный уровень разрешений в подписках Azure AD и Azure. В частности, вы должны иметь право на создание приложения в Azure AD и назначение роли субъекту-службе.

Проверить, есть ли у вас соответствующие разрешения, проще всего на портале. Ознакомьтесь с проверкой наличия необходимых разрешений.

Назначение приложению роли

Чтобы обеспечить доступ к ресурсам в подписке, необходимо назначить приложению роль. Укажите, какая роль предоставляет приложению необходимые разрешения. Дополнительные сведения о доступных ролях см. в статье Встроенные роли Azure.

Вы можете задать область действия на уровне подписки, группы ресурсов или ресурса. Разрешения наследуют более низкие уровни области действия. Например, добавление приложения в роль Читатель для группы ресурсов означает, что оно может использоваться для чтения группы ресурсов и любых содержащихся в ней ресурсов. Чтобы позволить приложению выполнять такие действия, как перезагрузка, запуск и остановка экземпляров, выберите роль Участник.

Создание субъекта-службы с самозаверяющим сертификатом

Ниже приводится простой пример сценария. В нем используется команда New-AzADServicePrincipal, чтобы создать субъект-службу с самозаверяющим сертификатом, а затем выполняется командлет New-AzRoleAssignment для присвоения этому субъекту-службе роли Читатель. Назначение ролей ограничивается текущей выбранной подпиской Azure. Чтобы выбрать другую подписку, выполните командлет Set-AzContext.

Примечание

PowerShell Core сейчас не поддерживает командлет New-SelfSignedCertificate и модуль PKI.

$cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" `
  -Subject "CN=exampleappScriptCert" `
  -KeySpec KeyExchange
$keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())

$sp = New-AzADServicePrincipal -DisplayName exampleapp `
  -CertValue $keyValue `
  -EndDate $cert.NotAfter `
  -StartDate $cert.NotBefore
Sleep 20
New-AzRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $sp.ApplicationId

Пример бездействует 20 секунд, чтобы данные нового субъекта-службы распространились в Azure AD. Если период ожидания окажется недостаточным, появится следующее сообщение об ошибке: "Субъект {идентификатор} не существует в каталоге {идентификатор_каталога}". Чтобы устранить эту ошибку, подождите немного и выполните команду New-AzRoleAssignment еще раз.

Вы можете задать область назначения ролей для определенной группы ресурсов с помощью параметра ResourceGroupName. Кроме того, вы можете задать область для определенного ресурса с помощью параметров ResourceType и ResourceName.

Если у вас нет ОС Windows 10 или Windows Server 2016, скачайте командлет New-SelfSignedCertificateEx с сайта решений PKI. Извлеките содержимое сценария и импортируйте требуемый командлет.

# Only run if you could not use New-SelfSignedCertificate
Import-Module -Name c:\ExtractedModule\New-SelfSignedCertificateEx.ps1

Замените в сценарии следующие две строки, чтобы создать сертификат.

New-SelfSignedCertificateEx -StoreLocation CurrentUser `
  -Subject "CN=exampleapp" `
  -KeySpec "Exchange" `
  -FriendlyName "exampleapp"
$cert = Get-ChildItem -path Cert:\CurrentUser\my | where {$PSitem.Subject -eq 'CN=exampleapp' }

Предоставление сертификата с помощью автоматизированного сценария PowerShell

При каждом входе в качестве субъекта-службы указывайте идентификатор клиента каталога, выделенный для приложения AD. Клиент — это экземпляр Azure AD.

$TenantId = (Get-AzSubscription -SubscriptionName "Contoso Default").TenantId
$ApplicationId = (Get-AzADApplication -DisplayNameStartWith exampleapp).ApplicationId

$Thumbprint = (Get-ChildItem cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq "CN=exampleappScriptCert" }).Thumbprint
Connect-AzAccount -ServicePrincipal `
  -CertificateThumbprint $Thumbprint `
  -ApplicationId $ApplicationId `
  -TenantId $TenantId

Создание субъекта-службы с помощью сертификата из центра сертификации

В приведенном ниже примере создается субъект-служба с сертификатом, выданным центром сертификации. Назначение ограничено указанной подпиской Azure. Субъекту-службе назначается роль Читатель. Если при назначении ролей возникнет ошибка, назначение выполняется повторно.

Param (
 [Parameter(Mandatory=$true)]
 [String] $ApplicationDisplayName,

 [Parameter(Mandatory=$true)]
 [String] $SubscriptionId,

 [Parameter(Mandatory=$true)]
 [String] $CertPath,

 [Parameter(Mandatory=$true)]
 [String] $CertPlainPassword
 )

 Connect-AzAccount
 Import-Module Az.Resources
 Set-AzContext -Subscription $SubscriptionId

 $CertPassword = ConvertTo-SecureString $CertPlainPassword -AsPlainText -Force

 $PFXCert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @($CertPath, $CertPassword)
 $KeyValue = [System.Convert]::ToBase64String($PFXCert.GetRawCertData())

 $ServicePrincipal = New-AzADServicePrincipal -DisplayName $ApplicationDisplayName
 New-AzADSpCredential -ObjectId $ServicePrincipal.Id -CertValue $KeyValue -StartDate $PFXCert.NotBefore -EndDate $PFXCert.NotAfter
 Get-AzADServicePrincipal -ObjectId $ServicePrincipal.Id 

 $NewRole = $null
 $Retries = 0;
 While ($NewRole -eq $null -and $Retries -le 6)
 {
    # Sleep here for a few seconds to allow the service principal application to become active (should only take a couple of seconds normally)
    Sleep 15
    New-AzRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $ServicePrincipal.ApplicationId | Write-Verbose -ErrorAction SilentlyContinue
    $NewRole = Get-AzRoleAssignment -ObjectId $ServicePrincipal.Id -ErrorAction SilentlyContinue
    $Retries++;
 }

 $NewRole

Предоставление сертификата с помощью автоматизированного сценария PowerShell

При каждом входе в качестве субъекта-службы указывайте идентификатор клиента каталога, выделенный для приложения AD. Клиент — это экземпляр Azure AD.

Param (

 [Parameter(Mandatory=$true)]
 [String] $CertPath,

 [Parameter(Mandatory=$true)]
 [String] $CertPlainPassword,

 [Parameter(Mandatory=$true)]
 [String] $ApplicationId,

 [Parameter(Mandatory=$true)]
 [String] $TenantId
 )

 $CertPassword = ConvertTo-SecureString $CertPlainPassword -AsPlainText -Force
 $PFXCert = New-Object `
  -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 `
  -ArgumentList @($CertPath, $CertPassword)
 $Thumbprint = $PFXCert.Thumbprint

 Connect-AzAccount -ServicePrincipal `
  -CertificateThumbprint $Thumbprint `
  -ApplicationId $ApplicationId `
  -TenantId $TenantId

Идентификаторы приложения и клиента не являются конфиденциальными, поэтому их можно внедрить непосредственно в скрипт. Чтобы получить идентификатор клиента, используйте следующий командлет:

(Get-AzSubscription -SubscriptionName "Contoso Default").TenantId

Чтобы получить идентификатор приложения, используйте следующий командлет:

(Get-AzADApplication -DisplayNameStartWith {display-name}).ApplicationId

Изменение учетных данных

Чтобы изменить учетные данные для приложения AD из-за нарушения безопасности или истечения их срока действия, используйте командлеты Remove-AzADAppCredential и New-AzADAppCredential.

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

Get-AzADApplication -DisplayName exampleapp | Remove-AzADAppCredential

Чтобы добавить значение сертификата, создайте самозаверяющий сертификат, как показано в этой статье. Затем используйте следующую команду.

Get-AzADApplication -DisplayName exampleapp | New-AzADAppCredential `
  -CertValue $keyValue `
  -EndDate $cert.NotAfter `
  -StartDate $cert.NotBefore

Отладка

При создании субъекта-службы могут возникнуть следующие ошибки.

  • "Authentication_Unauthorized" (Аутентификация не выполнена) или "No subscription found in the context" (В контексте не удалось найти подписку). Эта ошибка может отобразиться, если учетная запись не имеет необходимых разрешений в Azure AD для регистрации приложения. Как правило, эта ошибка возникает, когда только пользователи с правами администратора в Azure Active Directory могут регистрировать приложения, а вы используете учетную запись без прав администратора. Попросите администратора назначить вам роль администратора или разрешить пользователям самостоятельно регистрировать приложения.

  • Ваша учетная запись "не авторизована для выполнения действия 'Microsoft.Authorization/roleAssignments/write' с областью '/subscriptions/{guid}'." Эта ошибка возникает, когда учетная запись не имеет достаточно разрешений для назначения роли удостоверению. Попросите администратора подписки назначить вам роль администратора доступа пользователей.

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