aquasecurity/trivy-action

GitHub: aquasecurity/trivy-action

Trivy 的 GitHub Action 封装,用于在 CI 流水线中自动化扫描容器镜像、代码和 IaC 配置的安全漏洞。

Stars: 1239 | Forks: 296

# Trivy Action [![GitHub Release](https://img.shields.io/github/release/aquasecurity/trivy-action.svg?logo=github)][release] [![GitHub Marketplace](https://img.shields.io/badge/marketplace-trivy--action-blue?logo=github)][marketplace] [![License](https://img.shields.io/github/license/aquasecurity/trivy-action)][license] ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/d8a39c42c1205635.png) ## 目录 * [用法](#usage) * [扫描 CI Pipeline](#scan-ci-pipeline) * [扫描 CI Pipeline (使用 Trivy 配置)](#scan-ci-pipeline-w-trivy-config) * [缓存](#cache) * [Trivy 设置](#trivy-setup) * [扫描 Tarball](#scanning-a-tarball) * [配合模板使用 Trivy](#using-trivy-with-templates) * [配合 GitHub Code Scanning 使用 Trivy](#using-trivy-with-github-code-scanning) * [使用 Trivy 扫描 Git 仓库](#using-trivy-to-scan-your-git-repo) * [使用 Trivy 扫描 rootfs 目录](#using-trivy-to-scan-your-rootfs-directories) * [使用 Trivy 扫描基础设施即代码](#using-trivy-to-scan-infrastructure-as-code) * [使用 Trivy 生成 SBOM](#using-trivy-to-generate-sbom) * [使用 Trivy 扫描私有仓库](#using-trivy-to-scan-your-private-registry) * [在未启用 code scanning 的情况下使用 Trivy](#using-trivy-if-you-dont-have-code-scanning-enabled) * [自定义配置](#customizing) * [输入参数](#inputs) * [环境变量](#environment-variables) * [Trivy 配置文件](#trivy-config-file) ## 用法 ### 扫描 CI Pipeline ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 - name: Build an image from Dockerfile run: docker build -t docker.io/my-organization/my-app:${{ github.sha }} . - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}' format: 'table' exit-code: '1' ignore-unfixed: true vuln-type: 'os,library' severity: 'CRITICAL,HIGH' ``` ### 扫描 CI Pipeline (使用 Trivy 配置) ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner in fs mode uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'fs' scan-ref: '.' trivy-config: trivy.yaml ``` 在这种情况下,`trivy.yaml` 是作为仓库一部分提交的 YAML 配置。Trivy 官网提供了详细信息,示例如下: ``` format: json exit-code: 1 severity: CRITICAL secret: config: config/trivy/secret.yaml ``` 可以在 `trivy.yaml` 文件中定义所有选项。通过 Action 指定单个选项是为了向后兼容。以下内容必须定义,因为它们无法通过配置文件定义: - `scan-ref`:如果使用 `fs, repo` 扫描。 - `image-ref`:如果使用 `image` 扫描。 - `scan-type`:用于定义扫描类型,例如 `image`、`fs`、`repo` 等。 #### 选项优先顺序 Trivy 使用 [Viper](https://github.com/spf13/viper),它定义了选项的优先顺序。顺序如下: - GitHub Action 标志 - 环境变量 - 配置文件 - 默认值 ### 缓存 如果在扫描过程中下载了[漏洞数据库](https://github.com/aquasecurity/trivy-db)、[Java 数据库](https://github.com/aquasecurity/trivy-java-db)和[检查包](https://github.com/aquasecurity/trivy-checks),该 Action 具有缓存和恢复它们的内置功能。 默认情况下,缓存存储在 `$GITHUB_WORKSPACE/.cache/trivy` 目录中。 缓存在扫描开始前恢复,在扫描结束后保存。 它在底层使用 [actions/cache](https://github.com/actions/cache),但需要配置的设置更少。 缓存输入是可选的,并且默认情况下缓存是开启的。 #### 禁用缓存 如果你想禁用缓存,请将 `cache` 输入设置为 `false`,但我们建议保持启用以避免速率限制问题。 ``` - name: Run Trivy scanner without cache uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'fs' scan-ref: '.' cache: 'false' ``` #### 更新默认分支中的缓存 请注意,GitHub Actions 中分支之间的[缓存访问有限制](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows#restrictions-for-accessing-a-cache)。 默认情况下,工作流可以访问和恢复在当前分支或默认分支(通常是 `main` 或 `master`)中创建的缓存。 如果你需要跨分支共享缓存,可能需要在默认分支中创建缓存并在当前分支中恢复它。 为了优化你的工作流,你可以设置一个 cron 任务来定期更新默认分支中的缓存。 这允许后续扫描使用缓存的数据库而无需再次下载。 ``` # 注意:此 workflow 仅更新缓存。你应该为实际的 Trivy 扫描创建一个单独的 workflow。 # 在你的扫描 workflow 中,设置 TRIVY_SKIP_DB_UPDATE=true 和 TRIVY_SKIP_JAVA_DB_UPDATE=true。 name: Update Trivy Cache on: schedule: - cron: '0 0 * * *' # Run daily at midnight UTC workflow_dispatch: # Allow manual triggering jobs: update-trivy-db: runs-on: ubuntu-latest steps: - name: Setup oras uses: oras-project/setup-oras@v1 - name: Get current date id: date run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT - name: Download and extract the vulnerability DB run: | mkdir -p $GITHUB_WORKSPACE/.cache/trivy/db oras pull ghcr.io/aquasecurity/trivy-db:2 tar -xzf db.tar.gz -C $GITHUB_WORKSPACE/.cache/trivy/db rm db.tar.gz - name: Download and extract the Java DB run: | mkdir -p $GITHUB_WORKSPACE/.cache/trivy/java-db oras pull ghcr.io/aquasecurity/trivy-java-db:1 tar -xzf javadb.tar.gz -C $GITHUB_WORKSPACE/.cache/trivy/java-db rm javadb.tar.gz - name: Cache DBs uses: actions/cache/save@v4 with: path: ${{ github.workspace }}/.cache/trivy key: cache-trivy-${{ steps.date.outputs.date }} ``` 运行扫描时,设置环境变量 `TRIVY_SKIP_DB_UPDATE` 和 `TRIVY_SKIP_JAVA_DB_UPDATE` 以跳过下载过程。 ``` - name: Run Trivy scanner without downloading DBs uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'image' scan-ref: 'myimage' env: TRIVY_SKIP_DB_UPDATE: true TRIVY_SKIP_JAVA_DB_UPDATE: true ``` ### Trivy 设置 默认情况下,该 Action 将 [`aquasecurity/setup-trivy`](https://github.com/aquasecurity/setup-trivy) 作为第一步调用, 它会安装由 `version` 输入指定的 `trivy` 版本。如果你已经通过其他方式安装了 `trivy`, 例如直接调用 `aquasecurity/setup-trivy`,或者多次调用此 Action,则可以使用 `skip-setup-trivy` 输入来禁用此步骤。 #### 手动设置 Trivy ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 - name: Manual Trivy Setup uses: aquasecurity/setup-trivy@v0.2.0 with: cache: true version: v0.69.3 - name: Run Trivy vulnerability scanner in repo mode uses: aquasecurity/trivy-action@master with: scan-type: 'fs' ignore-unfixed: true format: 'sarif' output: 'trivy-results.sarif' severity: 'CRITICAL' skip-setup-trivy: true ``` #### 多次调用 Trivy Action 时跳过设置 另一个常见的用例是构建多次调用此 Action,在这种情况下,我们可以在后续调用中将 `skip-setup-trivy` 设置为 `true`,例如: ``` name: build on: push: branches: - main pull_request: jobs: test: runs-on: ubuntu-latest permissions: contents: read steps: - name: Check out Git repository uses: actions/checkout@v4 # The first call to the action will invoke setup-trivy and install trivy - name: Generate Trivy Vulnerability Report uses: aquasecurity/trivy-action@master with: scan-type: "fs" output: trivy-report.json format: json scan-ref: . exit-code: 0 - name: Upload Vulnerability Scan Results uses: actions/upload-artifact@v4 with: name: trivy-report path: trivy-report.json retention-days: 30 - name: Fail build on High/Criticial Vulnerabilities uses: aquasecurity/trivy-action@master with: scan-type: "fs" format: table scan-ref: . severity: HIGH,CRITICAL ignore-unfixed: true exit-code: 1 # On a subsequent call to the action we know trivy is already installed so can skip this skip-setup-trivy: true ``` #### 使用非默认令牌安装 Trivy GitHub Enterprise Server (GHES) 对 `https://github.com` 服务器使用无效的 `github.token`。 因此,你无法使用 `setup-trivy` Action 安装 `Trivy`。 要解决此问题,你需要使用 `token-setup-trivy` 输入覆盖 `setup-trivy` 的令牌: ``` - name: Run Trivy scanner without cache uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'fs' scan-ref: '.' token-setup-trivy: ${{ secrets.GITHUB_PAT }} ``` GitHub 甚至为类似情况提供了 [create-github-app-token](https://github.com/actions/create-github-app-token)。 ### 扫描 Tarball ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 - name: Generate tarball from image run: | docker pull docker save -o vuln-image.tar - name: Run Trivy vulnerability scanner in tarball mode uses: aquasecurity/trivy-action@0.33.1 with: input: /github/workspace/vuln-image.tar severity: 'CRITICAL,HIGH' ``` ### 配合模板使用 Trivy 该 Action 支持 [Trivy 模板][trivy-templates]。 使用 `template` 输入指定模板文件的路径(记得给路径加上 `@` 前缀)。 ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: scan-type: "fs" scan-ref: . format: 'template' template: "@path/to/my_template.tpl" ``` #### 默认模板 Trivy 拥有[默认模板][trivy-default-templates]。 默认情况下,`setup-trivy` 将它们安装到 `$HOME/.local/bin/trivy-bin/contrib` 目录中。 ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: scan-type: "fs" scan-ref: . format: 'template' template: "@$HOME/.local/bin/trivy-bin/contrib/html.tpl" ``` ### 配合 GitHub Code Scanning 使用 Trivy 如果你有可用的 [GitHub code scanning](https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/about-code-scanning),你可以按如下方式使用 Trivy 作为扫描工具: ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF files to Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Build an image from Dockerfile run: | docker build -t docker.io/my-organization/my-app:${{ github.sha }} . - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}' format: 'sarif' output: 'trivy-results.sarif' - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v4 with: sarif_file: 'trivy-results.sarif' ``` 你可以在这里找到更深入的示例:https://github.com/aquasecurity/trivy-sarif-demo/blob/master/.github/workflows/scan.yml 如果你想在 Trivy 扫描返回非零退出代码时仍将 SARIF 结果上传到 GitHub Code scanning,可以在上传步骤中添加以下内容: ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF files to Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Build an image from Dockerfile run: | docker build -t docker.io/my-organization/my-app:${{ github.sha }} . - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}' format: 'sarif' output: 'trivy-results.sarif' - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v4 if: always() with: sarif_file: 'trivy-results.sarif' ``` 更多详情请参阅:https://docs.github.com/en/actions/learn-github-actions/expressions#always ### 使用 Trivy 扫描 Git 仓库 也可以使用 Trivy 内置的 repo 扫描功能扫描你的 git 仓库。如果你想在每个 PR 打开时将 Trivy 作为构建时检查运行,这会很方便。这有助于你识别每个 PR 可能引入的潜在漏洞。 如果你有可用的 [GitHub code scanning](https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/about-code-scanning),你可以按如下方式使用 Trivy 作为扫描工具: ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF files to Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner in repo mode uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'fs' ignore-unfixed: true format: 'sarif' output: 'trivy-results.sarif' severity: 'CRITICAL' - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v4 with: sarif_file: 'trivy-results.sarif' ``` ### 使用 Trivy 扫描 rootfs 目录 也可以使用 Trivy 内置的 rootfs 扫描功能扫描你的 rootfs 目录。如果你希望在每个 PR 打开时将 Trivy 作为构建时检查运行,这会很方便。这有助于你识别每个 PR 可能引入的潜在漏洞。 如果你有可用的 [GitHub code scanning](https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/about-code-scanning),你可以按如下方式使用 Trivy 作为扫描工具: ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF files to Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner with rootfs command uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'rootfs' scan-ref: 'rootfs-example-binary' ignore-unfixed: true format: 'sarif' output: 'trivy-results.sarif' severity: 'CRITICAL' - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v4 with: sarif_file: 'trivy-results.sarif' ``` ### 使用 Trivy 扫描基础设施即代码 也可以使用 Trivy 内置的 repo 扫描功能扫描你的 IaC 仓库。 如果你希望在每个 PR 打开时将 Trivy 作为构建时检查运行,这会很方便。 这有助于你识别每个 PR 可能引入的潜在漏洞。 如果你有可用的 [GitHub code scanning](https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/about-code-scanning),你可以按如下方式使用 Trivy 作为扫描工具: ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF files to Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner in IaC mode uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'config' hide-progress: true format: 'sarif' output: 'trivy-results.sarif' exit-code: '1' severity: 'CRITICAL,HIGH' - name: Upload Trivy scan results to GitHub Security tab if: always() uses: github/codeql-action/upload-sarif@v4 with: sarif_file: 'trivy-results.sarif' ``` **注意**:如果你的 Terraform 配置包含私有模块,请配置 Git 以便与托管它们的仓库进行身份验证。 这可以通过在你的 CI 工作流中添加一个设置访问权限的步骤来完成,例如使用个人访问令牌 (PAT) 或 SSH 密钥: ``` - name: Configure Git for private modules run: | git config --global url."https://$GITHUB_USER:$PRIVATE_REPO_TOKEN@github.com/".insteadOf "https://github.com/" env: GITHUB_USER: ${{ github.actor }} PRIVATE_REPO_TOKEN: ${{ secrets.PRIVATE_REPO_TOKEN }} ``` 这确保 Trivy 可以下载私有模块。 ### 使用 Trivy 生成 SBOM Trivy 可以为你的依赖项生成 [SBOM](https://www.aquasec.com/cloud-native-academy/supply-chain-security/sbom/) 并将其提交给像 [GitHub Dependency Graph](https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-the-dependency-graph) 这样的消费者。 [将 SBOM 发送到 GitHub](https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/using-the-dependency-submission-api) 的功能仅在你当前在[仓库中启用了](https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/configuring-the-dependency-graph#enabling-and-disabling-the-dependency-graph-for-a-private-repository) GitHub Dependency Graph 时才可用。 为了将结果发送到 GitHub Dependency Graph,你需要创建一个 [GitHub PAT](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) 或使用 [GitHub installation access token](https://docs.github.com/en/actions/security-guides/automatic-token-authentication)(也称为 `GITHUB_TOKEN`): ``` --- name: Generate SBOM on: push: branches: - main ## GITHUB_TOKEN 身份验证,仅在不打算使用 PAT 时添加 permissions: contents: write jobs: generate-sbom: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'fs' format: 'github' output: 'dependency-results.sbom.json' scan-ref: '.' github-pat: ${{ secrets.GITHUB_TOKEN }} # or ${{ secrets.github_pat_name }} if you're using a PAT ``` 扫描镜像时,你可能希望解析实际的输出 JSON,因为 Github Dependency 不会显示所有详细信息,例如每个依赖项的文件路径。 你可以将报告作为 artifact 上传并下载它,例如使用 [upload-artifact action](https://github.com/actions/upload-artifact): ``` --- name: Generate SBOM on: push: branches: - main ## GITHUB_TOKEN 身份验证,仅在不打算使用 PAT 时添加 permissions: contents: write jobs: generate-sbom: runs-on: ubuntu-latest steps: - name: Scan image in a private registry uses: aquasecurity/trivy-action@0.33.1 with: image-ref: "private_image_registry/image_name:image_tag" scan-type: image format: 'github' output: 'dependency-results.sbom.json' github-pat: ${{ secrets.GITHUB_TOKEN }} # or ${{ secrets.github_pat_name }} if you're using a PAT severity: "MEDIUM,HIGH,CRITICAL" scanners: "vuln" env: TRIVY_USERNAME: "image_registry_admin_username" TRIVY_PASSWORD: "image_registry_admin_password" - name: Upload trivy report as a Github artifact uses: actions/upload-artifact@v4 with: name: trivy-sbom-report path: '${{ github.workspace }}/dependency-results.sbom.json' retention-days: 20 # 90 is the default ``` ### 使用 Trivy 扫描私有仓库 也可以使用 Trivy 内置的镜像扫描功能扫描你的私有仓库。你所要做的就是设置 ENV 变量。 #### Docker Hub 仓库 Docker Hub 需要 `TRIVY_USERNAME` 和 `TRIVY_PASSWORD`。 从公共仓库下载时不需要设置 ENV 变量。 ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF results to the GitHub Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}' format: 'sarif' output: 'trivy-results.sarif' env: TRIVY_USERNAME: Username TRIVY_PASSWORD: Password - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v4 with: sarif_file: 'trivy-results.sarif' ``` #### AWS ECR (Elastic Container Registry) Trivy 使用 AWS SDK。你不需要安装 `aws` CLI 工具。 你可以使用 [AWS CLI 的 ENV Vars][env-var]。 ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF files to Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: image-ref: 'aws_account_id.dkr.ecr.region.amazonaws.com/imageName:${{ github.sha }}' format: 'sarif' output: 'trivy-results.sarif' env: AWS_ACCESS_KEY_ID: key_id AWS_SECRET_ACCESS_KEY: access_key AWS_DEFAULT_REGION: us-west-2 - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v4 with: sarif_file: 'trivy-results.sarif' ``` #### GCR (Google Container Registry) Trivy 使用 Google Cloud SDK。你不需要安装 `gcloud` 命令。 如果你想使用目标项目的仓库,可以通过 `GOOGLE_APPLICATION_CREDENTIAL` 进行设置。 ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF files to Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}' format: 'sarif' output: 'trivy-results.sarif' env: GOOGLE_APPLICATION_CREDENTIAL: /path/to/credential.json - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v4 with: sarif_file: 'trivy-results.sarif' ``` #### 自托管 BasicAuth 服务器需要 `TRIVY_USERNAME` 和 `TRIVY_PASSWORD`。 如果你想使用 80 端口,请使用 NonSSL `TRIVY_NON_SSL=true` ``` name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 permissions: contents: read # Required to checkout and read repo files security-events: write # Required to upload SARIF files to Security tab steps: - name: Checkout code uses: actions/checkout@v4 - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}' format: 'sarif' output: 'trivy-results.sarif' env: TRIVY_USERNAME: Username TRIVY_PASSWORD: Password - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v4 with: sarif_file: 'trivy-results.sarif' ``` ### 在未启用 code scanning 的情况下使用 Trivy 也可以在工作流摘要中浏览扫描结果。 此步骤对于没有 [GitHub Advanced Security](https://docs.github.com/en/get-started/learning-about-github/about-github-advanced-security) 许可证的私有仓库特别有用。 ``` - name: Run Trivy scanner uses: aquasecurity/trivy-action@0.33.1 with: scan-type: config hide-progress: true output: trivy.txt - name: Publish Trivy Output to Summary run: | if [[ -s trivy.txt ]]; then { echo "### Security Output" echo "
Click to expand" echo "" echo '```terraform' cat trivy.txt echo '```' echo "
" } >> $GITHUB_STEP_SUMMARY fi ``` ## 自定义配置 配置优先级: - [输入参数](#inputs) - [环境变量](#environment-variables) - [Trivy 配置文件](#trivy-config-file) - 默认值 ### 输入参数 以下输入可用作 `step.with` 键: | Name | Type | Default | Description | |------------------------------|---------|------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `scan-type` | String | `image` | 扫描类型,例如 `image` 或 `fs` | | `input` | String | | Tar 引用,例如 `alpine-latest.tar` | | `image-ref` | String | | 镜像引用,例如 `alpine:3.10.2` | | `scan-ref` | String | `/github/workspace/` | 扫描引用,例如 `/github/workspace/` 或 `.` | | `format` | String | `table` | 输出格式 (`table`, `json`, `template`, `sarif`, `cyclonedx`, `spdx`, `spdx-json`, `github`, `cosign-vuln`) | | `template` | String | | 输出模板 (`@$HOME/.local/bin/trivy-bin/contrib/gitlab.tpl`, `@$HOME/.local/bin/trivy-bin/contrib/junit.tpl`) | | `tf-vars` | String | | Terraform 变量文件的路径 | | `output` | String | | 将结果保存到文件 | | `exit-code` | String | `0` | 发现指定漏洞时的退出代码 | | `ignore-unfixed` | Boolean | false | 忽略未修补/未修复的漏洞 | | `vuln-type` | String | `os,library` | 漏洞类型 (os,library) | | `severity` | String | `UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL` | 要扫描和显示的漏洞严重级别 | | `skip-dirs` | String | | 跳过遍历的目录列表(以逗号分隔) | | `skip-files` | String | | 跳过遍历的文件列表(以逗号分隔) | | `cache-dir` | String | `$GITHUB_WORKSPACE/.cache/trivy` | 缓存目录。注意:此值无法通过 `trivy.yaml` 配置。 | | `timeout` | String | `5m0s` | 扫描超时时长 | | `ignore-policy` | String | | 使用 OPA rego 语言过滤漏洞 | | `hide-progress` | String | `false` | 隐藏进度条和日志输出 | | `list-all-pkgs` | String | | 输出所有包,无论是否有漏洞 | | `scanners` | String | `vuln,secret` | 要检测的安全问题列表(以逗号分隔)(`vuln`,`secret`,`misconfig`,`license`) | | `trivyignores` | String | 仓库内一个或多个 `.trivyignore` 文件的相对路径列表(以逗号分隔),或单个 `.trivyignore.yaml` 文件。 | | `trivy-config` | String | | trivy.yaml 配置文件的路径 | | `github-pat` | String | | 用于将 SBOM 扫描结果发送到 GitHub Dependency Graph 的身份验证令牌。可以是 GitHub 个人访问令牌 (PAT) 或 GITHUB_TOKEN | | `limit-severities-for-sarif` | Boolean | false | 默认情况下,*SARIF* 格式强制输出所有漏洞,无论配置的严重级别如何。要覆盖此行为,请将此参数设置为 **true** | | `docker-host` | String | | 默认设置为 `unix://var/run/docker.sock`,但可以更新以帮助处理容器化基础设施值(需要 `unix:/` 或其他前缀) | | `version` | String | `v0.69.3` | 要使用的 Trivy 版本,例如 `latest` 或 `v0.69.3` | | `skip-setup-trivy` | Boolean | false | 跳过调用 `setup-trivy` Action 来安装 `trivy` | | `token-setup-trivy` | Boolean | | 覆盖 `setup-trivy` 用于检出 `trivy` 仓库的 `github.token` | ### 环境变量 你可以使用 [Trivy 环境变量][trivy-env] 来设置必要的选项(包括[输入参数](#inputs)不支持的标志,例如 `--secret-config`)。 **注意** 在某些旧版本的 Action 中存在一个错误,导致一次 Action 调用的输入会泄露到后续的 Action 调用中。 这可能导致多次调用 Action 的工作流(例如运行多个扫描,或以不同输出格式运行相同扫描)无法产生所需的输出。 你可以通过查看 GitHub Actions 步骤信息来判断是否属于这种情况,如果你的 Actions 输出中显示的 `env` 部分 包含你未明确设置的 `TRIVY_*` 环境变量,则你可能受到此错误的影响,应该 升级到最新的 Action 版本。 ### Trivy 配置文件 当使用 `trivy-config` [输入参数](#inputs)时,你可以使用 [Trivy 配置文件][trivy-config] 设置选项(包括[输入参数](#inputs)不支持的标志,例如 `--secret-config`)。
标签:Aquasecurity, CI/CD安全, DevSecOps, GitHub Action, GitHub Marketplace, IaC扫描, Llama, LLM防护, SBOM, Web截图, 上游代理, 云安全监控, 容器安全, 工作流, 文档安全, 日志审计, 硬件无关, 结构化查询, 自动化安全, 请求拦截, 静态分析