From a8e4631ad12be3ccab1619af8a97bc016cfeef14 Mon Sep 17 00:00:00 2001 From: user2595 Date: Tue, 9 Jun 2026 15:07:09 +0000 Subject: [PATCH] ci(ai): add hard-blocking security scan (gitleaks + trivy config) + AI explain --- .gitea/workflows/security.yml | 63 +++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .gitea/workflows/security.yml diff --git a/.gitea/workflows/security.yml b/.gitea/workflows/security.yml new file mode 100644 index 0000000..0f6f4a0 --- /dev/null +++ b/.gitea/workflows/security.yml @@ -0,0 +1,63 @@ +# Feature B (+C) — Security-Scan (HART blockierend) + KI-Klartext-Erklärung. +# Pilot: läuft auf Push zum Branch ci-ai/pilot (Validierung) und auf PRs. +# Schlankes alpine-Image + Memory-Cap (Pi-Runner). ⚠ ARM64-Binaries! +# Gitleaks (Secrets) + Trivy config (IaC/Misconfig) — ohne schweren Vuln-DB-Scan. +# Funde -> Check schlägt hart fehl; danach erklärt die KI sie (skippt ohne Key). +name: Security + +on: + workflow_dispatch: {} + push: + branches: ["ci-ai/pilot"] + pull_request: + +env: + GITLEAKS_VERSION: "8.18.4" + +jobs: + scan: + runs-on: eulernest + container: + image: alpine:3.20 + options: "--memory=768m --memory-swap=1024m" + steps: + - name: Tooling + run: apk add --no-cache git curl bash tar python3 + + - name: Repo auschecken (git.eulernest.eu -> LAN via Runner-add-host) + run: git clone --depth 1 "https://git.eulernest.eu/${GITHUB_REPOSITORY}.git" src + + - name: Gitleaks (Secret-Scan, ARM64) + id: gl + run: | + curl -sSL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_arm64.tar.gz" \ + | tar -xz -C /usr/local/bin gitleaks + cd src && gitleaks detect --no-git --source . --redact -v 2>&1 | tee /tmp/scan.log + echo "code=${PIPESTATUS[0]}" >> "$GITHUB_OUTPUT" + + - name: Trivy (IaC/config, leicht) + id: tv + run: | + curl -sSL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh \ + | sh -s -- -b /usr/local/bin + cd src && trivy config --severity HIGH,CRITICAL --exit-code 1 --no-progress . 2>&1 | tee -a /tmp/scan.log + echo "code=${PIPESTATUS[0]}" >> "$GITHUB_OUTPUT" + + - name: Gate — hart blockieren bei Funden + run: | + if [ "${{ steps.gl.outputs.code }}" != "0" ] || [ "${{ steps.tv.outputs.code }}" != "0" ]; then + echo "Security-Funde -> Check schlägt fehl (hart blockierend)."; exit 1 + fi + echo "Keine HIGH/CRITICAL-Funde." + + - name: KI erklärt die Funde (nur bei Fehler, überspringt ohne Key) + if: failure() + env: + AI_PROVIDER: anthropic + AI_MODEL: claude-3-5-haiku-latest + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + GITEA_TOKEN: ${{ github.token }} + GITEA_API: https://git.eulernest.eu/api/v1 + run: | + git clone --depth 1 https://git.eulernest.eu/user2595/ci-ai.git /opt/ci-ai + python3 /opt/ci-ai/scripts/ai_explain.py security /tmp/scan.log