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

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

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

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

Предупреждение

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

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

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

Важно!

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

Примечание

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

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

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

Важно!

Роль по умолчанию для субъекта-службы аутентификации на основе пароля — Участник. Эта роль имеет все разрешения на чтение из учетной записи 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 доступны следующие командлеты для управления назначением ролей:

Дополнительные сведения об управлении доступом на основе ролей см. в статье Встроенные роли для управления доступом на основе ролей в Azure.

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

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

Важно!

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

Примечание

Если у вашей учетной записи нет разрешения на назначение роли, вы увидите сообщение об ошибке, информирующее о том, что ваша учетная запись не авторизована для выполнения действия Microsoft.Authorization/roleAssignments/write. Чтобы получить возможность управлять ролями, обратитесь к администратору Azure Active Directory.

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

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

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, см. в статье Sign in with Azure PowerShell (Вход с помощью Azure 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. При удалении субъекта-службы приложение остается доступным. Это приложение не позволяет создать другой субъект-службу с тем же именем.

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

Get-AzADApplication -DisplayName ServicePrincipalName

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

Remove-AzADApplication -DisplayName ServicePrincipalName

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