Add a pinned secret-scanning workflow
secret-scan / gitleaks (push) Successful in 12s

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.
This commit is contained in:
flan committed 2026-09-28 17:27:48 +00:00
1 parent 0ab9688cce
commit 59aaebe108
1 file changed
+47
+47
View File
@@ -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