我想为许多图像运行 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 之前运行它,但看起来它不使用本地图像(结果完全相同)
容器内部是否可以“通过”授权?
根据文档这里
您应该创建具有 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。