当前位置: 首页 > news >正文

探索容器镜像安全管理之道

邓宇星,Rancher 中国软件架构师,7 年云原生领域经验,参与 Rancher 1.x 到 Rancher 2.x 版本迭代变化,目前负责 Rancher for openEuler(RFO)项目开发。

最近 Rancher v2.7.4 发布了,作为一个安全更新版本,也让大家对软件供应链安全多了一份思考。本文将围绕其中比较流行的容器镜像安全管理进行探讨和实践。

运行环境介绍

软件/操作系统版本
Rancherv2.7.4
Host OS: openEuler22.03-LTS-SP1
K8s: RFOv1.26.5+rfor1
cosignv2.0.2
Harborv2.8.2
Client OS: MacOS13.4
Kubewardenv1.6.0

本次实践将使用最新版 Rancher v2.7.4 作为 K8s 集群管理工具。在此之上可安装 Kubewarden UI 作为可视策略管理工具。整体运行架构以及流程如下:

arch

使用 RFO 分发版作为本次下游 K8s 集群,RFO 为 Rancher for openEuler 的简称,是一个基于 openEuler 基础镜像的 RKE2 分发版。同时我们使用 openEuler 作为本次 K8s 的 Host OS,与 RFO 适配性更佳。

RFO 介绍与 Quick Start 请点击:https://gitee.com/openeuler/community/tree/master/sig/sig-rfo

本次使用 Harbor + cosign + Kubewarden 的组合,对容器镜像进行存储/签名/验证操作,cosign 与 harbor v2.5.0+版本有较好的兼容性,能直接在 harbor UI 上看到 cosign 证书配置。经测试 Harbor v2.1.1 版本也可使用 cosign 进行签名,只是 Harbor UI 上显示不太直观。

环境准备

  • Harbor 安装请参考官网文档,请尽量使用 https 方式让 Harbor 对外提供服务,并使用可信的证书减少配置步骤。在本次实践当中,我们使用一个免费可信证书来规避此问题。
  • cosign 安装参考官方文档,本次使用的是 go install github.com/sigstore/cosign/v2/cmd/cosign@latest 的方式安装。
  • RFO 参考上文的 quick 地址,本次准备环境使用 1 master + 1 worker 的集群,机器规格都是 4c8g,确保有足够的资源运行所需组件。
  • Rancher 使用 Docker run 方式启动,并将 RFO 集群使用 import 方式纳管到 Rancher 中。

Kubewarden 安装

Kubewarden 是一个开源项目,它是针对 Kubernetes 平台的策略引擎。它的目标是通过策略即代码的方式,为 Kubernetes 集群提供强大的安全性和策略控制功能。Kubewarden 可以帮助管理员和开发人员定义和实施各种策略,以确保应用程序和基础设施的安全性和合规性。

首先,我们需要在 Rancher 开启 extension 以及安装 Kubewarden 插件,从左侧菜单进入 Configuration -> Extensions

extension

开启 Extensions 后,在 Available 选项卡中,找到 Kubewarden 进行安装:

kubewarden

PS:安装时,如果是国内的环境,容易出现安装插件失败的情况,可以使用以下操作进行修复
进入 local 集群的 workload 页面,编辑 cattle-ui-plugin-system 命名空间下 ui-plugin-operator 工作负载配置
Pod 选项卡中,修改 Networking 配置,添加 Host Aliases,配置:185.199.110.133 raw.githubusercontent.com并保存,这样能减少国内 Github 相关域名被 DNS 污染的问题。

安装成功后,刷新页面,并进入下游 RFO 集群管理页面,左侧菜单出现 Kubewarden 管理页面。

rfo-kubewarden

并根据 Kubewarden 安装指引安装 Kubewarden,这个过程需要安装 cert-manager,将 Kubewarden 的 charts repo 添加到 Rancher 中,并在集群中安装 Kubewarden APP。安装成功后,集群中 Kubewarden 页面如下:

kubewarden-installed

根据提示安装 default-policy-server,这个默认 policy-server 将会使用 validatingwebhookconfigurations 以及 mutatingwebhookconfigurations 进行策略应用。

default-policy-server

镜像构建推送并验证

