Copa:无需重建镜像,直接修补容器漏洞

news2024/9/20 9:38:16

关注【云原生百宝箱】公众号,与你一起探讨应用迁移,GitOps,二次开发,解决方案,CNCF生态。

图片

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

为什么?

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

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

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

图片

copa 流程

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

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

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

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

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

如何实现?

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

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

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

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

图片

copa 实现

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

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

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

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

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

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

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

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

云原生百宝箱

行万里路,此处相逢,共话云原生之道。 偶逗趣事,明月清风,与君同坐。

30篇原创内容

公众号

有关更多详细信息,请参阅Copa 设计[1]文档。

安装

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1080938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode-343-整数拆分

题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 题目链接&#xff1a; LeetCode-343-整数拆分 解题思路&#xff1a; 还是根据动规五…

Centos (含Rocky-Linux) VSFTPD 简单设置

本文并非深入讨论vsftp配置的文章&#xff0c;仅以能连通为目的&#xff0c;适合那些临时需要上传点东西到服务器的场景。 一、安装 dnf -y updatednf -y install vsftpdsystemctl start vsftpdsystemctl enable vsftpd二、防火墙 开放21端口&#xff1a; firewall-cmd --zo…

利用正则表达式进行数据采集和处理

目录 一、正则表达式的概述 二、正则表达式在数据采集中的运用 1、匹配和提取数据 2、数据清洗 3、数据验证 三、Python中的re模块介绍 1、re.match()方法 2、re.search()方法 总结 正则表达式是一种强大的文本处理工具&#xff0c;它可以用于模式匹配、提取、替换等操…

Android 自定义横向时间轴

示例&#xff1a; 一、添加依赖 dependencies {******//添加RecyclerView的依赖包implementation androidx.recyclerview:recyclerview:1.2.1 } 二、页面代码 activity_main.xml: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmln…

大语言模型迎来重大突破!找到解释神经网络行为方法

前不久&#xff0c;获得亚马逊40亿美元投资的ChatGPT主要竞争对手Anthropic在官网公布了一篇名为《朝向单义性&#xff1a;通过词典学习分解语言模型》的论文&#xff0c;公布了解释经网络行为的方法。 由于神经网络是基于海量数据训练而成&#xff0c;其开发的AI模型可以生成…

Virtual Box + Vagrant 快速搭建 Linux 虚拟开发环境

Virtual Box Vagrant 快速搭建 Linux 虚拟开发环境 1、根据自己所使用的操作系统平台&#xff0c;选择下载对应的虚拟机客户端软件 Virtual Box 并进行安装&#xff0c;这里选择的是 Virtual Box 7.0.10 Windows hosts 平台安装包。 选择安装目录为其他盘&#xff0c;避免默认…

【C++】STL总结:理解六大核心组件、各个组件主要功能

文章目录 六大核心组件的关联性1.容器2.迭代器3.算法4. 仿函数 / 函数对象5. 适配器 / 包装器6. 空间配置器 六大核心组件的关联性 1.容器 &#x1f517;&#x1f449;点击跳转 2.迭代器 &#x1f517;&#x1f449;点击跳转 3.算法 &#x1f517;&#x1f449;点击跳转 …

安科瑞消防设备电源监控系统在城市建筑中的应用

安科瑞 崔丽洁 摘要&#xff1a;2021年十四五规划里&#xff0c;也都有写到关于绿色循环经济的议题。在这样一个背景下&#xff0c;建筑行业也需要为实现“双碳”目标作出改变&#xff0c;建筑行业飞速发展&#xff0c;大量高层建筑拔地而起&#xff0c;在为了响应国家对于建筑…

生态共建 | 7-9月,YashanDB与13款产品完成兼容互认证

7-9月&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与柏科数据技术&#xff08;深圳&#xff09;股份有限公司、深圳钛铂数据有限公司、华润数字科技有限公司、武汉中地数码科技有限公司、龙芯中科技术股份有限公司、华瑞指数云科技&#xff08;深圳&#xff09;有限公…

