离线环境harbor开启Trivy扫描

Harbor自带Trivy扫描器,可以用来扫描仓库中的镜像是否有漏洞。开启仅需要运行命令sudo ./install.sh --with-trivy即可。但是Trivy默认要联网下载数据库,国内服务器完全连不上它的数据库网址,然后下载失败。

总体思路是在别的电脑上先下载所需要的文件,然后通过scp上传到服务器上,解压后放在Trivy挂载的文件夹里面。

下载db和java-db文件

我们需要Trivy DB v2,这里选择用Oras CLI进行下载。
根据Oras官网安装文档,选择通过Docker下载。

1
2
docker pull ghcr.io/oras-project/oras:v1.3.0

这里需要用wsl或者linux运行命令:

1
2
docker run -it --rm -v $(pwd):/workspace ghcr.io/oras-project/oras:v1.3.0 pull ghcr.io/aquasecurity/trivy-db:2
docker run -it --rm -v $(pwd):/workspace ghcr.io/oras-project/oras:v1.3.0 pull ghcr.io/aquasecurity/trivy-java-db:1

这两条指令会在当前文件夹下通过oras镜像下载两个压缩包,分别是db.tar.gzjavadb.tar.gz
下载完后通过scp命令上传到服务器上并解压即可,解压完后应该是dbjavadb两个文件夹,需要将javadb改名为java-db

关闭trivy自动更新

在harbor.yml文件里找到trivy的配置:

1
2
3
skip_update: true
skip_java_db_update: true
offline_scan: true

然后在harbor文件夹下运行:
1
2
sudo docker compose down
sudo docker compose up -d

将文件放在挂载目录

harbor会自动将自己默认存储位置挂载到trivy镜像里面,
如何查看Trivy挂载的文件位置:

1
docker inspect <trivy容器ID> | grep -A5 Mounts

会有类似输出:
1
2
3
4
5
6
"Mounts": [
{
"Type": "bind",
"Source": "/home/harbor/data/trivy-adapter/trivy",
"Destination": "/home/scanner/.cache/trivy",
"Mode": "rw",

因为我将harbor默认存储位置改为了data_volume: /home/harbor/data,所以查到的Source是/home/harbor/data/trivy-adapter/trivy,data文件夹下默认是没有文件夹的,我们要先创建trivy-adapter/trivy文件夹。
然后将db和java-db拷贝进去。

1
2
3
# 假设你当前在 /home/yourname/trivy
sudo cp -r trivy/db /home/yourname/harbor/data/trivy-adapter/trivy/
sudo cp -r trivy/java-db /home/yourname/harbor/data/trivy-adapter/trivy/

最终文件结构:

1
2
3
4
5
6
7
/home/yourname/harbor/data/trivy-adapter/trivy/
├── db
├── trivy.db
└── metadata.json
├── java-db
├── trivy-java.db
└── metadata.json

拷贝完trivy应该能正常工作了。如果有问题的话有可能是文件的权限问题。

PS: 封面来自这里