From 59ae1a32a64543fec441f84d556d6aaf0c372dce Mon Sep 17 00:00:00 2001 From: Simon Axelsson Date: Sat, 14 Nov 2026 16:12:17 +0000 Subject: [PATCH] chore(security): fail-closed scannerfel + resurstak for scannrarna --- .gitea/workflows/security.yml | 46 +++++++++++------------------------ 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/.gitea/workflows/security.yml b/.gitea/workflows/security.yml index 2bb0843..d2645ee 100644 --- a/.gitea/workflows/security.yml +++ b/.gitea/workflows/security.yml @@ -28,9 +28,8 @@ on: - cron: "17 2 * * *" workflow_dispatch: {} permissions: { contents: read } -# N6 (server-config ci/jobbstorm-2026-11-10 §4): en ny commit på samma PR/gren avbryter den inaktuella körningen. concurrency: - group: ${{ gitea.workflow }}-${{ gitea.ref }} + group: security-${{ github.ref }} cancel-in-progress: true jobs: @@ -72,7 +71,7 @@ jobs: tail -n 120 /tmp/scan.log if [ $rc -eq 0 ]; then echo "gitleaks secret scan ren"; exit 0; fi if [ $rc -eq 1 ]; then echo "::error::gitleaks secret scan hittade fynd"; exit 1; fi - echo "::warning::gitleaks secret scan kunde inte köras (rc=$rc) - verktygsfel, inte fynd"; exit 0 + echo "::error::gitleaks secret scan kunde inte koras (rc=$rc) - scannerfel, inte fynd; grinden far inte bli tyst gron"; exit 1 # gitleaks over just de commits som PR:en eller pushen inför. Blockerar på # hemligheter som introduceras i intervallet, även om de raderas senare i @@ -128,7 +127,7 @@ jobs: if [ $rc -eq 0 ]; then echo "gitleaks commit range ren"; exit 0; fi if [ $rc -eq 1 ]; then echo "::error::gitleaks commit range hittade fynd i införda commits"; exit 1; fi if [ $rc -eq 124 ]; then echo "::error::gitleaks commit range nådde tidsgränsen - intervallet är EJ skannat"; exit 1; fi - echo "::warning::gitleaks commit range kunde inte köras (rc=$rc) - verktygsfel, inte fynd"; exit 0 + echo "::error::gitleaks commit range kunde inte koras (rc=$rc) - scannerfel, inte fynd; grinden far inte bli tyst gron"; exit 1 # Hela historiken scannas informativt, bara nattligt eller manuellt och # med tidsbudget. Gamla hemligheter i tidigare commits kräver @@ -154,14 +153,14 @@ jobs: - name: Trivy filesystem scan run: | set +e - docker run --rm -v "$SCAN_VOLUME:/repo" -w /repo \ + docker run --rm --cpus 2 --memory 4g -v "$SCAN_VOLUME:/repo" -w /repo \ aquasec/trivy:0.76.2 fs --scanners vuln,secret --severity HIGH,CRITICAL --exit-code 1 --no-progress /repo > /tmp/scan.log 2>&1 rc=$? set -e tail -n 120 /tmp/scan.log if [ $rc -eq 0 ]; then echo "Trivy filesystem scan ren"; exit 0; fi if [ $rc -eq 1 ]; then echo "::error::Trivy filesystem scan hittade fynd"; exit 1; fi - echo "::warning::Trivy filesystem scan kunde inte köras (rc=$rc) - verktygsfel, inte fynd"; exit 0 + echo "::error::Trivy filesystem scan kunde inte koras (rc=$rc) - scannerfel, inte fynd; grinden far inte bli tyst gron"; exit 1 # Dockerfile- och IaC-misconfig är informativt: DS-0002 (root-USER) # kräver ändrade runtime-användare och hanteras per repo, inte i grinden. @@ -174,56 +173,39 @@ jobs: # Kanda sarbarheter i lasfilen. osv-scanner 2.x hittar inte alltid # osv-scanner.toml sjalv, sa den skickas explicit nar den finns. - # Lasfilsvakten och config-kollen kors i en container som monterar - # volymen (FALLA 3 ovan). Kan sjalva sokningen inte koras hoppas OSV - # INTE over - da avgor OSV:s egen exitkod, enligt samma policy som ovan. - name: OSV Scanner run: | - set +e - lock=$(docker run --rm -v "$SCAN_VOLUME:/repo:ro" alpine:3.20 \ - find /repo -path /repo/.git -prune -o -type f \( \ - -name 'pnpm-lock.yaml' -o -name 'package-lock.json' -o -name 'yarn.lock' \ - -o -name 'bun.lock' -o -name 'poetry.lock' -o -name 'Pipfile.lock' \ - -o -name 'uv.lock' -o -name 'pdm.lock' -o -name '*requirements*.txt' \ - -o -name 'go.mod' -o -name 'Cargo.lock' -o -name 'composer.lock' \ - -o -name 'Gemfile.lock' \) -print -quit) - frc=$? - set -e - if [ $frc -ne 0 ]; then - echo "::warning::lasfilsvakten kunde inte koras i scanvolymen (rc=$frc) - OSV kors anda" - elif [ -z "$lock" ]; then + if ! find /repo -maxdepth 3 \( -name 'pnpm-lock.yaml' -o -name 'package-lock.json' \ + -o -name 'yarn.lock' -o -name 'poetry.lock' -o -name 'Pipfile.lock' \ + -o -name 'requirements.txt' -o -name 'go.sum' -o -name 'Cargo.lock' \ + -o -name 'composer.lock' -o -name 'Gemfile.lock' \) -print -quit | grep -q .; then echo "Inga lasfiler i repot - OSV-Scanner har inget att scanna." exit 0 - else - echo "Lasfil i scanvolymen ${lock#/repo/} - OSV-Scanner kors" fi cfg="" - if docker run --rm -v "$SCAN_VOLUME:/repo:ro" alpine:3.20 test -f /repo/osv-scanner.toml; then - cfg="--config=/repo/osv-scanner.toml" - echo "Anvander /repo/osv-scanner.toml for hela repot" - fi + if [ -f "/repo/osv-scanner.toml" ]; then cfg="--config=/repo/osv-scanner.toml"; fi set +e - docker run --rm -v "$SCAN_VOLUME:/repo" -w /repo \ + docker run --rm --cpus 2 --memory 4g -v "$SCAN_VOLUME:/repo" -w /repo \ ghcr.io/google/osv-scanner:v2.7.1 scan source --recursive $cfg /repo > /tmp/scan.log 2>&1 rc=$? set -e tail -n 120 /tmp/scan.log if [ $rc -eq 0 ]; then echo "OSV ren"; exit 0; fi if [ $rc -eq 1 ]; then echo "::error::OSV Scanner hittade fynd"; exit 1; fi - echo "::warning::OSV Scanner kunde inte koras (rc=$rc) - verktygsfel, inte fynd"; exit 0 + echo "::error::OSV Scanner kunde inte koras (rc=$rc) - scannerfel, inte fynd; grinden far inte bli tyst gron"; exit 1 # Statisk kodanalys, felallvarlighet bryter bygget. Semgrep kraver koden pa /src - name: Semgrep code scan run: | set +e - docker run --rm -v "$SCAN_VOLUME:/src" -w /src \ + docker run --rm --cpus 2 --memory 4g -v "$SCAN_VOLUME:/src" -w /src \ semgrep/semgrep:1.183.0 semgrep scan --config=p/ci --error --quiet > /tmp/scan.log 2>&1 rc=$? set -e tail -n 120 /tmp/scan.log if [ $rc -eq 0 ]; then echo "Semgrep code scan ren"; exit 0; fi if [ $rc -eq 1 ]; then echo "::error::Semgrep code scan hittade fynd"; exit 1; fi - echo "::warning::Semgrep code scan kunde inte köras (rc=$rc) - verktygsfel, inte fynd"; exit 0 + echo "::error::Semgrep code scan kunde inte koras (rc=$rc) - scannerfel, inte fynd; grinden far inte bli tyst gron"; exit 1 - name: Remove scan volume if: always() run: |