Azure DevOps IP 地址

5

我有一个在Web App上运行的应用程序,需要与Azure DevOps Microsoft托管代理通信。我设置了一些IP限制来拒绝所有请求,并正在将代理的IP添加到白名单中。当我阅读this page时,它引用了每周更新的json文件,其中包含了关于我所需的所有内容(每个地区的CIDR)。我已经解析了json文件,并将它们添加到我的允许列表中,但是代理的公共IP地址不在json中提到的范围内。我检查的方法是在代理上运行bash任务来执行curl icanhazip.com。有人知道这个列表是否完整,还是我需要在其他地方查找?

例如,在我的情况下:

我使用这些数据(因为我的ADO组织在西欧):

{
      "name": "AzureDevOps.WestEurope",
      "id": "AzureDevOps.WestEurope",
      "properties": {
        "changeNumber": 1,
        "region": "westeurope",
        "regionId": 18,
        "platform": "Azure",
        "systemService": "AzureDevOps",
        "addressPrefixes": [
          "40.74.28.0/23"
        ],
        "networkFeatures": null
      }
    }

但是代理从IP地址20.238.71.171发起连接,该地址不在JSON文件中提供的任何CIDR范围内(使用ADO检查了所有其他地区)。
有任何想法/帮助吗?
3个回答

13

您需要将来自Azure West Europe的所有范围列入白名单。这些是许多不同的IP范围,因为Azure DevOps托管代理没有服务标记。

由于这会向西欧的每个VM打开防火墙,通常并不真正希望这样做,因为这几乎等同于向整个世界开放您的应用程序。

因此,人们通常执行以下操作:

  1. 在构建作业中的第一个任务中,使用类似ipfy.org的工具获取执行构建代理的公共IP地址
  2. 使用AZ CLI将此IP添加为单个IP允许规则,以允许访问您的应用程序
  3. 进行部署等操作
  4. 再次删除IP规则

1
自托管的构建代理将是另一种选择。但这当然会带来更多的管理开销。 - silent
我完全按照 @silent 的描述所说的去做了。 - evgeny
@evgeny,你能告诉我你是如何在单独的答案或这个答案中完成这些步骤的吗? - Shiva kumar
@silent - 我肯定是漏掉了一些非常明显的东西。但是如果作业正在代理上运行,那么你实际上是将要白名单的IP从你尝试要白名单的IP中排除出去了吗?或者AZ CLI是否绕过了访问限制? - ayang
1
@ayang 是的,这里的区别在于控制平面(ARM)与数据平面(Web应用程序本身)。您通过控制平面设置IP限制,然后应用到数据平面。 - silent
显示剩余2条评论

1

我知道这是一个老问题,但既然我来到这里,我想分享一下我使用的代码,基于提出的解决方案。

我使用了Azure Cli az keyvault network-rule模块来添加和删除公共代理IP。

代码示例:

- task: AzureCLI@2
  displayName: "Adding Virtual Agent Public Allowed IP Firewall list of KV."
  inputs:
    scriptType: "pscore"
    scriptLocation: "inlineScript"
    azureSubscription: $( azureSubscription )
    inlineScript: |
      $agentHostPublicIp = (Invoke-WebRequest ifconfig.me/ip).Content.Trim()
      Write-Output "Public IP of agent to add: $agentHostPublicIp"
      az keyvault network-rule add --name $(vg_vault_name) --ip-address $agentHostPublicIp --no-wait --resource-group $(vg_resource_group_name)

  - task: AzureKeyVault@2
    displayName: "Download from Azure Key Vault '$(vg_vault_name)' secrets."
    inputs:
      azureSubscription:$( azureSubscription )
      KeyVaultName: $(vg_vault_name)
      SecretsFilter: "*" # string. Required. Secrets filter. Default: *.
      RunAsPreJob: false

  - task: AzureCLI@2
    displayName: "Removing Virtual Agent Public Allowed IP Firewall list of KV."
    inputs:
      scriptType: "pscore"
      scriptLocation: "inlineScript"
      azureSubscription: $( azureSubscription )
      inlineScript: |
        $agentHostPublicIp = (Invoke-WebRequest ifconfig.me/ip).Content.Trim()
        Write-Output "Public IP of agent to remove: $agentHostPublicIp"
        az keyvault network-rule remove --name $(vg_vault_name) --ip-address $agentHostPublicIp --no-wait --resource-group $(vg_resource_group_name)

作为下一步,您可以使用从保险库中提取的任何机密。
来自官方文档的示例 在 Azure 管道中使用 Azure Key Vault 机密 此解决方案假定用户正在使用 Azure 公共代理而不是托管代理。如果用户使用托管代理,则只需添加一次代理的公共 IP,无需再次删除。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接