禁止从 Azure 容器注册表导出项目

若要防止组织的注册表用户恶意或意外将项目泄漏到虚拟网络外部,可以配置注册表的导出策略以禁用导出。

导出策略是 API 版本 2021-06-01-preview 中为高级容器注册表引入的属性。 exportPolicy 属性在其状态设置为 disabled 时,会在用户尝试执行以下操作时阻止从受网络限制的注册表导出项目:

  • 将注册表的项目导入到另一个 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

禁用导出的其他要求

  • 禁用公用网络访问 - 若要禁用项目导出,还必须禁用对注册表的公共访问(注册表的 publicNetworkAccess 属性必须设置为 disabled)。 可在禁用导出前禁用对注册表的公用网络访问,也可以同时禁用。

    通过禁用对注册表的公共终结点的访问,可确保仅允许在虚拟网络中执行注册表操作。 禁止公开访问注册表以提取项目和执行其他操作。

  • 删除导出管道 - 在将注册表的 exportPolicy 状态设置为 disabled 前,删除注册表中配置的任何现有导出管道。 如果已配置管道,则无法更改 exportPolicy 状态。

为现有注册表禁用 exportPolicy

创建注册表时,exportPolicy 状态默认设置为 enabled,允许导出项目。 可以使用 ARM 模板或 az resource update 命令将状态更新为 disabled

ARM 模板

包含以下 JSON 以更新 exportPolicy 状态,并将 publicNetworkAccess 属性设置为 disabled。 详细了解如何使用 ARM 模板部署资源

{
[...]
"resources": [
    {
    "type": "Microsoft.ContainerRegistry/registries",
    "apiVersion": "2021-06-01-preview",
    "name": "myregistry",
    [...]
    "properties": {
      "publicNetworkAccess": "disabled",
      "policies": {
        "exportPolicy": {
          "status": "disabled"
         }
      }
      }
    }
]
[...]
}

Azure CLI

运行 az resource update,将现有注册表中的 exportPolicy 状态设置为 disabled。 替换注册表和资源组的名称。

如此示例中所示,禁用 exportPolicy 属性时,还应将 publicNetworkAccess 属性设置为 disabled

az resource update --resource-group myResourceGroup \
    --name myregistry \
    --resource-type "Microsoft.ContainerRegistry/registries" \
    --api-version "2021-06-01-preview" \
    --set "properties.policies.exportPolicy.status=disabled" \
    --set "properties.publicNetworkAccess=disabled"  

输出显示导出策略状态已禁用。

{
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/myregistry",
  "identity": null,
  "kind": null,
  "location": "chinaeast2",
  "managedBy": null,
  "name": "myregistry",
  "plan": null,
  "properties": {
    [...]
    "policies": {
      "exportPolicy": {
        "status": "disabled"
      },
      "quarantinePolicy": {
        "status": "disabled"
      },
      "retentionPolicy": {
        "days": 7,
        "lastUpdatedTime": "2021-07-20T23:20:30.9985256+00:00",
        "status": "disabled"
      },
      "trustPolicy": {
        "status": "disabled",
        "type": "Notary"
      },
    "privateEndpointConnections": [],
    "provisioningState": "Succeeded",
    "publicNetworkAccess": "Disabled",
    "zoneRedundancy": "Disabled"
[...]
}

启用 exportPolicy

在注册表中禁用 exportPolicy 状态之后,可以随时使用 ARM 模板或 az resource update 命令重新启用。

ARM 模板

包含以下 JSON 以将 exportPolicy 状态更新为 enabled。 详细了解如何使用 ARM 模板部署资源

{
[...]
"resources": [
    {
    "type": "Microsoft.ContainerRegistry/registries",
    "apiVersion": "2021-06-01-preview",
    "name": "myregistry",
    [...]
    "properties": {
     "policies": {
        "exportPolicy": {
          "status": "enabled"
         }
      }
      }
    }
]
[...]
}

Azure CLI

运行 az resource update,将 exportPolicy 状态设置为 enabled。 替换注册表和资源组的名称。

az resource update --resource-group myResourceGroup \
    --name myregistry \
    --resource-type "Microsoft.ContainerRegistry/registries" \
    --api-version "2021-06-01-preview" \
    --set "properties.policies.exportPolicy.status=enabled"

后续步骤