如何在 Azure DevOps 中运行简单的图像扫描

问题描述 投票:0回答:1

我想为许多图像运行 trivy sbom 生成器,从 Azure DevOps 管道推送到 Azure 容器注册表。

我的任务看起来像

- task: AzureCLI@2
  inputs:
    azureSubscription: 'MySubscription'
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      az acr login --name ACR_Name
    
      docker run --rm -v $(System.DefaultWorkingDirectory):/src aquasec/trivy image --format cyclonedx --output /src/sbom.json ACR_Name.azurecr.io/IMAGENAME:latest

不幸的是,除了例外情况,它不会以这种方式工作

2024-11-12T12:24:45Z FATAL 致命错误图像扫描错误:扫描错误: 无法初始化扫描仪: 无法初始化图像扫描仪: 找不到指定的图像 [“docker”中的“ACR_NAME/IMAGENAME:最新”” “containerd”“podman”“remote”]:发生 4 个错误:

  • docker错误: 无法检查图像 (...): 无法连接 到位于 unix:///var/run/docker.sock 的 Docker 守护进程。是码头工人 守护进程正在运行?
  • containerd 错误:找不到containerd 套接字: /run/containerd/containerd.sock
  • podman 错误:无法初始化 Podman 客户端:未找到 podman 套接字:stat podman/podman.sock:否 这样的文件或目录
  • 远程错误:GET https://ACR_NAME/oauth2/token?scope=repository%3A...%3Apull&service=...: 未授权:需要身份验证,请访问 https://aka.ms/acr/authorization了解更多信息。

同时,我可以按预期从该脚本内部运行

docker pull IMAGENAME
。我什至尝试在运行 trivy 之前运行它,但看起来它不使用本地图像(结果完全相同)

容器内部是否可以“通过”授权?

image azure-devops trivy
1个回答
0
投票

根据文档这里

您应该创建具有 AcrPull 权限的服务主体

export SP_DATA=$(az ad sp create-for-rbac --name TrivyTest --role AcrPull --scope "/subscriptions/<subscription_id>/resourceGroups/<resource_group>/providers/Microsoft.ContainerRegistry/registries/<registry_name>")

那么您需要这些凭据:

# must set TRIVY_USERNAME empty char
export AZURE_CLIENT_ID$(echo $SP_DATA | jq -r .appId)
export AZURE_CLIENT_SECRET$(echo $SP_DATA | jq -r .password)
export AZURE_TENANT_ID$(echo $SP_DATA | jq -r .tenant)

你应该能够以这种方式运行它:

- task: AzureCLI@2
  inputs:
    azureSubscription: 'MySubscription'
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      az acr login --name ACR_Name
    
      docker run --rm -v $(System.DefaultWorkingDirectory):/src \
         -e AZURE_CLIENT_ID=$AZURE_CLIENT_ID \
         -e AZURE_CLIENT_SECRET=$AZURE_CLIENT_SECRET \
         -e AZURE_TENANT_ID=$AZURE_TENANT_ID \
         aquasec/trivy image --format cyclonedx --output /src/sbom.json ACR_Name.azurecr.io/IMAGENAME:latest
    env:
      AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)
      AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
      AZURE_TENANT_ID: $(AZURE_TENANT_ID)

我假设您将凭据存储在链接到管道的变量组中的秘密中。

如果你想在代理上安装 trivy 而不是使用 docker 镜像,你可以查看这个 tutorial

© www.soinside.com 2019 - 2024. All rights reserved.