惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security Affairs
N
News and Events Feed by Topic
T
Tenable Blog
P
Proofpoint News Feed
W
WeLiveSecurity
Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
Help Net Security
Help Net Security
I
Intezer
T
Threat Research - Cisco Blogs
S
Secure Thoughts
C
Cyber Attacks, Cyber Crime and Cyber Security
L
Lohrmann on Cybersecurity
AWS News Blog
AWS News Blog
Google Online Security Blog
Google Online Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
The Hacker News
The Hacker News
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Tor Project blog
N
News | PayPal Newsroom
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
A
Arctic Wolf
Forbes - Security
Forbes - Security
O
OpenAI News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Latest
Security Latest
P
Palo Alto Networks Blog
S
Schneier on Security
S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
H
Heimdal Security Blog
V
Vulnerabilities – Threatpost
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
T
Troy Hunt's Blog
Latest news
Latest news
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
L
LINUX DO - 热门话题
M
MIT News - Artificial intelligence
N
Netflix TechBlog - Medium
V
Visual Studio Blog
H
Hacker News: Front Page

小松鼠的博客

记录一次线上k8s工作节点无法创建容器的问题排查思路与解决办法 记一次线上GoLang项目OOM排查过程 从LastPass转向拥抱开源KeePass的心路历程 故障定位与 AI 结合前后端编码实践 FileBeat收集nginx-ingress-controller日志 K8s云原生环境下文件描述符占用过高查询思路 2024年最新关闭火绒安全工具的开机自启方法 Kubernetes任务调度实践-Go语言实现Job和CronJob对比分析 使用Go语言接入Choerodon实现基于OAuth2的统一身份认证登录 在Vue2中自定义Switch组件并实现父子组件双向数据绑定 关于docker jdk1.8镜像中的GB18030-2022标准支持及验证 Go框架gin中的session存储gin-contrib-sessions和go-session 关于修改node_module中的源码问题记录 docker-compose网络和内网服务IP冲突问题 慎用存储过程:一条语句引发的数据库存储100%占用 Spring Boot中4种文件下载方法的实现 避坑-不能将specific类型的gitlab-runner改变为share类型 Docker compose中的MySQL主从复制模式和percona-toolkit工具使用 在minio中开启https访问以及使用rclone备份minio桶 在多机Docker环境下部署Choerodon的解决方案 Prometheus中Monitor添加对SpringBoot Actuator的Basic认证 在Nginx的容器镜像中隐藏Nginx的Server响应头 K8s中的两种nginx-ingress-controller及其区别 两个docker工具:runlike和whaler Grafana中的邮件报警和截图插件grafana-image-enderer K8s中externalName-service和services-without-selectors maven配置文件settings.xml中的一些概念总结 K8s中flexvolume插件驱动的安装 K8s中的coredns无法解析svc问题排查 K8s中使用Ingress访问请求体过大问题解决 关于k8s中对于SpringBoot应用TCP类型的就绪探针不准确的问题发现 K8s中的环境变量与应用程序的对应关系与操作 SpringMVC4升级为SpringBoot2实战 在Vmware中Ubuntu22.04的vm-tools和网络问题 修改k8s节点主机名并重新加入集群 离线安装Grafana插件 Spring Data Jpa 中使用CriteriaBuilder动态拼接SQL 在SpringBoot项目配置Liquibase数据库版本管理 记录Vue中父子组件传值的实战应用 实现单例模式的8种方法 三种常用的生产者消费者模式实现 使用两个线程交替打印0-100的奇偶数 关于部署于JBoss5中的Spring应用获取项目真实部署路径的问题 获取下一个完全对称日 通过短信验证码验证修改密码的解决方案 在Win10中使用Win+R快速启动软件 使用RSA加解密时注意Cipher.getInstance(String var0,Provider var1)提供的Provider是否正确 在RestEasy2.x中解决接口重复提交问题 几道简单的CTF题目思路 重温Spring---Spring事务控制与基于XML和注解的配置方法 重温Spring---Spring AOP基于XML和注解的配置 重温Spring---AOP动态代理和Spring AOP及其基本原理 重温Spring---Spring IOC基于XML和注解的配置和比较 在Windows10中安装MySQL5.7 Zip版本及常用配置 重温Spring---使用Spring IOC解决程序耦合 策略模式与责任链模式实战应用 Linux上直接打开war包修改文件 在Windows上运行两个微信的简单脚本 ThreadPoolExecutor的使用方法与分页查询数据实例 IDEA中Shelve Changes 和 Git Stash 通过resteasy发布RESTful接口 解决前端请求后台接口,后台报错Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 使用VBA脚本汇总Excel文档 使用Jenkins+GitLab实现自动部署vue项目 Kubernetes:使用hostPath挂载nginx集群的配置文件和html 彻底搞定VirtualBox虚拟机的网络设定 在Docker中安装MySQL5.7并开启远程访问(附授权和修改密码方式) 利用git命令和java文件流 获取自己改动过的文件 浅谈Spring定时任务的使用(Scheduled注解) 在Spring项目简单配置Flyway(V4.2版本)数据库版本管理 解决Spring单元测试中因外键关联导致的失败integrity constraint violation:foreign key no action Redis安装与哨兵模式配置入门 关于Vue中使用Element-UI样式row-class-name失效的问题 Element-UI中实现可动态增加行列和可编辑单元格的表格 Windows系统查看端口占用、结束进程方法和命令 层次分析法(AHP)分析步骤与计算方法 源码分析之解决layui框架重载表格时额外参数不清空的问题 Spring Data Jpa 返回自定义对象(实体部分属性、多表联查) 如何将一个jar放到本地maven仓库中 关于SSM项目停止Tomcat时Log4j出现java.lang.NoClassDefFoundError: 获取el-table单元格值并根据该值对元素自定义样式渲染 解决Git每次push都要重新输入账号密码和HttpRequestException encountered的问题 解决前后端分离项目中Vue不带cookies的问题 SSM集成Shiro自定义权限过滤器不执行解决方案 SSM集成Shiro不进入自定义Realm的doGetAuthorizationInfo的解决方案 Vue+SSM中使用Token验证登录 Git拉代码推送代码提示密码错误如何修改 Git配置SSH Key(Git配置多个账户) 安装Tomcat服务器以及错误汇总(tomcat8.0、jdk8) 关于我
离线更新k8s环境下的trivy漏洞库方法
ycyin · 2023-09-05 · via 小松鼠的博客

