使用 Azure CLI 创建 Azure 服务主体

使用 Azure 服务的自动化工具应始终具有受限的权限,以确保 Azure 资源安全。 因此,Azure 提供服务主体,而不是让应用程序以完全特权用户的身份登录。 Azure 服务主体是为应用程序、托管服务和自动化工具创建的身份。 此标识用于访问资源。

本教程中,您将学习如何:

  • 创建服务主体
  • 使用服务主体和密码登录
  • 使用服务主体和证书登录
  • 管理服务主体角色
  • 使用服务主体创建 Azure 资源
  • 重置服务主体凭据

先决条件

  • 在订阅中,必须具有 User Access AdministratorRole Based Access Control Administrator 权限或更高权限才能创建服务主体。 有关可用于 Azure 基于角色的访问控制的角色列表(Azure RBAC),请参阅 Azure 内置角色

创建服务主体

使用 az ad sp create-for-rbac Azure CLI 参考命令创建服务主体。 此示例未指定 --name 参数,因此会自动创建包含时间戳的名称。

az ad sp create-for-rbac

输出控制台:

{
  "appId": "myAppId",
  "displayName": "myServicePrincipalName",
  "password": "myServicePrincipalPassword",
  "tenant": "myTentantId"
}

如果以后不遵循资源命名约定并计划为新服务主体创建角色和范围,则不带参数的 az ad sp create-for-rbac 命令是可接受的解决方案。 但是,如果没有角色和范围,新服务主体无权访问资源。 它只是存在。

在不使用参数的情况下创建服务主体时,还要完成以下步骤:

注释

如果您的账户没有创建服务主体的权限,az ad sp create-for-rbac 会返回一条包含“权限不足,无法完成操作”的错误消息。 请联系您的 Microsoft Entra 管理员以创建服务主体。

在 Microsoft Entra ID 目录中,当用户设置 用户可以注册应用程序 已设置为 时,您必须是以下 Microsoft Entra ID 内置角色之一的成员(这些角色具有操作:microsoft.directory/applications/createAsOwnermicrosoft.directory/applications/create):

有关 Microsoft Entra ID 中用户设置的更多信息,请参阅限制谁可以创建应用程序

创建具有角色和范围的服务主体

始终在创建服务主体时分配特定的--role--scopes 是最佳做法。 执行以下步骤:

  1. 确定正确的角色。

    确定角色时,请始终使用最低特权原则。 例如,如果服务主体只需要访问资源组中的 Azure 存储,请不要向订阅授予服务主体 contributor 权限。 考虑一个专门的角色,例如 存储 Blob 数据贡献者。 有关 Azure RBAC 中可用角色的完整列表,请参阅 Azure 内置角色

  2. 获取 scopes 参数的值。

    查找并复制新服务主体需要访问的 Azure 资源 的资源 ID 。 此信息通常在 Azure 门户的每个资源的 “属性 ”或 “终结点 ”页中找到。 下面是常见--scopes示例,但对于实际格式和数值,请依赖您的Resource ID

    范围 示例:
    订阅 /subscriptions/mySubscriptionID
    资源组 /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName
    虚拟机 /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName/providers/Microsoft.Compute/virtualMachines/myVMname
    存储帐户文件服务 /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName/providers/Microsoft.Storage/storageAccounts/myStorageAccountName/fileServices/default
    数据工厂 /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName/providers/Microsoft.DataFactory/factories/myDataFactoryName

    有关更多范围示例,请参阅 了解 Azure RBAC 的范围

  3. 创建服务主体。

    在此示例中,将使用对资源组 RG1 中的所有资源的读取者权限创建名为 myServicePrincipalName1 的新服务主体。

    # Bash script
    az ad sp create-for-rbac --name myServicePrincipalName1 \
                             --role reader \
                             --scopes /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG1
    

    --scopes 参数接受以空格分隔的范围列表。 在此示例中,将使用对资源组 myRG1 中的所有资源的读取者权限创建名为 myServicePrincipalName2 的新服务主体。 此服务主体还被授予在 myRG2 中的 myVM读取者权限。

    # Bash script
    az ad sp create-for-rbac --name myServicePrincipalName2 \
                             --role reader \
                             --scopes /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG1 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG2/providers/Microsoft.Compute/virtualMachines/myVM
    

如果你决定授予对新服务主体的权限太少或太多,请通过 管理服务主体角色来更改权限。

使用变量创建服务主体

还可以使用变量创建服务主体:

# Bash script
let "randomIdentifier=$RANDOM*$RANDOM"
servicePrincipalName="msdocs-sp-$randomIdentifier"
roleName="azureRoleName"
subscriptionID=$(az account show --query id --output tsv)
# Verify the ID of the active subscription
echo "Using subscription ID $subscriptionID"
resourceGroup="myResourceGroupName"

echo "Creating SP for RBAC with name $servicePrincipalName, with role $roleName and in scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup"
az ad sp create-for-rbac --name $servicePrincipalName \
                         --role $roleName \
                         --scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup

有关服务主体属性的完整列表,请使用 az ad sp list,并参阅 获取现有服务主体

警告

使用 az ad sp create-for-rbac 命令创建 Azure 服务主体时,输出包含必须保护的凭据。 请确保没有将这些凭据包含在代码中,也没有将凭据签入到源代码管理中。 或者,请考虑使用 托管标识(如果可用),以避免需要使用凭据。

后续步骤

了解如何创建 Azure 服务主体后,请继续执行下一步,了解如何将服务主体与基于密码的身份验证配合使用。