LeetCode-199-二叉树的右视图

题目描述&#xff1a; 题目链接&#xff1a;LeetCode-199-二叉树的右视图 解题思路&#xff1a; 在 102 的基础之上进行改进&#xff0c;一维数组每次只保存 size1 时候的值 代码实现&#xff1a; class Solution {public List<Integer> rightSideView(TreeNode root) {i…

【算法-动态规划】斐波那契第 n 项

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

网络初识(JAVA EE)

文章目录 一、网络发展史二、网络通信基础三、协议分层四、封装和分用 一、网络发展史 独立模式&#xff1a;计算机之间相互独立&#xff0c;每个终端都各自持有客户数据&#xff0c;且当处理一个业务时&#xff0c;按照业务流程进行 网络互连&#xff1a;将多台计算机连接在一…

ELK集群 日志中心集群、kafka、logstash

ES&#xff1a;用来日志存储 Logstash:用来日志的搜集&#xff0c;进行日志格式转换并且传送给别人&#xff08;转发&#xff09; Kibana:主要用于日志的展示和分析 kafka Filebeat:搜集文件数据 es-1 本地解析 vi /etc/hosts scp /etc/hosts es-2:/etc/hosts scp /etc…

Maven Web应用

目录 创建 Web 应用 构建 Web 应用 部署 Web 应用 测试 Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目&#xff0c;如何创建、构建、部署以及运行一个 web 应用。 创建 Web 应用 我们可以使用 maven-archetype-webapp 插件来创建一个简…

景区经营系统如何落地运营?景区系统重点功能推荐

在数字经济的引领下&#xff0c;文旅行业也迎来数字化转型的浪潮&#xff0c;需要借助数字化工具完成一整套景区经营管理落地方案。如蚓链数字化文旅系统拥有多端开发能力&#xff0c;可实现PC端、移动端、小程序等多端开发&#xff0c;让游客可随时随地畅游景区&#xff0c;提…

“互联网+”时代,3D全景营销打造千人千面营销点

现如今&#xff0c;元宇宙产业正在加速演化&#xff0c;传统的营销方式已经渐显疲态&#xff0c;3D全景营销的沉浸式体验为众多企业品牌打开新的营销领域。“互联网”时代&#xff0c;一些简单的图片、宣传单已经不能满足商家的宣传需求了&#xff0c;很难对客户产生吸引力&…

服务器编程基本框架

服务器编程基本框架 虽然服务器程序种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理。 I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作&#xff1a;等待并接受新的客户连接&#xff0c;接收客户数据&#xff0c;将服务器响应数据返回…

【广州华锐互动】钢厂铸锻部VR沉浸式实训系统

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已成为当今最具潜力的技术之一。在钢铁行业中&#xff0c;VR虚拟仿真实训已经被广泛应用于培训和教育领域&#xff0c;特别是钢铁厂铸锻部&#xff0c;通过VR技术&#xff0c;可以大大提高培训效率&#xff0c;降低培训成本&…

alsa音频pcm设备之i2c调试

i2cdetect 列举 I2C bus i2cdetect -l ls /dev/i2c* 列出I2C bus i2c-7 上面连接的所有设备,并得到i2c设备地址 i2cdetect -y 7 发现i2c设备的位置显示为UU或表示设备地址的数值,UU表示设备在driver中被使用. I2cdump i2c设备大量register的值 i2cdump -y 7 0x40 I2cset设置…

AI游戏设计的半年度复盘;大模型+智能音箱再起波澜;昇思大模型技术公开课第2期;出海注册经验分享;如何使用LoRA微调Llama 2 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 进步or毁灭&#xff1a;Nature 调研显示 1600 科学家对AI的割裂态度 国际顶级期刊 Nature 最近一项调研很有意思&#xff0c;全球 160…