Compartilhar via

在 Azure Container Registry 中配置持续修补

本文介绍如何安装、启用和配置连续修补。 启用连续修补功能后,容器注册表将自动检测和修复容器映像的操作系统级别漏洞。

先决条件

  • 可以使用最低版本为 2.15.0 或更高版本的Azure CLI的本地安装。

  • 已有一个具有Azure Container Registry(ACR)的现有资源组。

  • 您拥有一个启用了 ACR 任务的 Azure 容器注册表(ACR 的免费层不支持 ACR 任务)。

运行以下命令以安装 CLI 扩展:

    az extension add -n acrcssc

启用连续修补工作流

  1. 使用 az login 登录到Azure CLI。

    az cloud set -n AzureChinaCloud
    az login
    # az cloud set -n AzureCloud   //means return to Public Azure.
    
  2. 登录到 ACR。

    az acr login -n <myRegistry>
    
  3. 运行以下命令以创建名为continuouspatching.json的文件。

    cat <<EOF > continuouspatching.json
    {
        "version": "v1",
        "tag-convention" : "<incremental|floating>",
        "repositories": [{
            "repository": "<Repository Name>",
            "tags": ["<comma-separated-tags>"],   
            "enabled": <true|false>
        }] 
    }
    EOF
    

    架构以数组格式引入特定存储库和标记。 此处定义了每个变量:

    • version 允许 ACR 团队跟踪你正在使用的架构版本。 除非指示不要更改此变量。

    • tag-convention 是可选字段。 允许的值是“增量”或“浮动”-请参阅 连续修补的关键概念 ,了解详细信息。

    • repositories 是一个数组,其中包含详细的存储库和标记信息:

      • repository 引用存储库名称
      • tags 是用逗号分隔的标记数组。 通配符 * 可用于表示该存储库中的所有标记。
      • enabled 是一个布尔值,该值为 true 或 false,用于确定是否启用指定的存储库。

    下面的示例展示了客户配置,该客户希望修补存储库python中的所有标记(使用 * 符号),并专门修补存储库jammy-20240111中的jammy-20240125ubuntu标记。

    {
    "version": "v1",
    "tag-convention" : "incremental",
    "repositories": [{
            "repository": "python",
            "tags": ["*"],
            "enabled": true
        },
        {
            "repository": "ubuntu",
            "tags": ["jammy-20240111", "jammy-20240125"],
         "enabled": true, 
        }]
    }
    
  4. 创建配置文件后,执行试运行以验证是否按 JSON 条件选择了预期项目。 干运行需要一个名为schedule的参数,该参数指定您的连续修补周期的运行频率。 计划标志以天为单位,最小值为 1 天,最大值为 30 天。 例如,如果希望每天修补映像,则可以将计划指定为 1d或 1 天。 如果你希望每周修补(每周一次),则应该将计划填写为 7d,即 7 天。

    az acr supply-chain workflow create -r myRegistry -g myResourceGroup -t continuouspatchv1 --config ./continuouspatching.json --schedule 1d --dry-run   
    

    --dry-run 标志通过 JSON 文件配置输出所有指定项目。 验证是否选择了正确的工件。 使用示例 ubuntu 配置时,应将以下结果显示为输出:

    Ubuntu: jammy-20240111
    Ubuntu: jammy-20240125
    
  5. 对试运行结果感到满意后,请再次运行 create 命令,无需 --dry-run 标记即可创建连续修补工作流。

    注释

    参数 --schedule 遵循从月份的第 1 天开始的固定日乘数。 这意味着:

    • 如果你在 3 号指定并运行 --schedule 7d,则下次计划运行的时间将是 7 号,因为 7 是从本月 1 号开始数起,3 号之后的第一个 7 的倍数。
    • 如果 --schedule 为 3d,而今天是 7 号,那么下一次计划的运行将在 9 号进行,因为 9 是继 7 后的下一个 3 的倍数。
    • 如果添加标志 --run-immediately,则触发即时修补程序运行。 后续的计划运行时间仍将根据你的 --schedule 值,从每月的第 1 天起,按最接近的日期倍数来对齐。
    • 计划计数器每月重置。 无论指定的计划如何,工作流都将在每月的第一个时间运行,然后按照指定的计划值运行本月剩余时间。 如果我的修补程序在1月28日运行,并且我的周期是7天,那么下一个修补程序将在2月1日运行,然后是2月8日,接着每隔7天继续运行。
    az acr supply-chain workflow create -r myRegistry -g myResourceGroup -t continuouspatchv1 --config ./continuouspatching.json --schedule 1d --run-immediately
    

    一旦命令成功(无论是否包含 --run-immediately),你会看到一条成功消息,确认你的工作流任务已被加入队列。 您还会看到一个输出参数,指示工作流下次运行的时间,以便可以准确跟踪下次修补的具体时间。

