如何配置Trivy对OpenShift内部镜像仓库的认证以完成镜像扫描?
Trivy扫描OpenShift内部镜像仓库认证问题解决方案
问题场景
流水线中使用Trivy扫描镜像,此前运行正常,近期需要扫描OpenShift内部镜像仓库的ImageStream镜像,执行扫描命令后出现认证失败报错,关键错误信息:
GET https://openshiftregistry/v2/namespace/imagestream/manifests/tag: UNAUTHORIZED: authentication required; [map[Action:pull Class: Name:namespace/imagestream Type:repository]]
同时提示本地容器runtime(Docker/Podman/containerd)不可用。
当前使用的Trivy命令:
trivy image --ignore-unfixed --format template --template "path for output" --output trivy_image_report.html --skip-update --offline-scan $image
解决方案
Trivy支持读取Docker格式的认证配置文件访问私有镜像仓库,OpenShift内部仓库的认证可通过以下步骤配置:
1. 生成Docker认证配置文件
OpenShift内部镜像仓库依赖OAuth2 token认证,可通过两种方式生成认证文件:
- 流水线内自动获取(推荐):若流水线运行在OpenShift集群内,默认ServiceAccount具备镜像拉取权限,直接用其token生成配置:
# 替换为你的OpenShift镜像仓库地址,例如 openshift-registry.default.svc:5000 REGISTRY="openshiftregistry" # 读取ServiceAccount token TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) # 生成临时Docker配置文件 cat > /tmp/docker-config.json <<EOF { "auths": { "$REGISTRY": { "auth": "$(echo -n "oauth2accesstoken:$TOKEN" | base64 -w 0)" } } } EOF - 手动登录生成:若在外部环境执行,先通过
oc login登录OpenShift集群,此时~/.docker/config.json会自动添加对应仓库的认证条目,直接复用该文件即可。
2. 让Trivy读取认证配置
设置环境变量指定Docker配置文件路径,Trivy会自动加载其中的认证信息:
export DOCKER_CONFIG=/tmp
3. 优化扫描命令(解决容器runtime不可用问题)
报错提示本地容器daemon不可用,添加--remote参数可强制Trivy通过HTTP/HTTPS直接拉取镜像,不依赖本地容器runtime:
trivy image --remote --ignore-unfixed --format template --template "path for output" --output trivy_image_report.html --skip-update --offline-scan $image
额外注意事项
- 确保
$image变量是OpenShift内部仓库的完整镜像路径,例如openshift-registry.default.svc:5000/your-namespace/your-imagestream:your-tag,而非仅ImageStream名称。 - 离线扫描模式下,需提前确保Trivy已下载对应镜像的漏洞数据库。
内容的提问来源于stack exchange,提问作者Karlito Brigante
相关产品推荐
相关产品推荐

