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

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

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

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

Внимание

При создании субъекта-службы с помощью команды New-AzADServicePrincipal в выходные данные включаются учетные данные, которые необходимо защитить. В качестве альтернативы можно использовать управляемые удостоверения, чтобы не работать с учетными данными.

Необходимые компоненты

Создание субъекта-службы

Вы можете создать субъект-службу с помощью командлета New-AzADServicePrincipal. При создании субъекта-службы вы задаете используемый им тип аутентификации для входа.

Внимание

Начиная с модуля Az PowerShell версии 7.x командлет New-AzADServicePrincipal больше по умолчанию не назначает роль Участник субъекту-службе. Чтобы назначать определенную роль субъекту-службе, см. статью Действия по назначению роли Azure.

Примечание.

Если у вашей учетной записи нет разрешения на создание субъекта-службы, возвращает сообщение об ошибке, New-AzADServicePrincipal содержащее "Недостаточно привилегий для завершения операции". Чтобы создать субъект-службу, обратитесь к администратору Microsoft Entra.

В каталоге идентификатора Microsoft Entra ID, где пользователи могут зарегистрировать приложения , установлено значение No, необходимо быть членом одной из следующих встроенных ролей Microsoft Entra ID (которые имеют действие: microsoft.directory/applications/createAsOwner или microsoft.directory/applications/create):

Дополнительные сведения о параметрах пользователей в идентификаторе Microsoft Entra см. в разделе "Ограничение возможностей создания приложений".

Для субъектов-служб доступны два вида аутентификации: на основе пароля и на основе сертификата.

Аутентификация на основе пароля

Внимание

Роль по умолчанию для субъекта-службы аутентификации на основе пароля — Участник. Эта роль имеет все разрешения на чтение из учетной записи Azure и запись в нее. Сведения о назначении ролей см. в разделе Управление ролями субъекта-службы.

Если другие параметры аутентификации не указаны, используется аутентификация на основе пароля, который генерируется случайным образом. Это рекомендованный метод, если вам нужна аутентификация на основе пароля.

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

Возвращаемый объект содержит свойство PasswordCredentials.SecretText со сгенерированным паролем. Обязательно сохраните это значение в надежном расположении, чтобы выполнять аутентификацию с помощью субъекта-службы. Его значение не будет отображаться в выходных данных консоли. Если вы потеряли пароль, сбросьте учетные данные субъекта-службы.

Следующий код позволяет экспортировать секрет:

$sp.PasswordCredentials.SecretText

Объект, возвращенный командлетом New-AzADServicePrincipal, содержит элементы Id и DisplayName, каждый из которых можно использовать для входа с помощью субъекта-службы.

Внимание

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

(Get-AzContext).Tenant.Id

Проверка подлинности на основе сертификатов

Внимание

При создании субъекта-службы аутентификации на основе сертификата роль по умолчанию не назначается. Сведения о назначении ролей см. в разделе Управление ролями субъекта-службы.

Субъекты-службы с аутентификацией на основе сертификата создаются с указанием параметра CertValue. Этот параметр принимает строку ASCII открытого сертификата в кодировке Base64 в виде файла PEM, а также файла CRT или CER с текстовой кодировкой. Двоичная кодировка открытых сертификатов не поддерживается. При выполнении этих инструкций предполагается, что у вас уже есть сертификат.

$cert = <public certificate as base64-encoded string>
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -CertValue $cert

Объект, возвращенный командлетом New-AzADServicePrincipal, содержит свойства Id и DisplayName, каждый из которых можно использовать для входа с помощью субъекта-службы. Клиентам, которые выполняют вход с использованием субъекта-службы, также нужен доступ к закрытому ключу сертификата.

Внимание

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

(Get-AzContext).Tenant.Id

Получение существующего субъекта-службы

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

  • DisplayNameBeginsWith — запрашивает субъекты-службы с префиксом, который совпадает с указанным значением. Отображаемое имя субъекта-службы представляет собой значение, заданное при создании с помощью параметра DisplayName.
  • DisplayName  — запрашивает точное совпадение для имени субъекта-службы.

Управление ролями субъекта-службы

В Azure PowerShell доступны следующие командлеты для управления назначением ролей:

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

В следующем примере мы добавим роль читателя и удалим роль участника:

New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName 'Reader'
Remove-AzRoleAssignment -ObjectId <service principal object ID> -RoleDefinitionName 'Contributor'

Внимание

Командлеты назначения ролей не принимают идентификатор объекта субъекта-службы. Они принимают связанный идентификатор приложения, который генерируется во время создания. Чтобы получить идентификатор приложения для субъекта-службы, воспользуйтесь командлетом Get-AzADServicePrincipal.

Примечание.

Если у вашей учетной записи нет разрешения на назначение роли, появится сообщение об ошибке о том, что у вашей учетной записи нет авторизации для выполнения действия "Microsoft.Authorization/roleAssignments/write". Чтобы управлять ролями, обратитесь к администратору Microsoft Entra.

Добавление роли не ограничивает назначенные ранее разрешения. При ограничении разрешений субъекта-службы обязательно удалите роль участника.

Чтобы проверить изменения, выведите назначенные роли:

Get-AzRoleAssignment -ServicePrincipalName ServicePrincipalName

Вход с помощью субъекта-службы

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

Чтобы войти с использованием субъекта-службы с помощью пароля:

# Use the application ID as the username, and the secret as password
$credentials = Get-Credential
Connect-AzAccount -ServicePrincipal -Credential $credentials -Tenant <tenant ID>

Для аутентификации на основе сертификата обязательно, чтобы среда Azure PowerShell могла извлекать данные из локального хранилища сертификатов по отпечатку сертификата.

Connect-AzAccount -ServicePrincipal -Tenant <TenantId> -CertificateThumbprint <Thumbprint> -ApplicationId <ApplicationId>

Инструкции по импорту сертификата в хранилище учетных данных, доступного PowerShell, см. в разделе "Проверка подлинности на основе сертификатов"

Сброс учетных данных

Если вы забыли учетные данные для субъекта-службы, воспользуйтесь командлетом New-AzADSpCredential, чтобы добавить новые учетные данные с произвольным паролем. Этот командлет не поддерживает пользовательские учетные данные при сбросе пароля.

Внимание

Прежде чем назначить новые учетные данные, удалите существующие, чтобы предотвратить вход с их использованием. Для этого выполните командлет Remove-AzADSpCredential:

Remove-AzADSpCredential -DisplayName ServicePrincipalName
$newCredential = New-AzADSpCredential -ServicePrincipalName ServicePrincipalName

Устранение неполадок

Если вы получаете ошибку New-AzADServicePrincipal: Another object with the same value for property identifierUris already exists (New-AzADServicePrincipal: другой объект с таким же значением свойства identifierUris уже существует), убедитесь, что субъект-служба с таким же именем не существует.

Get-AzAdServicePrincipal -DisplayName ServicePrincipalName

Если существующий субъект-служба больше не нужен, его можно удалить, используя следующий пример.

Remove-AzAdServicePrincipal -DisplayName ServicePrincipalName

Эта ошибка также может возникать, если вы ранее создали субъект-службу для приложения Azure Active Directory. При удалении субъекта-службы приложение остается доступным. Это приложение не позволяет создать другой субъект-службу с тем же именем.

В следующем примере можно убедиться, что приложение Microsoft Entra с тем же именем не существует:

Get-AzADApplication -DisplayName ServicePrincipalName

Если приложение с тем же именем уже существует, но больше не требуется, его можно удалить, используя следующий пример.

Remove-AzADApplication -DisplayName ServicePrincipalName

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