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

使用 Azure PowerShell 创建 Azure 服务主体

警告

AzureRM PowerShell 模块已自 2024 年 2 月 29 日起正式弃用。 为了确保持续获得支持和更新,建议用户从 AzureRM 迁移到 Az PowerShell 模块。

尽管 AzureRM 模块仍可运行,但不再受到维护或支持,任何继续使用的行为都由用户自行决定并自行承担风险。 有关过渡到 Az 模块的指导,请参阅我们的迁移资源

如果打算使用 Azure PowerShell 来管理应用或服务,应使用 Azure Microsoft Entra 服务主体而不是自己的凭据运行 PowerShell。 本文逐步讲解如何使用 Azure PowerShell 创建安全主体。

注意

也可以通过 Azure 门户创建服务主体。 有关详细信息,请参阅使用门户创建可访问资源的 Active Directory 应用程序和服务主体

什么是“服务主体”?

Azure 服务主体是用户创建的应用、服务和自动化工具用来访问特定 Azure 资源的安全标识。 可将其视为具有特定角色,并且权限受到严格控制的“用户标识”(用户名和密码,或者证书)。 与普通的用户标识不同,服务主体只需执行特定的操作。 如果只向它授予执行管理任务所需的最低权限级别,则可以提高安全性。

验证自己的权限级别

首先,在 Microsoft Entra ID 和 Azure 订阅中必须拥有足够的权限。 必须能够在 Active Directory 中创建应用并向服务主体分配角色。

检查帐户是否有适当权限的最简方法是使用门户。 请参阅在门户中检查所需的权限

为应用创建服务主体

登录到 Azure 帐户后,可以创建服务主体。 必须使用以下方式之一来标识已部署的应用:

  • 已部署的应用的唯一名称(例如以下示例中的“MyDemoWebApp”),或
  • 应用程序 ID,即与已部署的应用、服务或对象关联的唯一 GUID

获取有关应用程序的信息

可以使用 Get-AzureRmADApplication cmdlet 获取有关应用程序的信息。