使用Azure门户查看工作流任务

  1. 工作流成功后,转到Azure门户查看正在运行的任务。 在服务菜单中的 “服务”下,选择“ 存储库”。 你应该会看到一个名为csscpolicies/patchpolicy的新存储库。 此存储库托管了一个 JSON 配置项目,该项目被持续引用以进行持续修补。

  2. 接下来,在 “服务”下,选择“ 任务”。 应会看到三个新任务:

    • cssc-trigger-workflow - 这个任务扫描配置文件并调用每个相应镜像上的扫描任务。
    • cssc-scan-image - 此任务扫描映像中是否存在作系统漏洞。 仅当找到作系统漏洞时,此任务才会触发修补任务。
    • cssc-patch-image - 此任务会修补映像。

    这些任务协同工作来执行持续修补工作流。

  3. 若要查看特定的任务运行,请选择“ 运行”。 在此处可以查看有关任务是成功还是失败的状态信息,以及查看调试日志。

屏幕截图显示了为进行持续修补而运行的任务。

使用 CLI 查看工作流任务

还可以运行以下 CLI show 命令,查看每个任务和常规工作流的更多详细信息。 该命令输出计划、创建日期和系统数据,例如上次修改日期。

例如:

az acr supply-chain workflow show -r myRegistry -g myResourceGroup -t continuouspatchv1 

若要查看所有必需和可选标志,请使用帮助命令:

az acr supply-chain workflow show --help

更新持续的修补工作流

若要对连续修补工作流进行编辑,请使用更新命令。 可以使用更新 CLI 命令直接更新计划或 JSON 配置架构。 例如:

az acr supply-chain workflow update -r myRegistry -g myResourceGroup -t continuouspatchv1 --config ./continuouspatching.json --schedule 1d

若要更新你的计划,请使用新的计划输入运行上一个命令。 若要更新 JSON 配置,建议对文件进行更改,运行试运行,然后运行更新命令。

删除连续修补工作流

若要删除连续修补工作流,请运行以下 CLI 命令:

az acr supply-chain workflow delete -r myregistry -g myresourcegroup -t continuouspatchv1

成功删除工作流后,将自动删除存储库“csscpolicies/patchpolicy”。 运行你的工作流的三个任务以及任何当前排队的运行都将被删除。

排查持续性修补问题

审查这些提示,以解决在持续进行补丁更新时可能遇到的问题。

列出正在运行的任务

若要获取重要的调试信息,请使用以下命令列出最近执行的连续修补任务:

az acr supply-chain workflow list -r <registryname> -g <resourcegroup> [--run-status <failed || successful || running>] -t continuouspatchv1

成功的结果将返回以下信息:

  • 映像名称和标记
  • 工作流类型
  • 扫描状态
  • 上次扫描日期和时间(如果状态失败,日期将留空)
  • 扫描任务 ID (用于进一步调试)
  • 补丁状态
  • 上次修补日期和时间(如果状态失败,日期将留空)
  • 补丁图像名称 + 标签
  • 补丁任务 ID(用于进一步调试)

使用 [--run-status] 返回与指定筛选器匹配的所有任务状态。 例如,如果指定 --run-status failed,将仅列出修补失败的映像。

取消正在运行的任务

某些方案可能需要取消当前正在运行或等待运行的任务。 例如,你可能会看到想要立即修复的错误配置,而不是等待修补任务完成。

若要取消正在运行的任务,请使用以下 CLI 命令:

az acr supply-chain workflow cancel-run -r <registryname> -g <resourcegroup> --type <continuouspatchv1>

此命令将取消当前计划中所有状态为RunningQueuedStarted的连续修补任务。 例如,如果按每日计划取消任务(--schedule 1d),则这些状态中的任务将取消该天,然后再次计划第二天。 如果计划是每周,则下周再次显示已取消的任务。

查找失败的任务

使用任务列表命令输出所有失败的任务。 指定 cssc-patch 命令是应对故障的最佳选择。

例如,此命令返回前 10 个失败的修补任务:

az acr task list-runs -r <registryname> -n cssc-patch-image --run-status Failed --top 10

若要分析具体故障,请记录命令runID返回的结果,并运行:

az acr task logs -r <registryname> --run-id <run-id>

取消配置错误的工作流

使用 cancel 命令来取消正在排队的任务:

az acr supply-chain workflow cancel-run -r <registryname> -g <resourcegroup> --type <continuouspatchv1>