整个镜像推送验证的环节包括:

  • 使用 cosign 创建镜像签名密钥
  • Kubewarden 界面中,创建镜像签名验证策略
  • 构建镜像并推送到镜像仓库中
  • 对镜像使用 cosign 签名并推送
  • 在集群中部署镜像

cosign 创建签名密钥

参考文档,这次我们使用 k8s secret 作为 cosign 的 kms provider,使用以下命令创建密钥:

# 创建 cosign namespace
kubectl create ns cosign
# 使用cosign 创建 key,并存储在 k8s secret中,通过 COSIGN_PASSWORD 指定证书密码,此处为了简化操作,使用了空密码,请在应用时使用密码加强管理
COSIGN_PASSWORD= cosign generate-key-pair k8s://cosign/imagekey
# 通过kubectl 查看secret是否创建成功
kubectl get secret -n cosign imagekey
# NAME       TYPE     DATA   AGE
# imagekey   Opaque   3      2m46s

正常情况下,公钥会同时保存在运行目录下的 cosign.pub 文件中。

在 Kubewarden 中创建策略

进入集群下的 Kubewarden 菜单下 ClusterAdmissionPolicy 页面,点击 Create 进入创建页面,查找 Verify Image Signatures

create-policy

PS: 在第一次进入时,可能无法看到 artifacthub 中 kubewarden 策略,可以根据页面提示,添加 artifacthub.io 到访问白名单即可查询到配置。

选择 Verify Image Signatures 策略之后,在 General 中填写 Name image-validate,然后切换到 Settings 配置页面中,修改 Signature TypePublicKey

signature-type

