你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 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
对象。 这些对象必须具有有效的StartDate
和EndDate
,并采用纯文本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
中返回的对象包含 Id
和 DisplayName
成员,其中任一对象都可用于使用服务主体登录。
重要
使用服务主体进行登录需要使用在其下创建了服务主体的租户 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
对象。 这些对象必须具有有效的 StartDate
和 EndDate
,并且 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
中返回的对象包含 Id
和 DisplayName
成员,其中任一对象都可用于使用服务主体登录。 使用服务主体登录的客户端还需要访问证书的私钥。
重要
使用服务主体进行登录需要使用在其下创建了服务主体的租户 ID。 若要在创建服务主体时获取活动租户,请在创建服务主体 后立即 运行以下命令:
(Get-AzContext).Tenant.Id
获取现有服务主体
可以使用 Get-AzADServicePrincipal 检索当前活动租户的服务主体列表。 默认情况下,此命令将返回租户 中的所有 服务主体,因此对于大型组织,可能需要很长时间才能返回结果。 建议改用可选的服务器端筛选参数之一:
-
-DisplayNameBeginsWith
请求具有与提供值匹配的 前缀 的服务主体。 服务主体的显示名称是在创建期间通过-DisplayName
设置的值。 -
-DisplayName
用于请求服务主体名称的确切匹配。
管理服务主体角色
Azure PowerShell 具有以下 cmdlet 来管理角色分配:
- Get-AzRoleAssignment(获取 Azure 角色分配)
- New-AzRoleAssignment
- Remove-AzRoleAssignment(移除 Azure 角色分配)
服务主体的默认角色是 参与者。 此角色具有读取和写入 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