0

我们通过 Jenkins 在我们的 Azure 租户中部署资源,Jenkins 使用 terraform 来提供基础设施资源。我们使用同一租户中的服务主体进行身份验证和基础设施配置。在我们的基础设施部署中,我们还创建了与部署的新 Vnet 和我们的中央 VNET 对等的 VNET,它拥有所有基础设施资源,如监控和日志记录平台。现在我们有一个用例,通过使用相同的 Jenkins 和 terraform 脚本,我们希望在不同的租户上配置资源。这可以通过使用远程租户的服务主体来完成。但现在的问题是服务主体TenantB无权在TenantA. 要做到这一点,服务主体TenantB应该可以在 Vnet 上访问TenantA. 我正在寻找文档或指导,我们如何才能访问我们的服务TenantB主体TenantA

4

1 回答 1

2
  • 希望您已经创建了一个服务主体,一个使用多租户身份验证的服务主体(如果是单租户,请将身份验证方法更改为多租户),添加一个重定向 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
    

    它将代表组织请求授权,您可以接受。

  • 完成上述操作后,您可以登录该租户的门户并转到企业应用程序,您将看到,为该订阅(所有者/贡献者)提供角色分配。

在此处输入图像描述

在此处输入图像描述

  • 完成此操作后,您可以使用类似于以下 terraform 脚本的内容:
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 对等互连。

于 2021-09-27T10:26:15.600 回答