Copa:无需重建镜像,一键热修复容器安全漏洞

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

a711c6792757dbe094ed8aae04faf3b7.png


copa 是一个使用 Go 编写的 CLI 工具,基于 buildkit,可以根据像 Trivy 这样的流行工具的漏洞扫描结果直接修补容器镜像。

为什么?

我们需要能够快速修补容器,而无需上游进行完整重建。随着漏洞披露和主动利用之间的时间窗口不断缩小,迫切需要修补容器镜像中的关键安全漏洞,以便能够快速重新部署到生产环境中。特别是当这些漏洞是

  • • 从基础镜像继承而来,有多个层级,并且不能通过更新版本在供应链中传播的方式来解决

  • • 存在于你不维护的第三方应用镜像中,其更新频率无法满足你的安全服务级别协议。

ce4c2d0ec81f2765274ff657fe082abe.png
copa 流程

除了填补左移安全实践和工具未满足的运营空白之外,copa 能够在不需要重建容器镜像的情况下修补容器的能力还提供了其他好处

  • • 允许除镜像发布者外的用户也能够修补容器镜像,比如 DevSecOps 工程师。

  • • 通过仅创建额外的修补层而不是重建整个镜像来减少重新分发修补后镜像的存储和传输成本,重建整个镜像通常导致不同的层哈希值,破坏了层缓存。

  • • 通过无需等待基础镜像更新并且比完整镜像重建操作更快的方式,减少修补容器镜像的时间。

  • • 通过从运行重建流水线到运行镜像上的单个工具来减少修补镜像的复杂性。

如何实现?

copa 工具是一个可扩展的引擎,具有以下功能:

  1. 1. 从像 Trivy 这样的扫描器生成的容器镜像漏洞报告中解析所需的更新包。可以编写新的适配器以支持更多报告格式。

  2. 2. 使用适当的软件包管理工具(如 apt、apk 等)获取和处理所需的更新包。可以编写新的适配器以支持更多软件包管理器。

  3. 3. 使用 buildkit 将生成的更新二进制文件应用于容器镜像

81d26f1df77a87d8b52360d54f80b526.png
copa 实现

这种方法的动机是基于以下核心原则,使直接容器修补具有广泛适用性和可访问性

  • • Copa 支持修补现有的容器镜像

    • • 开发人员不需要使用特定工具构建镜像或以某种方式修改它们以支持容器修补。

  • • Copa 与现有的漏洞扫描和缓解生态系统配合工作

    • • 镜像发布者不需要为容器修补创建新的工作流程,因为 Copa 支持使用已经发布的安全更新包修补容器镜像。

    • • 消费者不需要迁移到新的、可能更受限制的支持生态系统来处理自定义发行版,也不需要更改其容器漏洞扫描流程以包含修复措施,因为 Copa 可以无缝集成为额外的步骤,根据这些扫描报告来修补容器。

  • • Copa 减少了修补镜像所需的技术专长和等待依赖项

    • • 对于操作系统软件包的漏洞,不需要对特定镜像有专门的知识来修补它,因为 Copa 依赖于今天流行的容器扫描工具生成的报告中已嵌入的漏洞修复知识。

安装

Homebrew

在 macOS 和 Linux 上,可以通过Homebrew工具[2]安装copa

brew install copa

GitHub

你可以从Copa GitHub 仓库[3]下载最新版本和早期版本copa

以下说明适用于Ubuntu 22.04,其依赖版本是我们用于构建和测试的开发容器环境的一部分。对于其他发行版和操作系统,请参阅每个组件的相应安装说明。

git clone https://github.com/project-copacetic/copacetic
cd copacetic
make
# OPTIONAL: install copa to a pathed folder
sudo mv dist/linux_amd64/release/copa /usr/local/bin/

快速开始

此示例说明了如何使用漏洞报告和copa来修补容器。

先决条件

  • • copa工具已安装。

  • • buildkit[4]守护进程已安装。

  • • docker[5]守护进程正在运行,CLI 已安装。

  • • trivy CLI[6]已安装并。

