如何在Azure DevOps流水线中运行Trivy镜像SBOM生成并解决授权问题
解决方案:Azure DevOps流水线中用Trivy为ACR镜像生成SBOM的问题处理
针对你遇到的Docker守护进程连接失败、ACR认证失败、Trivy无法识别本地镜像的问题,以下是具体解决思路和实现方案:
一、解决Docker守护进程连接问题
如果使用微软托管代理:
- 选择预装Docker的代理镜像(如
ubuntu-latest、windows-2022),这类代理的Docker daemon默认处于运行状态。 - 若仍出现连接错误,可在脚本开头添加验证或重启命令:
# Linux代理下验证并重启Docker docker info || sudo systemctl restart docker
如果是自托管代理:
- 确保Docker daemon已启动,且配置允许本地进程连接(默认Unix socket或Windows named pipe已启用)。
二、传递ACR授权信息给Trivy容器的两种方案
方案1:共享主机Docker Socket(适用于已拉取到本地的镜像)
通过挂载主机的Docker socket,让Trivy容器直接访问主机的镜像列表,无需额外传递凭据(主机已通过az acr login完成认证)。
示例AzureCLI@2任务脚本:
# 登录ACR az acr login --name <你的ACR名称> # 拉取目标镜像(可选,若已确保主机有该镜像可跳过) docker pull <你的ACR名称>.azurecr.io/<镜像名>:<标签> # 启动Trivy生成SBOM,挂载Docker Socket和输出目录 docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ # Linux代理用这个路径 # -v //var/run/docker.sock:/var/run/docker.sock # Windows代理用这个路径 -v $(pwd)/sbom-output:/output \ aquasec/trivy image \ --format cyclonedx \ --output /output/<镜像名>-sbom.json \ <你的ACR名称>.azurecr.io/<镜像名>:<标签>
注意:挂载Docker Socket会让Trivy容器获得主机Docker的完全控制权,仅在可信的流水线环境中使用。
方案2:直接让Trivy从ACR拉取镜像(更安全,无需本地拉取)
通过传递ACR的凭据给Trivy容器,让它直接远程拉取镜像并生成SBOM,避免挂载Socket的安全风险。
方式A:使用ACR管理员凭据(简单但权限大,不推荐生产环境)
# 获取ACR管理员用户名和密码 ACR_USER=$(az acr credential show --name <你的ACR名称> --query username -o tsv) ACR_PASS=$(az acr credential show --name <你的ACR名称> --query passwords[0].value -o tsv) # 启动Trivy,通过环境变量传递凭据 docker run --rm \ -v $(pwd)/sbom-output:/output \ -e TRIVY_USERNAME=$ACR_USER \ -e TRIVY_PASSWORD=$ACR_PASS \ aquasec/trivy image \ --format cyclonedx \ --output /output/<镜像名>-sbom.json \ <你的ACR名称>.azurecr.io/<镜像名>:<标签>
方式B:使用服务主体临时令牌(推荐流水线环境,最小权限)
先为流水线服务主体分配ACR的AcrPull角色,然后获取临时访问令牌:
# 获取ACR临时访问令牌(使用当前AzureCLI身份,即流水线服务主体) ACR_TOKEN=$(az acr login --name <你的ACR名称> --expose-token --output tsv --query accessToken) # 服务主体的固定用户名是一个占位GUID ACR_USER=00000000-0000-0000-0000-000000000000 # 启动Trivy传递令牌 docker run --rm \ -v $(pwd)/sbom-output:/output \ -e TRIVY_USERNAME=$ACR_USER \ -e TRIVY_PASSWORD=$ACR_TOKEN \ aquasec/trivy image \ --format cyclonedx \ --output /output/<镜像名>-sbom.json \ <你的ACR名称>.azurecr.io/<镜像名>:<标签>
三、流水线后续处理
生成SBOM后,可添加PublishBuildArtifacts任务将SBOM文件上传到流水线工件,方便后续查看或集成:
- task: PublishBuildArtifacts@1 inputs: pathtoPublish: '$(pwd)/sbom-output' artifactName: 'sbom-files'
内容的提问来源于stack exchange,提问作者JoeBloggs
相关产品推荐
相关产品推荐

