授予对另一个 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 对等互连。