示例

  1. 1. 下载目标容器进行扫描和打补丁:

docker pull mcr.microsoft.com/oss/nginx/nginx:1.21.6
  1. 1. 扫描容器镜像中是否存在可修补的操作系统漏洞,并将结果输出到 JSON 文件:

trivy image --vuln-type os --ignore-unfixed -f json -o nginx.1.21.6.json mcr.microsoft.com/oss/nginx/nginx:1.21.6

你还可以在 shell 上以表格形式查看现有的可修补漏洞:

trivy image --vuln-type os --ignore-unfixed mcr.microsoft.com/oss/nginx/nginx:1.21.6
  1. 1. 要修补镜像,请使用 Trivy 报告并指定要连接到的 buildkit 实例:默认情况下,copa 将尝试按顺序自动连接到实例:如果实例不存在或该实例不支持 copa 所需的所有功能,则将尝试下一个实例。你可能需要使用--addr标志指定自定义地址。以下是支持的格式:

    Buildkit 连接示例

    示例:使用默认值连接:

  • • unix:///path/to/buildkit.sock- 通过 unix 套接字连接到 buildkit。

  • • tcp://$BUILDKIT_ADDR:$PORT- 通过 TCP 连接到 buildkit。(出于安全原因不推荐)

  • • docker://<docker connection spec>- 连接到 docker,目前仅支持 unix 套接字,例如docker://unix:///var/run/docker.sock(或仅支持docker://)。

  • • docker-container://my-buildkit-container- 连接到在 docker 容器中运行的 buildkitd。

  • • buildx://my-builder- 连接到 buildx 构建器(或buildx://当前选择的构建器)。注意:当前仅支持容器支持的 buildx 实例

  • • nerdctl-container://my-container-name- 类似于docker-container但使用nerdctl

  • • podman-container://my-container-name- 类似于docker-container但使用podman

  • • ssh://myhost- 通过 SSH 连接到 buildkit 实例。主机规范的格式应模仿 SSH 命令。

  • • kubepod://mypod- 连接到在 Kubernetes Pod 中运行的 buildkit。还可以指定 kubectl 上下文和 pod 命名空间 ( kubepod://mypod?context=foo&namespace=notdefault)。

  1. 1. 默认 docker buildkit 端点(至少需要 docker v24.0 且启用了containerd snapshotter[7]支持)

  2. 2. 当前选择的 buildx 构建器(参见docker buildx --help:)

  3. 3. 默认地址的 buildkit 守护进程/run/buildkit/buildkitd.sock

copa patch -i mcr.microsoft.com/oss/nginx/nginx:1.21.6 -r nginx.1.21.6.json -t 1.21.6-patched

示例:连接到 buildx

docker buildx create --name demo
copa patch -i mcr.microsoft.com/oss/nginx/nginx:1.21.6 -r nginx.1.21.6.json -t 1.21.6-patched --addr buildx://demo

示例:容器中的 Buildkit

export BUILDKIT_VERSION=v0.12.0
docker run \
    --detach \
    --rm \
    --privileged \
    --name buildkitd \
    --entrypoint buildkitd \
    "moby/buildkit:$BUILDKIT_VERSION"

copa patch -i mcr.microsoft.com/oss/nginx/nginx:1.21.6 -r nginx.1.21.6.json -t 1.21.6-patched --addr docker-container://buildkitd

示例:基于 TCP 的 Buildkit

export BUILDKIT_VERSION=v0.12.0
export BUILDKIT_PORT=8888
 docker run \
     --detach \
     --rm \
     --privileged \
     -p 127.0.0.1:$BUILDKIT_PORT:$BUILDKIT_PORT/tcp \
     --name buildkitd \
     --entrypoint buildkitd \
     "moby/buildkit:$BUILDKIT_VERSION" \
     --addr tcp://0.0.0.0:$BUILDKIT_PORT
 copa patch \
     -i mcr.microsoft.com/oss/nginx/nginx:1.21.6 \
     -r nginx.1.21.6.json \
     -t 1.21.6-patched \
     -a tcp://0.0.0.0:$BUILDKIT_PORT