2023年9月5日大约 5 分钟云原生trivyharbor


本文记录的是如何在离线环境下快速更新trivy.db,解决国内下载东西网络慢的问题,以及如何将文件拷贝进容器。这两个小技巧比较实用,以供未来参考。

本文的场景是在K8S中使用Helm部署的Harbor仓库使用trivy进行漏洞扫描,需要注意我这里harbor版本是v2.1.4。对应的trivy的容器镜像是trivy-adapter-photon:v2.1.4,使用的是trivy version 1,使用的Trivy DB 的更新日期还是2021年,支持的最高Trivy DB v1只更新到2023-02-08,可以参考:https://github.com/aquasecurity/trivy-db#download-the-vulnerability-database官方文档。如果要更新到更新的trivy漏洞库估计得同步更新Harbor才行了。这里仅对我这个版本进行记录,即只将Trivy DB更新到2023-02-08。

根据官方文档其实更新trivy.db的方式很简单,如果能访问外网直接一条trivy image --download-db-only命令搞定或者能搭建一个db库也行trivy image --db-repository registry.gitlab.com/gitlab-org/security-products/dependencies/trivy-db 。如果没有外网则直接替换harbor-harbor-trivy-0Pod中/home/scanner/.cache/trivy/db/目录下的trivy.db和metadata.json文件即可。

如果在Trivy version 1里面直接使用Trivy DB v2则会报错:

the version of DB schema doesn't match. Local DB: 2, Expected: 1(点击展开) 2023-09-04T09:14:54Z [INFO] [/pkg/scan/job.go:325]: registration: 2023-09-04T09:14:54Z [INFO] [/pkg/scan/job.go:336]: { "uuid": "145755d1-008f-11ec-9901-f6b6534433d6", "name": "Trivy", "description": "The Trivy scanner adapter", "url": "http://harbor-harbor-trivy:8080", "disabled": false, "is_default": true, "health": "healthy", "auth": "", "skip_certVerify": false, "use_internal_addr": true, "adapter": "Trivy", "vendor": "Aqua Security", "version": "v0.9.2", "create_time": "2021-08-19T01:45:06.323427Z", "update_time": "2021-08-19T01:45:06.323428Z" } 2023-09-04T09:14:54Z [INFO] [/pkg/scan/job.go:325]: scanRequest: 2023-09-04T09:14:54Z [INFO] [/pkg/scan/job.go:336]: { "registry": { "url": "http://harbor-harbor-core:80", "authorization": "[HIDDEN]" }, "artifact": { "namespace_id": 3, "repository": "ci/javabase", "tag": "", "digest": "sha256:6bef11801820b6ec976ab59fb474807d3c9d763613c95ede87a0e27589002c7d", "mime_type": "application/vnd.docker.distribution.manifest.v2+json" } } 2023-09-04T09:14:54Z [INFO] [/pkg/scan/job.go:156]: Report mime types: [application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0] 2023-09-04T09:14:54Z [INFO] [/pkg/scan/job.go:202]: Get report for mime type: application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0 2023-09-04T09:14:56Z [INFO] [/pkg/scan/job.go:219]: Report with mime type application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0 is not ready yet, retry after 5 seconds 2023-09-04T09:15:01Z [ERROR] [/pkg/scan/job.go:284]: check scan report with mime type application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0: running trivy wrapper: running trivy: exit status 1: 2023-09-04T09:14:58.588Z ERROR Trivy version (0.9.2) is old. Update to the latest version. 2023-09-04T09:14:58.588Z FATAL database error: the version of DB schema doesn't match. Local DB: 2, Expected: 1 : general response handler: unexpected status code: 500, expected: 200

