你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure PowerShell 创建 Azure 服务主体

使用 Azure 服务的自动化工具应始终具有受限的权限。 Azure 提供了服务主体,而不是让应用程序以具有完全特权的用户身份登录。

Azure 服务主体是一种身份,专为与应用程序、托管服务和自动化工具一起使用以访问 Azure 资源而创建。 此访问权限受分配给服务主体的角色的限制,使你能够控制可以访问的资源和级别。 出于安全原因,始终建议将服务主体与自动化工具一起使用,而不是允许它们使用用户标识登录。

本文介绍使用 Azure PowerShell 创建、获取有关服务主体的信息和重置服务主体的步骤。

创建服务主体

警告

使用 New-AzADServicePrincipal 命令创建服务主体时,输出中有你必须保护的凭据。 替代方法是,请考虑使用 托管标识来消除使用凭据的需求。

默认情况下,New-AzADServicePrincipal 会将参与者角色分配给订阅范围中的服务主体。 若要降低被盗用的服务主体的风险,请分配更具体的角色,并将范围缩小为一个资源或资源组。 有关详细信息,请参阅添加角色分配的步骤

使用 New-AzADServicePrincipal cmdlet 创建服务主体。 在创建服务主体时,需选择其使用的登录身份验证的类型。

注释

如果帐户无权创建服务主体,将返回一条错误消息, New-AzADServicePrincipal 其中包含“权限不足,无法完成作”。请联系Microsoft Entra 管理员创建服务主体。

有两种类型的身份验证可用于服务主体:基于密码的身份验证和基于证书的身份验证。

基于密码的身份验证

如果没有任何其他身份验证参数,将使用基于密码的身份验证,并创建一个随机密码。 如果需要基于密码的身份验证,建议使用此方法。

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

返回的对象包含 Secret 成员,该成员是 SecureString 包含生成的密码。 请确保将此值存储在安全位置,以便通过服务主体进行身份验证。 其值 不会 显示在控制台输出中。 如果您忘记密码,重置服务主体凭据

以下代码允许导出机密:

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
$UnsecureSecret = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

对于用户提供的密码,参数 -PasswordCredential 采用 Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential 对象。 这些对象必须具有有效的StartDateEndDate,并采用纯文本Password。 创建密码时,请确保遵循 Microsoft Entra 密码规则和限制。 不要使用弱密码或重复使用密码。

Import-Module Az.Resources # Imports the PSADPasswordCredential object
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=<Choose a strong password>}
$sp = New-AzAdServicePrincipal -DisplayName ServicePrincipalName -PasswordCredential $credentials

New-AzADServicePrincipal 中返回的对象包含 IdDisplayName 成员,其中任一对象都可用于使用服务主体登录。

重要

使用服务主体进行登录需要使用在其下创建了服务主体的租户 ID。 若要在创建服务主体时获取活动租户,请在创建服务主体 后立即 运行以下命令:

(Get-AzContext).Tenant.Id

基于证书的身份验证

使用基于证书的身份验证的服务主体是通过 -CertValue 参数创建的。 此参数采用公共证书的 base64 编码 ASCII 字符串。 这由 PEM 文件或文本编码的 CRT 或 CER 表示。 不支持公共证书的二进制编码。 这些说明假定你已有可用的证书。

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

您还可以使用-KeyCredential参数,该参数接受PSADKeyCredential对象。 这些对象必须具有有效的 StartDateEndDate,并且 CertValue 成员必须设置为公共证书的 base64 编码 ASCII 字符串。

$cert = <public certificate as base64-encoded string>
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADKeyCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; KeyId=New-Guid; CertValue=$cert}
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -KeyCredential $credentials

New-AzADServicePrincipal 中返回的对象包含 IdDisplayName 成员,其中任一对象都可用于使用服务主体登录。 使用服务主体登录的客户端还需要访问证书的私钥。

重要

使用服务主体进行登录需要使用在其下创建了服务主体的租户 ID。 若要在创建服务主体时获取活动租户,请在创建服务主体 后立即 运行以下命令:

(Get-AzContext).Tenant.Id

获取现有服务主体

可以使用 Get-AzADServicePrincipal 检索当前活动租户的服务主体列表。 默认情况下,此命令将返回租户 中的所有 服务主体,因此对于大型组织,可能需要很长时间才能返回结果。 建议改用可选的服务器端筛选参数之一:

  • -DisplayNameBeginsWith 请求具有与提供值匹配的 前缀 的服务主体。 服务主体的显示名称是在创建期间通过 -DisplayName 设置的值。
  • -DisplayName 用于请求服务主体名称的确切匹配

管理服务主体角色

Azure PowerShell 具有以下 cmdlet 来管理角色分配:

服务主体的默认角色是 参与者。 此角色具有读取和写入 Azure 帐户的完整权限。 读取 角色具有更严格的限制,具有只读访问权限。 有关 Role-Based 访问控制(RBAC)和角色的详细信息,请参阅 RBAC:内置角色

此示例添加 读者 角色并删除 参与者 角色:

New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName "Reader"
Remove-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName "Contributor"

重要

角色分配 cmdlet 不接受服务主体对象 ID。 它们接受在创建时生成的关联应用程序 ID。 若要获取服务主体的应用程序 ID,请使用 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 <tenant ID> -CertificateThumbprint <thumbprint>

有关将证书导入 PowerShell 可访问的凭据存储的说明,请参阅 使用 Azure PowerShell 登录

重置凭据

如果忘记了服务主体的凭据,请使用 New-AzADSpCredential 添加新凭据。 此cmdlet采用与New-AzADServicePrincipal相同的凭据参数和类型。 如果没有任何凭据参数, PasswordCredential 则会创建具有随机密码的新密码。

重要

在分配任何新凭据之前,可能需要删除现有凭据以防止使用它们登录。 为此,请使用 Remove-AzADSpCredential cmdlet:

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