无论哪种情况,copa都是非破坏性的,并将标签为1.21.6-patched的新镜像导出到本地。

注意:如果你针对私有镜像仓库中的镜像运行此示例,请确保在运行之前在默认 Docker的config.json 中配置了凭据,例如通过sudo docker login -u <user> -p <password> <registry>

  1. 1. 扫描修补后的镜像并验证漏洞是否已被修补:

trivy image --vuln-type os --ignore-unfixed mcr.microsoft.com/oss/nginx/nginx:1.21.6-patched

你还可以检查修补镜像的结构,以docker history查看附加到镜像的新修补层:

docker history mcr.microsoft.com/oss/nginx/nginx:1.21.6-patched
   IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
   a372df41e06d   1 minute ago   mount / from exec sh -c apt install --no-ins…   26.1MB    buildkit.exporter.image.v0
   <missing>      3 months ago   CMD ["nginx" "-g" "daemon off;"]                0B        buildkit.dockerfile.v0
   <missing>      3 months ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0
   <missing>      3 months ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
   <missing>      3 months ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B        buildkit.dockerfile.v0
   <missing>      3 months ago   COPY 30-tune-worker-processes.sh /docker-ent…   4.61kB    buildkit.dockerfile.v0
   <missing>      3 months ago   COPY 20-envsubst-on-templates.sh /docker-ent…   1.04kB    buildkit.dockerfile.v0
   <missing>      3 months ago   COPY 10-listen-on-ipv6-by-default.sh /docker…   1.96kB    buildkit.dockerfile.v0
   <missing>      3 months ago   COPY docker-entrypoint.sh / # buildkit          1.2kB     buildkit.dockerfile.v0
   <missing>      3 months ago   RUN /bin/sh -c set -x     && addgroup --syst…   61.1MB    buildkit.dockerfile.v0
   <missing>      3 months ago   ENV PKG_RELEASE=1~bullseye                      0B        buildkit.dockerfile.v0
   <missing>      3 months ago   ENV NJS_VERSION=0.7.0                           0B        buildkit.dockerfile.v0
   <missing>      3 months ago   ENV NGINX_VERSION=1.20.2                        0B        buildkit.dockerfile.v0
   <missing>      3 months ago   LABEL maintainer=NGINX Docker Maintainers <d…   0B        buildkit.dockerfile.v0
   <missing>      4 months ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
   <missing>      4 months ago   /bin/sh -c #(nop) ADD file:09675d11695f65c55…   80.4MB
  1. 1. 运行容器以验证镜像没有回退:

docker run -it --rm --name nginx-test 
   
   mcr.microsoft.com/oss/nginx/nginx:1.21.6-patched
   /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
   /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
   /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
   10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
   10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
   /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
   /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
   /docker-entrypoint.sh: Configuration complete; ready for start up
   2022/05/16 18:00:17 [notice] 1#1: using the "epoll" event method
   2022/05/16 18:00:17 [notice] 1#1: nginx/1.20.2
   2022/05/16 18:00:17 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
   2022/05/16 18:00:17 [notice] 1#1: OS: Linux 5.10.102.1-microsoft-standard-WSL2
   2022/05/16 18:00:17 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
   2022/05/16 18:00:17 [notice] 1#1: start worker processes
   2022/05/16 18:00:17 [notice] 1#1: start worker process 31
   2022/05/16 18:00:17 [notice] 1#1: start worker process 32
   2022/05/16 18:00:17 [notice] 1#1: start worker process 33
   2022/05/16 18:00:17 [notice] 1#1: start worker process 34
   2022/05/16 18:00:17 [notice] 1#1: start worker process 35
   2022/05/16 18:00:17 [notice] 1#1: start worker process 36
   2022/05/16 18:00:17 [notice] 1#1: start worker process 37
   2022/05/16 18:00:17 [notice] 1#1: start worker process 38
   2022/05/16 18:00:17 [notice] 38#38: signal 28 (SIGWINCH) received
   2022/05/16 18:00:17 [notice] 36#36: signal 28 (SIGWINCH) received
   2022/05/16 18:00:17 [notice] 33#33: signal 28 (SIGWINCH) received
   2022/05/16 18:00:17 [notice] 32#32: signal 28 (SIGWINCH) received
   2022/05/16 18:00:17 [notice] 34#34: signal 28 (SIGWINCH) received
   2022/05/16 18:00:17 [notice] 35#35: signal 28 (SIGWINCH) received
   2022/05/16 18:00:17 [notice] 37#37: signal 28 (SIGWINCH) received
   2022/05/16 18:00:17 [notice] 1#1: signal 28 (SIGWINCH) received
   2022/05/16 18:00:17 [notice] 31#31: signal 28 (SIGWINCH) received