Get-AzureRmADApplication -DisplayNameStartWith MyDemoWebApp
DisplayName             : MyDemoWebApp
ObjectId                : 775f64cd-0ec8-4b9b-b69a-8b8946022d9f
IdentifierUris          : {http://MyDemoWebApp}
HomePage                : http://www.contoso.com
Type                    : Application
ApplicationId           : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
AvailableToOtherTenants : False
AppPermissions          :
ReplyUrls               : {}

为应用程序创建服务主体

可以使用 New-AzureRmADServicePrincipal cmdlet 创建服务主体。

$servicePrincipal = New-AzureRmADServicePrincipal -ApplicationId 00c01aaa-1603-49fc-b6df-b78c4e5138b4
Secret                : System.Security.SecureString
ServicePrincipalNames : {00c01aaa-1603-49fc-b6df-b78c4e5138b4, http://MyDemoWebApp}
ApplicationId         : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
DisplayName           : MyDemoWebApp
Id                    : 698138e7-d7b6-4738-a866-b4e3081a69e4
AdfsId                :
Type                  : ServicePrincipal

从这里,你可以在 Connect-AzureRmAccount 中直接使用 $servicePrincipal.Secret 属性(请参阅下文的“使用服务主体进行登录”),也可以将此 SecureString 转换为纯文本字符串供以后使用:

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($servicePrincipal.Secret)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR)

使用服务主体登录

现在,可以使用你提供的 appId 和自动生成的密码,以应用的新服务主体身份登录。 还需要服务主体的租户 ID。 使用个人凭据登录到 Azure 时,会显示租户 ID。 若要使用服务主体登录,请使用以下命令:

$cred = New-Object System.Management.Automation.PSCredential ("00c01aaa-1603-49fc-b6df-b78c4e5138b4", $servicePrincipal.Secret)
Connect-AzureRmAccount -Credential $cred -ServicePrincipal -TenantId 00000000-0000-0000-0000-000000000000

成功登录后,会看到如下所示的输出:

Environment           : AzureCloud
Account               : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
TenantId              : 00000000-0000-0000-0000-000000000000
SubscriptionId        :
SubscriptionName      :
CurrentStorageAccount :

祝贺! 现在可以使用这些凭据来运行应用。 接下来,需要调整服务主体的权限。

管理角色

注意

Azure 基于角色的访问控制 (RBAC) 是定义和管理用户及服务主体的角色时使用的模型。 角色具有关联的权限集,这些权限确定主体可以读取、访问、写入或管理的资源。 有关 RBAC 和角色的详细信息,请参阅 RBAC:内置角色

Azure PowerShell 提供以下 cmdlet 用于管理角色分配:

服务主体的默认角色是“参与者”。 由于该角色的权限比较广泛,根据应用与 Azure 服务之间的交互范围,该角色可能不是最合适的选择。 “读取者”角色受到严格的限制,可能非常适合用于只读的应用。 可以查看有关角色特定的权限的详细信息,或者如何通过 Azure 门户创建自定义角色。

本示例将“读取者”角色添加到前面的示例,并删除“参与者”角色:

New-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4 -RoleDefinitionName Reader
RoleAssignmentId   : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Authorization/roleAssignments/818892f2-d075-46a1-a3a2-3a4e1a12fcd5
Scope              : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG
DisplayName        : MyDemoWebApp
SignInName         :
RoleDefinitionName : Reader
RoleDefinitionId   : b24988ac-6180-42a0-ab88-20f7382dd24c
ObjectId           : 698138e7-d7b6-4738-a866-b4e3081a69e4
ObjectType         : ServicePrincipal
Remove-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4 -RoleDefinitionName Contributor

查看当前分配的角色:

Get-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4
RoleAssignmentId   : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Authorization/roleAssignments/0906bbd8-9982-4c03-8dae-aeaae8b13f9e
Scope              : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG
DisplayName        : MyDemoWebApp
SignInName         :
RoleDefinitionName : Reader
RoleDefinitionId   : acdd72a7-3385-48ef-bd42-f606fba81ae7
ObjectId           : 698138e7-d7b6-4738-a866-b4e3081a69e4
ObjectType         : ServicePrincipal

用于角色管理的其他 Azure PowerShell cmdlet:

更改安全主体的凭据

良好的安全做法是定期审查权限并更新密码。 此外,随着应用的变化,可能还需要管理和修改安全凭据。 例如,可以通过创建新密码并删除旧密码来更改服务主体的密码。

为服务主体添加新密码

New-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
Secret    : System.Security.SecureString
StartDate : 11/16/2018 12:38:23 AM
EndDate   : 11/16/2019 12:38:23 AM
KeyId     : 6f801c3e-6fcd-42b9-be8e-320b17ba1d36
Type      : Password

获取主体服务的凭据列表

Get-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
StartDate           EndDate             KeyId                                Type
---------           -------             -----                                ----
3/8/2017 5:58:24 PM 3/8/2018 5:58:24 PM 6f801c3e-6fcd-42b9-be8e-320b17ba1d36 Password
5/5/2016 4:55:27 PM 5/5/2017 4:55:27 PM ca9d4846-4972-4c70-b6f5-a4effa60b9bc Password

删除服务主体的旧密码

Remove-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp -KeyId ca9d4846-4972-4c70-b6f5-a4effa60b9bc
Confirm
Are you sure you want to remove credential with keyId '6f801c3e-6fcd-42b9-be8e-320b17ba1d36' for
service principal objectId '698138e7-d7b6-4738-a866-b4e3081a69e4'.
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

验证主体服务的凭据列表

Get-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
StartDate           EndDate             KeyId                                Type
---------           -------             -----                                ----
3/8/2017 5:58:24 PM 3/8/2018 5:58:24 PM 6f801c3e-6fcd-42b9-be8e-320b17ba1d36 Password

获取有关服务主体的信息

$svcprincipal = Get-AzureRmADServicePrincipal -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4
$svcprincipal | Select-Object -Property *
ServicePrincipalNames : {http://MyDemoWebApp, 00c01aaa-1603-49fc-b6df-b78c4e5138b4}
ApplicationId         : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
DisplayName           : MyDemoWebApp
Id                    : 698138e7-d7b6-4738-a866-b4e3081a69e4
Type                  : ServicePrincipal