Public Key 下点击 Add 之后,出现 image 输入框,此处需要输入镜像匹配名称,本次填写为 yuxing-test.cnrancher.com/test/*,其中 yuxing-test.cnrancher.com 是本次测试使用的 Harbor 域名,test 为镜像所在项目。

Public Keys 下添加我们的证书公钥,内容可以在cosign 创建签名密钥 中找到。输入完成后,点击 Finish 创建完成。

创建完成后,回到 ClusterAdmissionPolicies 列表页面,我们可以看到刚创建的 policy 状态:

policy-list

等待 Policy 状态为 Active 后生效,过程中 default-policy-server 会重启进行重新配置。若规则配置有问题,可以通过 kubectl get po -n cattle-kubewarden-system 找到 policy-server 并查看日志确认问题。

构建镜像并推送到镜像仓库中

本次简化构建镜像过程,使用 alpine:3.18.0 作为测试目标。

# pull alpine image
docker pull alpine:3.18.0
# retag it to our registry
docker tag $DIGEST yuxing-test.cnrancher.com/test/alpine:3.18.0
# push to registry
docker push yuxing-test.cnrancher.com/test/alpine:3.18.0

使用 cosign 对镜像进行签名:

# get the digest of alpine image, it should be only to diegst for this image and the one we need should be index to 1
IMAGE_DIGEST=`docker inspect --format='{{index .RepoDigests 1}}' yuxing-test.cnrancher.com/test/alpine:3.18.0`
# sign image with key stored in k8s, --tlog-upload=false is aim to not upload transparency log to sigstore server.
cosign sign --key k8s://cosign/imagekey --tlog-upload=false ${IMAGE_DIGEST}
# Pushing signature to: yuxing-test.cnrancher.com/test/alpine

签名完成后,可以登录到 Harbor,查看该镜像的签名情况:

harbor-alpine

同时我们推送 alpine:3.17.0 镜像到镜像仓库中但不进行 cosign 签名。

docker pull alpine:3.17.0
docker tag alpine:3.17.0 yuxing-test.cnrancher.com/test/alpine:3.17.0
docker push yuxing-test.cnrancher.com/test/alpine:3.17.0

在集群中部署镜像

我们在 Rancher UI 上,进入集群管理页面,使用 yuxing-test.cnrancher.com/test/alpine:3.18.0 镜像创建 deployment:

create-ok

点击创建后,成功部署,并注意到镜像名称被修改为只用 digest 的格式。

然后我们使用没有签名的 alpine:3.17.0 镜像创建 deployment,在创建后,会提示由于无签名而无法创建 pod:

create-fail

如果我们对 Verify Image Signatures 规则进行调整/升级,并应用到 Deployment/StatefulSet/DaemonSet 等类型上,则会在创建该类型资源时提示错误。

至此,我们完成了整个镜像的构建、签名和部署。

总结与思考

镜像签名的场景,可以应用在容器供应链安全的保障上,增强镜像来源的可信程度,在以下场景能发挥巨大的作用:

  • 使用镜像签名对生产环境进行保护,只部署已签名的镜像,减少镜像从其他环境误操作导致进入生产环境的问题。
  • 对引入的开源镜像进行可信扫描并签名,进行镜像准入核查。
  • 使用签名结合 SBOM(Software Bill of Materials)文档,增强对镜像中的软件进行溯源和审计的能力。

在引入签名的同时,也会带来额外的管理成本:

  • 使用 self-generated 证书固然很方便,但不利于分发和管理,对于大型的开发团队来说并不是一个好的选择。
  • 引入 CA(certificate authority) 管理机构,或使用公开可信的 CA 机构签发的证书进行签名。
    • 使用公网中可信 CA 的证书进行签名,需要 CI 环境有互联网访问的能力,并不利于私有环境的场景。cosign 本身也提供基于 sigstore 的 CA 机构Fulcio 签发证书对镜像进行签名的操作。
    • 虽然公有云中有提供私有 CA 证书管理服务,但大部分场景下企业需要有自己的证书管理工具与流程,这些流程本身就不利于证书的利用。
  • 对签名密钥的生命周期管理一直都是证书管理领域的大问题,这个问题在容器镜像签名中被放大。对何时需要对证书进行轮换,以及证书轮换时的影响与调整方案,都需要更深入的研究。

相关文章:

探索容器镜像安全管理之道

邓宇星,Rancher 中国软件架构师,7 年云原生领域经验,参与 Rancher 1.x 到 Rancher 2.x 版本迭代变化,目前负责 Rancher for openEuler(RFO)项目开发。 最近 Rancher v2.7.4 发布了,作为一个安全更新版本,也…...

【MySQL】内置函数

​🌠 作者:阿亮joy. 🎆专栏:《零基础入门MySQL》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉函…...

使用arm-none-eabi-gcc编译器搭建STM32的Vscode开发环境

工具 make:Windows中没有make,但是可以通过安装MinGW或者MinGW-w64,得到make。gcc-arm-none-eabi:建议最新版,防止调试报错OpenOCDvscodecubeMX VSCODE 插件 Arm Assembly:汇编文件解析C/C:c…...

图数据库Neo4j学习二——cypher基本语法

1命名规范 名称应以字母字符开头,不以数字开头,名称不应包含符号,下划线除外可以很长,最多65535( 2^16 - 1) 或65534字符,具体取决于 Neo4j 的版本名称区分大小写。:PERSON和:Person是:person三个不同的标签&#xff…...

ChatGPT:人工智能交互的未来之光

一、ChatGPT:开启自然语言交流新纪元 ChatGPT 是基于 GPT(生成式预训练)技术的最新版本,它采用深度学习模型,通过在大规模文本数据上的预训练来理解自然语言,并生成具有连贯性和合理性的回复。ChatGPT 是一…...

128最长连续数组

题目描述 最长连续序列 https://leetcode.cn/problems/longest-consecutive-sequence/class Solution {public:int longestConsecutive(vector<int>& nums) {unordered_set<int> st(...

redis 1

shell 1&#xff1a;安装1. 源码安装&#xff08;CENTOS&#xff09; 2.999:可能会出现得问题1. 编译出错 1&#xff1a;安装 1. 源码安装&#xff08;CENTOS&#xff09; 官方下载源码包 wget https://download.redis.io/redis-stable.tar.gz # 安装依赖 yum install gcc解压…...

vue+Element项目中v-for循环+表单验证

如果在Form 表单里有通过v-for动态生成&#xff0c;如何设置验证呢&#xff1f; <el-form ref"ruleFormRef" :model"ruleForm" status-icon :rules"rules" label-width"120px"class"demo-ruleForm" hide-required-aster…...

Day 66-68 主动学习之ALEC

代码&#xff1a; package dl;import java.io.FileReader; import java.util.*; import weka.core.Instances;/*** Active learning through density clustering.*/ public class Alec {/*** The whole dataset.*/Instances dataset;/*** The maximal number of queries that …...

local-path-provisioner与pvc本地磁盘挂载helm部署

1.helm拉取安装包 helm repo add containeroo https://charts.containeroo.ch helm pull containeroo/local-path-provisioner --version 0.0.19 tar -zxvf local-path-provisioner-0.0.19.tgz cd local-path-provisioner mv values.yaml values.yaml.back grep -v "#&qu…...

Visio/PPT/Matlab输出300dpi以上图片【满足标准投稿要求】

1. visio 遵照如下输出选项&#xff0c;另存为tif格式文件时&#xff0c;选择正确输出便是300dpi以上 2. matlab 文件选项选中导出设置&#xff0c;在渲染中选择dpi为600&#xff0c;导出图片即可&#xff0c;科研建议选择tif格式文件 3.ppt 打开注册表&#xff0c;winr键…...

科技UI图标的制作

科技UI图标的制作&#xff0c;效果图如下&#xff1a; 一、新建合成 1、新建合成&#xff0c;命名为合成1&#xff0c;参数设置如下&#xff1a; 2、新建纯色&#xff0c;命名为分形 二、添加分形杂色 1、添加分形杂色 为纯色层“分形”&#xff0c;添加分形杂色&#xff0c…...

微信小程序将接口返回的文件流预览导出Excel文件并转发

把接口url替换就可以用了 exportExcel () {wx.request({url: importMyApply, //这个地方是你获取二进制流的接口地址method: POST,responseType: "arraybuffer", //特别注意的是此处是请求文件流必须加上的属性&#xff0c;不然你导出到手机上的时候打不开&#xff…...

windows 安装 mongodb 数据库

软件下载 访问官方的下载地址&#xff1a; https://www.mongodb.com/try/download/community &#xff0c;然后选择对应的版本进行下载 下载好了之后双击进行安装 软件安装 1、点击 next 点击下一步 2、勾选接受协议&#xff0c;点击 next 3、第三页有两个选项&#x…...

业务不打烊:解决软件系统升级痛点的新方法

数字化时代&#xff0c;随着用户对产品性能和功能要求的不断提升&#xff0c;应用服务升级成了企业保持竞争力的关键之一。然而&#xff0c;传统的应用服务升级往往会给用户带来不必要的中断和不便&#xff0c;这种“伤筋动骨”的升级方式已经无法满足日益增长的用户需求&#…...

csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+antd前端模板

文章目录 ⭐前言⭐利用inscode免费开放资源&#x1f496; 在inscode搭建vue3tsant项目&#x1f496; 调整配置&#x1f496; antd 国际化配置&#x1f496; 用户store&#x1f496; 路由权限&#x1f496; 预览 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享…...

通过 CSS 的样式实现语音发送动效类似声音震动的效果

实现效果&#xff1a;一般用于发送语音的时候&#xff0c;出现动画效果 //模版部分 <view class"musical-scale"><view class"scale"><view class"em" v-for"(item,index) in 15" :key"index"></view…...

【C#】.Net Framework框架使用JWT

2023年&#xff0c;第31周&#xff0c;第2篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 本篇文章主要简单讲讲&#xff0c;.Net Framework框架下使用JWT的代码例子&#xff0c;以及他们的基本概念。 2002年微软发布了.net framewo…...

SQL高级教程第三章

SQL CREATE DATABASE 语句 CREATE DATABASE 语句 CREATE DATABASE 用于创建数据库。 SQL CREATE DATABASE 语法 CREATE DATABASE database_name SQL CREATE DATABASE 实例 现在我们希望创建一个名为 "my_db" 的数据库。 我们使用下面的 CREATE DATABASE 语句&…...

vue 3.0 下载本地pdf文件

使用a标签,把pdf文件放到public文件夹下面 <el-form label-width"160px"> <el-form-item label"使用手册"> <div class"form-item-static"> <a href"/使用手册.pdf" target"_blank" class"link&q…...

这次终于选对了!高效论文写作全流程AI论文写作软件推荐(2026 最新)

2026年AI论文写作软件已全面升级&#xff0c;论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节&#xff0c;以下工具按环节精准匹配&#xff0c;兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求&#xff…...

深度学习框架基于YOLOv8➕pyqt5的水稻害虫检测系统,YOLOV8模型如何训练水稻害虫检测数据集

基于YOLOv8➕pyqt5的水稻害虫检测系统&#xff0c;内含5229张水稻害虫数据集 包括[‘褐飞虱’, ‘绿叶蝉’, ‘稻纵卷叶螟’, ‘稻蝽’, ‘螟虫’, ‘稻蓟马’]&#xff0c;6类也可自行替换模型&#xff0c;使用该界面做其他检测 &#x1f33e; 基于 YOLOv8 PyQt5 的水稻害虫检…...

哔哩哔哩第三方开放平台软件bilipai7.0.2

bilipai是一款面向B站内容爱好者的第三方安卓客户端&#xff0c;它有着清新灵动的界面风格和流畅自然的操作体验&#xff0c;能完整同步B站的各类视频资源&#xff0c;包括番剧、动画、知识科普、生活分享等内容类别&#xff0c;用户登录账号后&#xff0c;还可以实时同步自己的…...

从PTA天梯赛L1真题看起:新手如何用C++快速搞定编程竞赛里的“送分题”?

从PTA天梯赛L1真题看起&#xff1a;新手如何用C快速搞定编程竞赛里的“送分题”&#xff1f; 第一次参加编程竞赛的新手&#xff0c;面对屏幕上密密麻麻的题目&#xff0c;往往会感到无从下手。但仔细观察历届PTA天梯赛L1级别的题目&#xff0c;你会发现一个有趣的现象——总有…...

索尼Bravia家庭影院新品登场,能否重塑市场格局?

索尼Bravia新品&#xff1a;模块化家庭影院新选择索尼宣布推出七款新的Bravia家庭影院产品&#xff0c;涵盖一台电视、两款条形音箱、三款低音炮和后置音箱。除Theater Bar 5外&#xff0c;产品可自由搭配组合。其中&#xff0c;Bravia Theater Bar 7作为中高端条形音箱&#x…...

开发者专属配置:OpenClaw+GLM-4-7-Flash优化命令行工作效率

开发者专属配置&#xff1a;OpenClawGLM-4-7-Flash优化命令行工作效率 1. 为什么开发者需要AI增强命令行&#xff1f; 作为每天与终端打交道的开发者&#xff0c;我经常遇到这样的困境&#xff1a;忘记复杂的grep参数组合、需要反复查阅历史命令、或是面对一长串docker compo…...

AI 模型精度与性能的权衡

AI模型精度与性能的权衡&#xff1a;寻找最佳平衡点 在人工智能领域&#xff0c;模型的精度与性能往往是一对矛盾体。精度代表模型预测的准确性&#xff0c;而性能则涉及计算速度、资源占用和实时性等指标。开发者常常需要在两者之间做出权衡&#xff0c;以满足不同场景的需求…...

3D Face HRN在影视特效中的应用:快速制作数字替身面部模型

3D Face HRN在影视特效中的应用&#xff1a;快速制作数字替身面部模型 1. 引言&#xff1a;数字替身制作的技术革命 在影视特效制作中&#xff0c;数字替身的创建一直是一项耗时且昂贵的工作。传统方法需要演员进行复杂的3D扫描&#xff0c;使用昂贵的设备在专业工作室中完成…...

RWKV7-1.5B-g1a参数避坑:top_p=0.9在中文任务中易引发事实性错误实测

RWKV7-1.5B-g1a参数避坑&#xff1a;top_p0.9在中文任务中易引发事实性错误实测 1. 模型简介与测试背景 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合中文场景下的基础问答、文案续写和简短总结任务。作为一款轻量级模型&#xff0c;它能在单卡2…...

央国企稳岗扩岗新举措解读

近日&#xff0c;国家层面再次强调了就业优先战略的重要性&#xff0c;并推动相关政策措施进一步升级。在这一宏观背景下&#xff0c;中央企业和国有企业作为国民经济的重要支柱&#xff0c;其在稳就业、扩岗位方面的举措备受关注。一系列新的行动方案正陆续出台&#xff0c;旨…...