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


Use Azure PowerShell to create a service principal with a certificate (Использование Azure PowerShell для создания субъекта-службы с сертификатом)

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

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

Внимание

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

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

Для этого статьи требуется последняя версия PowerShell.

Примечание.

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

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

Чтобы завершить эту статью, необходимо иметь достаточные разрешения как в идентификаторе Microsoft Entra, так и в подписке Azure. В частности, вы должны иметь возможность создать приложение в Microsoft Entra ID и назначить служебный принципал на роль.

Самый простой способ проверить, имеет ли ваша учетная запись соответствующие разрешения, — через Центр администрирования Microsoft Entra.

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

Чтобы обеспечить доступ к ресурсам в подписке, необходимо назначить приложению роль. Укажите, какая роль предоставляет приложению необходимые разрешения. Дополнительные сведения о доступных ролях см. в статье Встроенные роли 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.AppId

В примере делается пауза на 20 секунд, чтобы дать новому service principal время распространиться внутри системы Microsoft Entra ID. Если скрипт не ожидает достаточно долгого времени, появится сообщение об ошибке "Субъект {ID} не существует в каталоге {DIR-ID}". Чтобы устранить эту ошибку, подождите некоторое время, а затем снова выполните команду New-AzRoleAssignment .

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

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

# 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-приложения. Клиент (tenant) — это экземпляр Microsoft Entra ID.

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

$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.AppId | Write-Verbose -ErrorAction SilentlyContinue
    $NewRole = Get-AzRoleAssignment -ObjectId $ServicePrincipal.Id -ErrorAction SilentlyContinue
    $Retries++;
 }

 $NewRole

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

При каждом входе в качестве принципала службы указывайте идентификатор клиента каталога для вашего AD-приложения. Клиент (tenant) — это экземпляр Microsoft Entra ID.

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}).AppId

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

Чтобы изменить учетные данные для приложения 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" или "Подписка не найдена в контексте". — Эта ошибка возникает, если у вашей учетной записи нет необходимых разрешений на идентификаторе Microsoft Entra для регистрации приложения. Как правило, эта ошибка возникает, когда только администраторы в Microsoft Entra ID могут регистрировать приложения, а ваша учетная запись не является администратором. Попросите администратора либо назначить вам роль администратора, либо включить возможность регистрации приложений для пользователей.

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

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