你可以通过打开一个新的 shell 实例并运行以下命令来停止容器:docker stop nginx-test

参考资料

引用链接

[1] Copa 设计: https://project-copacetic.github.io/copacetic/website/design
[2] Homebrew工具: https://brew.sh/
[3] Copa GitHub 仓库: https://github.com/project-copacetic/copacetic/releases
[4] buildkit: https://github.com/moby/buildkit/#quick-start
[5] docker: https://docs.docker.com/desktop/linux/install/#generic-installation-steps
[6] trivy CLI: https://aquasecurity.github.io/trivy/latest/getting-started/installation/
[7] containerd snapshotter: https://docs.docker.com/storage/containerd/#enable-containerd-image-store-on-docker-engine

本文转载自:「云原生百宝箱」,原文:https://url.hi-linux.com/mGUwC,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

167cbc39e550c2c17c1be0cfad55ec0d.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

b77056d993530925854372bf799f8c08.png

你可能还喜欢

点击下方图片即可阅读

e7c1e16754515385f424c8cf09119e88.png

如何使用 GitLab CI/CD 快速实现自动化构建与发布

b29886b248d546d5e2a96d74908adeaf.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

6396651af7bec995f51284ec738b7de0.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
健身国际俱乐部系统是一种专为健身俱乐部设计的管理软件,它通过集成多种功能来提高俱乐部的运营效率和服务质量。这类系统通常包含以下几个核心模块: 1. **会员管理**:系统能够记录会员的基本信息、会籍状态、健身历史和偏好,以及会员卡的使用情况。通过会员管理,俱乐部可以更好地了解会员需求,提供个性化服务,并提高会员满意度和忠诚度。 2. **课程预约**:会员可以通过系统预约健身课程,系统会提供课程时间、教练、地点等详细信息,并允许会员根据个人时间表进行预约。这有助于俱乐部合理安排课程,避免资源浪费。 3. **教练管理**:系统可以管理教练的个人信息、课程安排、会员反馈等,帮助俱乐部评估教练表现,优化教练团队。 4. **财务管理**:包括会员卡销售、课程费用、私教费用等财务活动的记录和管理,确保俱乐部的财务透明度和准确性。 5. **库存管理**:对于俱乐部内的商品销售,如健身装备、营养补充品等,系统能够进行库存管理,包括进货、销售、库存盘点等。 6. **数据分析**:系统能够收集和分析会员活动数据,为俱乐部提供业务洞察,帮助俱乐部制定更有效的营销策略和业务决策。 7. **在线互动**:一些系统还提供在线平台,让会员可以查看课程、预约私教、参与社区讨论等,增强会员之间的互动和俱乐部的社区感。 8. **移动应用**:随着移动设备的普及,一些健身俱乐部系统还提供移动应用,方便会员随时随地管理自己的健身计划。 9. **安全性**:系统会确保所有会员信息的安全,采取适当的数据加密和安全措施,保护会员隐私。 10. **可扩展性**:随着俱乐部业务的扩展,系统应该能够轻松添加新的功能和服务,以适应不断变化的市场需求。 健身国际俱乐部系统的选择和实施,需要考虑俱乐部的具体需求、预算和技术能力,以确保系统能够有效地支持俱乐部的运营和发展。通过这些系统的实施,健身俱乐部能够提供更加专业和高效的服务,吸引和保留更多的会员,从而在竞争激烈的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值