From aeefcc6616164e29166405e4103168969f591c4c Mon Sep 17 00:00:00 2001 From: flan Date: Mon, 28 Sep 2026 17:27:45 +0000 Subject: [PATCH] Add a pinned secret-scanning workflow Scans the full git history on push, pull request and weekly, so a credential that was committed and later removed is still detected. The scanner archive is pinned by version and verified by SHA-256 before it runs, and matched values are redacted so they never reach the CI log. --- .gitea/workflows/secret-scan.yml | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .gitea/workflows/secret-scan.yml diff --git a/.gitea/workflows/secret-scan.yml b/.gitea/workflows/secret-scan.yml new file mode 100644 index 0000000..e9504be --- /dev/null +++ b/.gitea/workflows/secret-scan.yml @@ -0,0 +1,47 @@ +name: secret-scan + +# Scans the FULL git history, not just the working tree: a credential that was +# committed and later deleted is still published, and only a history scan sees it. +# The weekly run exists because new detector rules find old secrets that passed +# when they were first pushed. + +on: + push: + pull_request: + schedule: + - cron: "0 5 * * 1" + +jobs: + gitleaks: + runs-on: ubuntu-latest + steps: + - name: Check out full history + # Pinned to a commit, not a mutable tag: a security job must not silently + # change what it runs when upstream retags. + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + fetch-depth: 0 + + - name: Install pinned Gitleaks + env: + GITLEAKS_VERSION: "8.30.1" + GITLEAKS_SHA256: "551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb" + run: | + set -euo pipefail + archive="gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" + curl -fsSL -o "${archive}" \ + "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/${archive}" + # Fail loudly on any mismatch rather than scanning with an unverified binary. + printf '%s %s\n' "${GITLEAKS_SHA256}" "${archive}" | sha256sum -c - + tar -xzf "${archive}" gitleaks + chmod 0755 gitleaks + ./gitleaks version + + - name: Scan full history for secrets + # --redact=100 keeps matched values out of the CI log, which is itself + # readable by anyone who can see the run. + run: ./gitleaks git . --redact=100 --no-banner --exit-code 1 + + - name: Remove the downloaded scanner + if: always() + run: rm -f gitleaks gitleaks_*.tar.gz