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

使用 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. 获取范围参数的值。

    查找并复制新服务主体需访问的 Azure 资源的资源 ID。 此信息通常可在 Azure 门户的属性或每个资源的终结点页中找到。 下面是常见的 --scopes 示例,但依赖于实际格式和值的资源 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. 创建服务主体。

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

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

    --scopes 参数接受以空格分隔的范围列表。 在此示例中,会新建名为myServicePrincipalName2的服务主体,该服务主体对资源组myRG1中的所有资源具有读取者权限。 此服务主体还将获得针对myVM(位于myRG2中)的读取者权限。

    # 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 服务主体后,请继续执行下一步,了解如何通过基于密码的身份验证来使用服务主体。