使用服务主体名称连接不同订阅中的虚拟网络
在某些情况下,无需使用用户帐户或来宾帐户即可连接不同订阅中的虚拟网络。 在此虚拟网络操作说明中,了解如何在不同的订阅中将两个虚拟网络与服务主体名称 (SPN) 对等互连。 不同订阅中的虚拟网络与 Microsoft Entra ID 租户之间的虚拟网络对等互连必须通过 Azure CLI 或 PowerShell 对等互连。 目前,Azure 门户中没有选择将虚拟网络与不同订阅中的 SPN 对等互连。
一个 Azure 帐户,其中包含两个活动订阅和两个 Microsoft Entra ID 租户。 创建帐户。
帐户权限,用于创建服务主体、分配应用权限,并在与每个订阅关联的 Microsoft Entra ID 租户中创建资源。
可以使用本地 Azure CLI。
如果需要,请安装 Azure CLI 来运行 CLI 参考命令。
本地 Azure CLI,请了解如何安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
通过使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
- 本操作指南文章需要 2.31.0 版或更高版本的 Azure CLI。
SPN | 资源组 | 订阅/租户 | 虚拟网络 | 位置 |
---|---|---|---|---|
spn-1-peer-vnet | test-rg-1 | subscription-1 | vnet-1 | 中国北部 3 |
spn-2-peer-vnet | test-rg-2 | subscription-2 | vnet-2 | 中国东部 2 |
使用 az sign-in,在与 subscription-1 相关联的 Microsoft Entra ID 租户中使用具有创建资源组、虚拟网络和 SPN 权限的用户帐户登录 subscription-1
az cloud set -n AzureChinaCloud az login
使用 az group create 创建资源组。
az group create \ --name test-rg-1 \ --location chinanorth3
使用 az network vnet create 在 subscription-1 中创建名为 vnet-1 的虚拟网络。
az network vnet create \ --resource-group test-rg-1 \ --location chinanorth3 \ --name vnet-1 \ --address-prefixes 10.0.0.0/16 \ --subnet-name subnet-1 \ --subnet-prefixes 10.0.0.0/24
创建 spn1-peer-vnet,范围限定为上一步中创建的虚拟网络。 在将来的步骤中,此 SPN 将添加到 vnet-2 的范围内,以允许虚拟网络对等互连。
使用 az network vnet show 将前面创建的虚拟网络的资源 ID 放置在变量中,以便在后面的步骤中使用。
vnetid=$(az network vnet show \ --resource-group test-rg-1 \ --name vnet-1 \ --query id \ --output tsv)
使用 az ad sp create-for-rbac 创建 spn-1-peer-vnet,其角色网络参与者范围限定为虚拟网络 vnet-1。
az ad sp create-for-rbac \ --name spn-1-peer-vnet \ --role "Network Contributor" \ --scope $vnetid
记下步骤中创建的输出。 密码仅在此输出中显示。 将密码复制到安全位置,以便在后续登录步骤中使用。
{ "appId": "11112222-bbbb-3333-cccc-4444dddd5555", "displayName": "spn-1-peer-vnet", "password": "", "tenant": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e" }
服务主体的 appId 在后续步骤中用于完成 SPN 的配置。 使用 az ad sp list 将 SPN 的 appId 放入变量以供以后使用。
appid1=$(az ad sp list \ --display-name spn-1-peer-vnet \ --query [].appId \ --output tsv)
在上一步中创建的 SPN 必须具有重定向 URI 才能完成身份验证过程审批,并且必须转换为多租户使用。 使用 az ad app update 将 https://www.microsoft.com 添加为重定向 URI,并在 spn-1-peer-vnet 上启用多租户。
az ad app update \ --id $appid1 \ --sign-in-audience AzureADMultipleOrgs \ --web-redirect-uris https://www.microsoft.com
服务主体必须具有对目录的 User.Read 权限。 使用 az ad app permission add 和 az ad app permission grant 将 User.Read 的 Microsoft Graph 权限添加到服务主体。
az ad app permission add \ --id $appid1 \ --api 00000003-0000-0000-c000-000000000000 \ --api-permissions e1fe6dd8-ba31-4d61-89e7-88639da4683d=Scope az ad app permission grant \ --id $appid1 \ --api 00000003-0000-0000-c000-000000000000 \ --scope User.Read
使用 az sign-in,在与 subscription-2 相关联的 Microsoft Entra ID 租户中使用具有创建资源组、虚拟网络和 SPN 权限的用户帐户登录 subscription-2
az cloud set -n AzureChinaCloud az login
使用 az group create 创建资源组。
az group create \ --name test-rg-2 \ --location chinanorth3
使用 az network vnet create 在 subscription-2 中创建名为 vnet-2 的虚拟网络。
az network vnet create \ --resource-group test-rg-2 \ --location chinanorth3 \ --name vnet-2 \ --address-prefixes 10.1.0.0/16 \ --subnet-name subnet-1 \ --subnet-prefixes 10.1.0.0/24
创建 spn-2-peer-vnet,范围限定为上一步中创建的虚拟网络。 在将来的步骤中,此 SPN 将添加到 vnet-2 的范围内,以允许虚拟网络对等互连。
使用 az network vnet show 将前面创建的虚拟网络的资源 ID 放置在变量中,以便在后面的步骤中使用。
vnetid=$(az network vnet show \ --resource-group test-rg-2 \ --name vnet-2 \ --query id \ --output tsv)
使用 az ad sp create-for-rbac 创建 spn-2-peer-vnet,其角色网络参与者范围限定为虚拟网络 vnet-2。
az ad sp create-for-rbac \ --name spn-2-peer-vnet \ --role "Network Contributor" \ --scope $vnetid
记下步骤中创建的输出。 将密码复制到安全位置,以便在后续登录步骤中使用。 密码不会再次显示。
输出类似于以下输出。
{ "appId": "22223333-cccc-4444-dddd-5555eeee6666", "displayName": "spn-2-peer-vnet", "password": "", "tenant": "bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f" }
服务主体的 appId 在后续步骤中用于完成 SPN 的配置。 使用 az ad sp list 将 SPN 的 ID 放入变量以供以后使用。
appid2=$(az ad sp list \ --display-name spn-2-peer-vnet \ --query [].appId \ --output tsv)
在上一步中创建的 SPN 必须具有重定向 URI 才能完成身份验证过程审批,并且必须转换为多租户使用。 使用 az ad app update 将 https://www.microsoft.com 添加为重定向 URI,并在 spn-2-peer-vnet 上启用多租户。
az ad app update \ --id $appid2 \ --sign-in-audience AzureADMultipleOrgs \ --web-redirect-uris https://www.microsoft.com
服务主体必须具有对目录的 User.Read 权限。 使用 az ad app permission add 和 az ad app permission grant 将 User.Read 的 Microsoft Graph 权限添加到服务主体。
az ad app permission add \ --id $appid2 \ --api 00000003-0000-0000-c000-000000000000 \ --api-permissions e1fe6dd8-ba31-4d61-89e7-88639da4683d=Scope az ad app permission grant \ --id $appid2 \ --api 00000003-0000-0000-c000-000000000000 \ --scope User.Read
Microsoft Entra ID 租户中具有管理员权限的用户帐户必须完成将 spn-2-vnet-peer 添加到 subscription-1 的过程。 完成后,可以为 spn-2-vnet-peer 分配 vnet-1 的权限。
subscription-1 Microsoft Entra ID 租户中的管理员必须批准服务主体 spn-2-peer-vnet,以便可以将其添加到虚拟网络 vnet-1。 使用以下命令登录到 subscription-2,以查找 spn-2-peer-vnet的 appID。
使用 az login 登录到 subscription-2。
az cloud set -n AzureChinaCloud az login
使用 az ad sp list 获取 spn-2-peer-vnet 的 appId。 记下输出中的 appID。 此 appID 将在后续步骤的身份验证 URL 中使用。
appid2=$(az ad sp list \ --display-name spn-2-peer-vnet \ --query [].appId \ --output tsv) echo $appid2
使用 spn-2-peer-vnet 的 appid 和 subscription-1 的 Microsoft Entra ID 租户 ID 生成用于审批的登录 URL。 URL 基于以下示例生成:
https://login.partner.microsoftonline.cn/entra-tenant-id-subscription-1/oauth2/authorize?client_id={$appid2}&response_type=code&redirect_uri=https://www.microsoft.com
URL 类似于以下示例。
https://login.partner.microsoftonline.cn/aaaabbbb-0000-cccc-1111-dddd2222eeee/oauth2/authorize?client_id=22223333-cccc-4444-dddd-5555eeee6666&response_type=code&redirect_uri=https://www.microsoft.com
在 Web 浏览器中打开 URL,并在 subscription-1 中的 Microsoft Entra ID 租户中以管理员帐户登录。
批准应用程序 spn-2-peer-vnet。 microsoft.com 主页显示身份验证是否成功。
管理员批准 spn-2-peer-vnet 后,将其作为网络参与者添加到虚拟网络 vnet-1。
使用 az login 登录到 subscription-1。
az cloud set -n AzureChinaCloud az login
使用 az ad sp list 查找适用于 spn-2-peer-vnet 的 appId,并将其置于变量中供以后使用。
appid2=$(az ad sp list \ --display-name spn-2-peer-vnet \ --query [].appId \ --output tsv)
使用 az network vnet show 获取 vnet-1 的资源 ID,以便在后续步骤中使用。
vnetid=$(az network vnet show \ --resource-group test-rg-1 \ --name vnet-1 \ --query id \ --output tsv)
使用 az role assignment create 以下命令将 spn-2-peer-vnet 添加到 vnet-1 作为网络参与者。
az role assignment create --assignee $appid2 \ --role "Network Contributor" \ --scope $vnetid
Microsoft Entra ID 租户中具有管理员权限的用户帐户必须完成将 spn-1-peer-vnet 添加到 subscription-2 的过程。 完成后,可以为 spn-1-peer-vnet 分配 vnet-2 的权限。
subscription-2 Microsoft Entra ID 租户中的管理员必须批准服务主体 spn-1-peer-vnet,以便将其添加到虚拟网络 vnet-2。 使用以下命令登录到 subscription-1,查找 spn-1-peer-vnet 的 appID。
使用 az login 登录到 subscription-1。
az cloud set -n AzureChinaCloud az login
使用 az ad sp list 获取 spn-1-peer-vnet 的 appId。 记下输出中的 appID。 此 appID 将在后续步骤的身份验证 URL 中使用。
appid1=$(az ad sp list \ --display-name spn-1-peer-vnet \ --query [].appId \ --output tsv) echo $appid1
使用 spn-1-peer-vnet 的 appid 和 subscription-2 的 Microsoft Entra ID 租户 ID 生成用于审批的登录 URL。 URL 基于以下示例生成:
https://login.partner.microsoftonline.cn/entra-tenant-id-subscription-2/oauth2/authorize?client_id={$appid1}&response_type=code&redirect_uri=https://www.microsoft.com
URL 类似于以下示例。
https://login.partner.microsoftonline.cn/bbbbcccc-1111-dddd-2222-eeee3333ffff/oauth2/authorize?client_id=11112222-bbbb-3333-cccc-4444dddd5555&response_type=code&redirect_uri=https://www.microsoft.com
在 Web 浏览器中打开 URL,并在 subscription-2 中的 Microsoft Entra ID 租户中以管理员帐户登录。
批准应用程序 spn-1-peer-vnet。 microsoft.com 主页显示身份验证是否成功。
管理员批准 spn-1-peer-vnet 后,将其作为网络参与者添加到虚拟网络 vnet-2。
使用 az login 登录到 subscription-2。
az cloud set -n AzureChinaCloud az login
使用 az ad sp list 查找适用于 spn-1-peer-vnet 的 appId,并将其置于变量中供以后使用。
appid1=$(az ad sp list \ --display-name spn-1-peer-vnet \ --query [].appId \ --output tsv)
使用 az network vnet show 获取 vnet-2 的资源 ID,以便在后续步骤中使用。
vnetid=$(az network vnet show \ --resource-group test-rg-2 \ --name vnet-2 \ --query id \ --output tsv)
使用 az role assignment create 将 spn-1-peer-vnet 添加到 vnet-2 作为网络参与者。
az role assignment create --assignee $appid1 \ --role "Network Contributor" \ --scope $vnetid
若要将 vnet-1 对等互连到 vnet-2,请使用服务主体 appId 和密码登录到与 subscription-1 关联的 Microsoft Entra ID 租户。
在本文中,请登录到每个订阅,并获取每个 SPN 的 appID 以及每个虚拟网络的资源 ID。 使用这些值在后续步骤中使用 SPN 登录到每个订阅。 如果双方已有 SPN 的 appID 和虚拟网络的资源 ID,则不需要执行这些步骤即可对等互连虚拟网络。
使用 az login 使用常规用户帐户登录到 subscription-1。
az cloud set -n AzureChinaCloud az login
使用 az network vnet show 获取 vnet-1 的资源 ID,以便在后续步骤中使用。
vnetid1=$(az network vnet show \ --resource-group test-rg-1 \ --name vnet-1 \ --query id \ --output tsv)
使用 az ad sp list 获取 spn-1-peer-vnet 的 appId,并将其置于变量中,以便在后续步骤中使用。
appid1=$(az ad sp list \ --display-name spn-1-peer-vnet \ --query [].appId \ --output tsv)
使用 az login 使用常规用户帐户登录到 subscription-2。
az cloud set -n AzureChinaCloud az login
使用 az network vnet show 获取 vnet-2 的资源 ID,以便在后续步骤中使用。
vnetid2=$(az network vnet show \ --resource-group test-rg-2 \ --name vnet-2 \ --query id \ --output tsv)
使用 az ad sp list 获取 spn-2-peer-vnet 的 appId,并将其置于变量中,以便在后续步骤中使用。
appid2=$(az ad sp list \ --display-name spn-2-peer-vnet \ --query [].appId \ --output tsv) echo $appid2
使用 az logout 通过以下命令注销 Azure CLI 会话。 不要关闭终端。
az logout
使用 az login 通过 spn-1-peer-vnet 登录到 subscription-1。 需要与 subscription-1 关联的 Microsoft Entra ID 租户的租户 ID 来完成命令。 该密码以变量占位符显示在示例中。 替换为在创建资源期间记录的密码。 将
--tenant
中的占位符替换为与 subscription-1 关联的 Microsoft Entra ID 租户的租户 ID。az cloud set -n AzureChinaCloud az login \ --service-principal \ --username $appid1 \ --password $password \ --tenant aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
使用 az login 通过 spn-2-peer-vnet 登录到 subscription-2。 需要与 subscription-2 关联的 Microsoft Entra ID 租户的租户 ID 才能完成命令。 该密码以变量占位符显示在示例中。 替换为在创建资源期间记录的密码。 将
--tenant
中的占位符替换为与 subscription-2 关联的 Microsoft Entra ID 租户的租户 ID。az cloud set -n AzureChinaCloud az login \ --service-principal \ --username $appid2 \ --password $password \ --tenant bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f
使用 az account set 将上下文更改为 subscription-1。
az account set --subscription "subscription-1-subscription-id-NOT-ENTRA-TENANT-ID"
使用 az network vnet peering create 在 vnet-1 和 vnet-2 之间创建虚拟网络对等互连。
az network vnet peering create \ --name vnet-1-to-vnet-2 \ --resource-group test-rg-1 \ --vnet-name vnet-1 \ --remote-vnet $vnetid2 \ --allow-vnet-access
使用 az network vnet peering list 验证 vnet-1 与 vnet-2之间的虚拟网络对等互连。
az network vnet peering list \ --resource-group test-rg-1 \ --vnet-name vnet-1 \ --output table
使用 az account set 将上下文更改为 subscription-2。
az account set --subscription "subscription-2-subscription-id-NOT-ENTRA-TENANT-ID"
使用 az network vnet peering create 在 vnet-2 和 vnet-1 之间创建虚拟网络对等互连。
az network vnet peering create \ --name vnet-2-to-vnet-1 \ --resource-group test-rg-2 \ --vnet-name vnet-2 \ --remote-vnet $vnetid1 \ --allow-vnet-access
使用 az network vnet peering list 验证 vnet-2 和 vnet-1 之间的虚拟网络对等互连。
az network vnet peering list \ --resource-group test-rg-2 \ --vnet-name vnet-2 \ --output table