Создание субъекта-службы 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
В противном случае выберите другое имя для нового субъекта-службы, который вы пытаетесь создать.