Создание субъекта-службы Azure с помощью Azure PowerShell
Разрешения для автоматизированных средств, которые используют службы Azure, всегда должны быть ограничены. Вместо того, чтобы приложения входили в систему как полностью привилегированный пользователь, Azure предлагает субъекты-службы.
Субъект-служба Azure — это удостоверение, созданное для использования с приложениями, размещенными службами и автоматизированными средствами с целью получения доступа к ресурсам Azure. Такой доступ ограничен ролями, которые назначены субъекту-службе, что позволяет управлять разрешениями доступа к ресурсам, в том числе на разных уровнях. По соображениям безопасности мы рекомендуем всегда использовать субъекты-службы с автоматизированными средствами, чтобы не допускать их входа с помощью удостоверения пользователя.
В этой статье описано, как создать субъект-службу, получить сведения о нем и сбросить его с помощью Azure PowerShell.
Внимание
При создании субъекта-службы с помощью команды New-AzADServicePrincipal в выходные данные включаются учетные данные, которые необходимо защитить. В качестве альтернативы можно использовать управляемые удостоверения, чтобы не работать с учетными данными.
Необходимые компоненты
- Если вы решили использовать Azure PowerShell локально:
- Установите модуль Az PowerShell.
- Подключитесь к учетной записи Azure с помощью командлета Connect-AzAccount.
- Если вы решили использовать Azure Cloud Shell:
- Дополнительные сведения см. в статье Общие сведения об Azure Cloud Shell.
Создание субъекта-службы
Вы можете создать субъект-службу с помощью командлета 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
В противном случае выберите другое имя для нового субъекта-службы, который вы пытаетесь создать.