授予对另一个 azure 租户中的服务主体的访问权限
give access to service principal which is in another azure tenant
我们通过 Jenkins 在我们的 Azure 租户中部署资源,它使用 terraform 来配置基础资源。
并且我们使用服务主体进行同一租户中的身份验证和基础设施配置。在我们的基础设施部署中,我们还创建了 VNET 与已部署的新 Vnet 和我们的中央 VNET 对等,它拥有所有基础设施资源,如监控和日志记录平台。
现在我们有一个用例,通过使用相同的 Jenkins 和 terraform 脚本,我们希望在不同的租户上配置资源。这可以通过使用远程租户的服务主体来完成。
但现在的问题是 TenantB
的服务主体无权在 TenantA
中创建网络资源。要做到这一点,TenantB
的服务主体应该可以访问 TenantA
中的 Vnet。
我正在寻找文档或指南,我们如何在 TenantA
?
中提供对 TenantB
服务主体的访问权限
- 希望您已经创建了一个服务主体a service principal
使用多租户身份验证(如果是单租户,请更改
多租户的身份验证方法),添加重定向 uri
https://www.microsoft.com
.
创建服务主体后,您可以在私人浏览器中打开以下 url 以将其添加到另一个租户:
https://login.microsoftonline.com/<Tenant B ID>/oauth2/authorize?client_id=<Application (client in tenant A)
ID>&response_type=code&redirect_uri=https%3A%2F%2Fwww.microsoft.com%2F
它会代表组织请求授权,你可以
接受它。
完成以上操作后,即可登录该租户的门户
然后转到企业应用程序,您会看到,提供角色
该订阅的分配 (owner/contributor)。
- 完成后你可以使用类似下面的地形
脚本:
provider "azurerm" {
alias = "tenantA"
subscription_id = "b83c1ed3-xxxxx-xxxxxx-xxxxxx-xxxxxx" #subid for tenant A
tenant_id = "72f988bf-xxxxxx-xxxxx-xxxxxxx-xxxxxx"#tenantid of tenant A
client_id = "f6a2f33d-xxxx-xxxx-xxxxx-xxxxxxxx"#client id of service principal in tenant A
client_secret = "y5L7Q~oiMOoGCxm7fK~xxxxxxxxxxxxxxx"#client secret of service principal in tenant A
auxiliary_tenant_ids = ["ab078f81-xxxxxx-xxxxxxxx-xxxxxx"]# tenant id of tenant B
features {}
}
provider "azurerm"{
alias = "tenantB"
subscription_id = "88073b30-xxx-xxxxx-xxxxx-xxxxxxx"#sub id of tenant B
tenant_id = "ab078f81-xxxxx-xxxxxxx-xxxxxxxxx" # tenant id of tenant B
client_id = "f6a2f33d-xxxx-xxxxxx-xxxxxx-xxxxxx" #client id of service principal in tenant A
client_secret = "y5L7Q~oiMOoGCxm7fK~xxxxxxxxxxxxxxxx" #client secret of service principal in tenant A
auxiliary_tenant_ids = ["72f988bf-xxxx-xxxxx-xxxxxxxxxx-xx"] # tenant id of tenant A
features {}
}
data "azurerm_resource_group" "tenantARG"{
provider = azurerm.tenantA
name = "reswourcegroup"
}
data "azurerm_resource_group" "tenantBRG"{
provider = azurerm.tenantB
name = "ansuman-resourcegroup"
}
data "azurerm_virtual_network" "GlobalVnet"{
provider = azurerm.tenantA
name = "ansuman-vnet"
resource_group_name= data.azurerm_resource_group.tenantARG.name
}
data "azurerm_virtual_network" "tenantBVnet"{
provider = azurerm.tenantB
name = "test-vnet"
resource_group_name= data.azurerm_resource_group.tenantBRG.name
}
resource "azurerm_virtual_network_peering" "example-1" {
provider= azurerm.tenantA
name = "peer1to2"
resource_group_name = data.azurerm_resource_group.tenantARG.name
virtual_network_name = data.azurerm_virtual_network.GlobalVnet.name
remote_virtual_network_id = data.azurerm_virtual_network.tenantBVnet.id
}
resource "azurerm_virtual_network_peering" "example-2" {
provider = azurerm.tenantB
name = "peer2to1"
resource_group_name = data.azurerm_resource_group.tenantBRG.name
virtual_network_name = data.azurerm_virtual_network.tenantBVnet.name
remote_virtual_network_id = data.azurerm_virtual_network.GlobalVnet.id
}
输出:
注意:在我的测试用例中,我使用了不同租户中存在的 2 个 vnet。我在租户 A 中创建了一个服务主体,并使用上述方法在租户 B 中为其提供了贡献者权限,然后使用 terraform 执行 vnet 对等互连。
我们通过 Jenkins 在我们的 Azure 租户中部署资源,它使用 terraform 来配置基础资源。
并且我们使用服务主体进行同一租户中的身份验证和基础设施配置。在我们的基础设施部署中,我们还创建了 VNET 与已部署的新 Vnet 和我们的中央 VNET 对等,它拥有所有基础设施资源,如监控和日志记录平台。
现在我们有一个用例,通过使用相同的 Jenkins 和 terraform 脚本,我们希望在不同的租户上配置资源。这可以通过使用远程租户的服务主体来完成。
但现在的问题是 TenantB
的服务主体无权在 TenantA
中创建网络资源。要做到这一点,TenantB
的服务主体应该可以访问 TenantA
中的 Vnet。
我正在寻找文档或指南,我们如何在 TenantA
?
TenantB
服务主体的访问权限
- 希望您已经创建了一个服务主体a service principal
使用多租户身份验证(如果是单租户,请更改
多租户的身份验证方法),添加重定向 uri
https://www.microsoft.com
.
创建服务主体后,您可以在私人浏览器中打开以下 url 以将其添加到另一个租户:
https://login.microsoftonline.com/<Tenant B ID>/oauth2/authorize?client_id=<Application (client in tenant A) ID>&response_type=code&redirect_uri=https%3A%2F%2Fwww.microsoft.com%2F
它会代表组织请求授权,你可以 接受它。
完成以上操作后,即可登录该租户的门户 然后转到企业应用程序,您会看到,提供角色 该订阅的分配 (owner/contributor)。
- 完成后你可以使用类似下面的地形 脚本:
provider "azurerm" {
alias = "tenantA"
subscription_id = "b83c1ed3-xxxxx-xxxxxx-xxxxxx-xxxxxx" #subid for tenant A
tenant_id = "72f988bf-xxxxxx-xxxxx-xxxxxxx-xxxxxx"#tenantid of tenant A
client_id = "f6a2f33d-xxxx-xxxx-xxxxx-xxxxxxxx"#client id of service principal in tenant A
client_secret = "y5L7Q~oiMOoGCxm7fK~xxxxxxxxxxxxxxx"#client secret of service principal in tenant A
auxiliary_tenant_ids = ["ab078f81-xxxxxx-xxxxxxxx-xxxxxx"]# tenant id of tenant B
features {}
}
provider "azurerm"{
alias = "tenantB"
subscription_id = "88073b30-xxx-xxxxx-xxxxx-xxxxxxx"#sub id of tenant B
tenant_id = "ab078f81-xxxxx-xxxxxxx-xxxxxxxxx" # tenant id of tenant B
client_id = "f6a2f33d-xxxx-xxxxxx-xxxxxx-xxxxxx" #client id of service principal in tenant A
client_secret = "y5L7Q~oiMOoGCxm7fK~xxxxxxxxxxxxxxxx" #client secret of service principal in tenant A
auxiliary_tenant_ids = ["72f988bf-xxxx-xxxxx-xxxxxxxxxx-xx"] # tenant id of tenant A
features {}
}
data "azurerm_resource_group" "tenantARG"{
provider = azurerm.tenantA
name = "reswourcegroup"
}
data "azurerm_resource_group" "tenantBRG"{
provider = azurerm.tenantB
name = "ansuman-resourcegroup"
}
data "azurerm_virtual_network" "GlobalVnet"{
provider = azurerm.tenantA
name = "ansuman-vnet"
resource_group_name= data.azurerm_resource_group.tenantARG.name
}
data "azurerm_virtual_network" "tenantBVnet"{
provider = azurerm.tenantB
name = "test-vnet"
resource_group_name= data.azurerm_resource_group.tenantBRG.name
}
resource "azurerm_virtual_network_peering" "example-1" {
provider= azurerm.tenantA
name = "peer1to2"
resource_group_name = data.azurerm_resource_group.tenantARG.name
virtual_network_name = data.azurerm_virtual_network.GlobalVnet.name
remote_virtual_network_id = data.azurerm_virtual_network.tenantBVnet.id
}
resource "azurerm_virtual_network_peering" "example-2" {
provider = azurerm.tenantB
name = "peer2to1"
resource_group_name = data.azurerm_resource_group.tenantBRG.name
virtual_network_name = data.azurerm_virtual_network.tenantBVnet.name
remote_virtual_network_id = data.azurerm_virtual_network.GlobalVnet.id
}
输出:
注意:在我的测试用例中,我使用了不同租户中存在的 2 个 vnet。我在租户 A 中创建了一个服务主体,并使用上述方法在租户 B 中为其提供了贡献者权限,然后使用 terraform 执行 vnet 对等互连。