下载DB

根据官方文档说明,如果是Trivy DB V1则直接在github release里面下载,V1的库只更新到2023年2月,V2则需要通过Trivy or Oras CLI下载。
Trivy:

# 1. 创建一个临时目录
TRIVY_TEMP_DIR=$(mktemp -d)

# 2. 使用 Trivy 下载漏洞数据库到临时目录
docker run --rm -v $TRIVY_TEMP_DIR:/root/.cache/ aquasec/trivy image --download-db-only

# 3. 将文件打包到 db.tar.gz
tar -cf ./db.tar.gz -C $TRIVY_TEMP_DIR trivy/db

# 4. 删除临时目录
rm -rf $TRIVY_TEMP_DIR

Oras CLI:

oras pull ghcr.io/aquasecurity/trivy-db:2

但是国内下载都非常之慢,这里有个小技巧:通过https://labs.play-with-docker.com/https://www.tmp.link/进行下载。
play-with-docker可以比较快速的访问外网和启动Docker容器,在里面执行上面的Trivy命令得到我们需要的trivy.db和metadata.json文件;
而tmp.link是一个临时网盘,可以方便的使用Curl进行文件上传下载,将文件通过Curl上传到这个网盘就可以在国内比较快速地下载了。

curl -k -F "file=@/root/db.tar.gz" -F "token=xxx" -F "model=1"  -X POST "https://tmp-cli.vx-cdn.com/app/upload_cli"

更换Trivy的DB

我这里是直接替换harbor-harbor-trivy-0Pod中/home/scanner/.cache/trivy/db/目录下的trivy.db和metadata.json文件即可。

首先容易想到的就是直接kubectl cp命令就行了。可是无法执行,如下:

# 拷贝出来
$ kubectl cp xxx-namespace/harbor-harbor-trivy-0:/home/scanner/.cache/trivy/db/metadata.json ./metadata.json
command terminated with exit code 126

# 拷贝进去
$ kubectl cp ./trivy.db xxx-namespace/harbor-harbor-trivy-0:/home/scanner/.cache/trivy/db/trivy.db
OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"tar\": executable file not found in $PATH": unknown
command terminated with exit code 126

kubectl cp命令依赖tar命令,如果容器没有tar命令是没法执行的。而刚好trivy容器对应的镜像trivy-adapter-photon:v2.1.4没有tar命令。

第二个小技巧:大多数容器中都有curl命令,我们可以通过curl内部的minio文件服务进行下载。

### 备份
kubectl exec -it pod/harbor-harbor-trivy-0 -n xxx-namespace -- mv /home/scanner/.cache/trivy/db/metadata.json /home/scanner/.cache/trivy/db/metadata.json.bak2

kubectl exec -it pod/harbor-harbor-trivy-0 -n xxx-namespace -- mv /home/scanner/.cache/trivy/db/trivy.db /home/scanner/.cache/trivy/db/trivy.db.bak2  


### 下载文件
kubectl exec -it pod/harbor-harbor-trivy-0 -n xxx-namespace --  curl -o /home/scanner/.cache/trivy/db/metadata.json 'http://10.221.113.1:32367/minio/download/trivy/metadata.json?token=' \
  -H 'Connection: keep-alive' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6' \
  -H 'Cookie: redirect_to=%252F' \
  --compressed \
  --insecure

kubectl exec -it pod/harbor-harbor-trivy-0 -n xxx-namespace --  curl -o /home/scanner/.cache/trivy/db/trivy.db 'http://10.221.113.1:32367/minio/download/trivy/trivy.db?token=' \
  -H 'Connection: keep-alive' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6' \
  -H 'Cookie: redirect_to=%252F' \
  --compressed \
  --insecure

这里还有个小问题就是我们的minio服务是使用的内部域名,直接在容器里无法解析域名也无法修改hosts文件,所以这里把minio通过NodePort暴露出来即可。尝试直接curl minio:9000也不行(k8s service name+port),所以我添加了很多Header来模拟浏览器访问,这个命令是通过浏览器访问http://10.221.113.1:32367下载文件时,从F12控制台 Copy的Curl命令得到的。

总结

  1. Trivy的漏洞库DB更新直接替换文件即可,但需要注意Trivy DB V1还是V2;
  2. 技巧一:通过https://labs.play-with-docker.com/https://www.tmp.link/操作,解决国内下载文件慢的问题
  3. 技巧二:容器中没有tar命令无法执行kubectl cp命令时,可以通过curl 从文件存储上下载/上传文件。