You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:08:12