name: Security # Report-only in this plan: every scanner is non-blocking and uploads SARIF to # the Security tab. Enforcement (fail on fixable HIGH/CRITICAL, block on secrets) # is flipped on in Plan E after the remediation pass. on: pull_request: push: branches: [main] schedule: - cron: '32 5 * * 1' # weekly Monday 05:32 UTC permissions: contents: read concurrency: group: security-${{ github.ref }} cancel-in-progress: true jobs: gitleaks: name: Secret scan (gitleaks) runs-on: ubuntu-latest steps: - name: Harden the runner uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0 with: egress-policy: audit - name: Checkout (full history) uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: fetch-depth: 0 # gitleaks scans the whole git history, not just the diff - name: Run gitleaks uses: gitleaks/gitleaks-action@ff98106e4c7b2bc287b24eaf42907196329070c7 # v2.3.9 continue-on-error: true # report-only; enforcement flipped on in Plan E env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} osv-scanner: name: Dependency scan (OSV-Scanner) runs-on: ubuntu-latest permissions: contents: read security-events: write # upload SARIF to code scanning steps: - name: Harden the runner uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0 with: egress-policy: audit - name: Checkout uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Run OSV-Scanner uses: google/osv-scanner-action/osv-scanner-action@9a498708959aeaef5ef730655706c5a1df1edbc2 # v2.3.8 continue-on-error: true # report-only; enforcement flipped on in Plan E with: scan-args: |- --lockfile=./pnpm-lock.yaml --format=sarif --output=osv-results.sarif - name: Upload OSV SARIF if: always() uses: github/codeql-action/upload-sarif@02c5e83432fe5497fd85b873b6c9f16a8578e1d9 # v3.37.0 with: sarif_file: osv-results.sarif category: osv-scanner trivy-config: name: IaC/config scan (Trivy) runs-on: ubuntu-latest permissions: contents: read security-events: write steps: - name: Harden the runner uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0 with: egress-policy: audit - name: Checkout uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Trivy config scan (Dockerfile + docker-compose) uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0 continue-on-error: true # report-only; enforcement flipped on in Plan E with: scan-type: config scan-ref: . format: sarif output: trivy-config.sarif - name: Upload Trivy config SARIF if: always() uses: github/codeql-action/upload-sarif@02c5e83432fe5497fd85b873b6c9f16a8578e1d9 # v3.37.0 with: sarif_file: trivy-config.sarif category: trivy-config trivy-license: name: License compliance scan (Trivy) runs-on: ubuntu-latest permissions: contents: read security-events: write steps: - name: Harden the runner uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0 with: egress-policy: audit - name: Checkout uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Trivy license scan uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0 continue-on-error: true # report-only; enforcement flipped on in Plan E with: scan-type: fs scan-ref: . scanners: license format: sarif output: trivy-license.sarif - name: Upload Trivy license SARIF if: always() uses: github/codeql-action/upload-sarif@02c5e83432fe5497fd85b873b6c9f16a8578e1d9 # v3.37.0 with: sarif_file: trivy-license.sarif category: trivy-license