ci(dast): draai ZAP adviserend na elke webdeploy tegen de live host #850

Merged
brenno merged 1 commit from fix/dast-post-deploy into main 2026-07-25 09:54:33 +00:00
Owner

Haakt de bestaande OWASP ZAP DAST-scan adviserend in ná de webdeploy, tegen de live host. Volgt op het verzoek om ZAP in de pijplijn te nemen; keuze: live, na deploy (dat is waar de scan echt iets vindt).

Waarom hier, en niet in check-full

make dast bestond al (sinds 22-07) maar was nergens ingehaakt. De scan is alleen iets waard tegen een échte host: een lokale wegwerpserver antwoordt met zíjn responseheaders, een echte host met de zijne. scripts/deploy_web.sh roept ZAP daarom als laatste stap aan met DAST_URL op de zojuist gezette site — één script dat zowel de handmatige make deploy-web als de release-workflow op de tag dekt.

Bewust buiten check/check-full: dat zijn poorten, en dit is een advies dat een draaiende container-runtime nodig heeft.

Eigenschappen van de stap

  • Nooit blokkerend. De wissel is op dat punt al gebeurd en byte-voor-byte geverifieerd; een ZAP-waarschuwing draait een geslaagde deploy niet terug. De aanroep vangt elke uitkomst op.
  • Slaat zichzelf over zonder runtime (typisch in CI, waar geen docker/colima draait) met een duidelijke melding, in plaats van de deploy te laten struikelen.
  • Handmatig overslaan met OCIDECK_DEPLOY_SKIP_DAST=1.

Getest

  • De scan draaide echt: make dast DAST_URL=https://ocideck.librekat.nl/ → 0 FAIL, 9 WARN (passief), ZAP stable via colima.
  • shellcheck scripts/deploy_web.sh: schoon. bash -n: schoon. --dry-run stopt vóór deploy én vóór de scan.
  • make check: groen (6599 tests). make check-secrets: groen. make sast: groen (0 findings).

Wat de eerste live-run vond → #849

De Apache-host achter https://ocideck.librekat.nl stuurt geen enkele beveiligingsheader (CSP-als-header, X-Frame-Options, X-Content-Type-Options, HSTS, Permissions-Policy, COEP). Vastgelegd als aparte security-issue #849 met bewijs en een voorgestelde repo-gestuurde route (.htaccess via de deploy). Twee ZAP-meldingen zijn getrieerd als niet-echt: 10027 (vals-positief uit de geminificeerde main.dart.js) en 10015 (Apache-standaard cache-header).

Bewaker

Ontwikkelgereedschap: raakt bestandsformaat, opslag, afhankelijkheden noch een publieke belofte. De enige uitgaande actie is een passieve scan van onze eigen host, ná een deploy die de gebruiker zelf start. Geen bewaker-weging nodig.

Haakt de bestaande OWASP ZAP DAST-scan adviserend in ná de webdeploy, tegen de live host. Volgt op het verzoek om ZAP in de pijplijn te nemen; keuze: **live, na deploy** (dat is waar de scan echt iets vindt). ## Waarom hier, en niet in check-full `make dast` bestond al (sinds 22-07) maar was nergens ingehaakt. De scan is alleen iets waard tegen een échte host: een lokale wegwerpserver antwoordt met zíjn responseheaders, een echte host met de zijne. `scripts/deploy_web.sh` roept ZAP daarom als laatste stap aan met `DAST_URL` op de zojuist gezette site — één script dat zowel de handmatige `make deploy-web` als de release-workflow op de tag dekt. Bewust **buiten** `check`/`check-full`: dat zijn poorten, en dit is een advies dat een draaiende container-runtime nodig heeft. ## Eigenschappen van de stap - **Nooit blokkerend.** De wissel is op dat punt al gebeurd en byte-voor-byte geverifieerd; een ZAP-waarschuwing draait een geslaagde deploy niet terug. De aanroep vangt elke uitkomst op. - **Slaat zichzelf over zonder runtime** (typisch in CI, waar geen docker/colima draait) met een duidelijke melding, in plaats van de deploy te laten struikelen. - **Handmatig overslaan** met `OCIDECK_DEPLOY_SKIP_DAST=1`. ## Getest - De scan draaide echt: `make dast DAST_URL=https://ocideck.librekat.nl/` → 0 FAIL, 9 WARN (passief), ZAP stable via colima. - `shellcheck scripts/deploy_web.sh`: schoon. `bash -n`: schoon. `--dry-run` stopt vóór deploy én vóór de scan. - `make check`: **groen** (6599 tests). `make check-secrets`: **groen**. `make sast`: **groen** (0 findings). ## Wat de eerste live-run vond → #849 De Apache-host achter `https://ocideck.librekat.nl` stuurt **geen enkele beveiligingsheader** (CSP-als-header, `X-Frame-Options`, `X-Content-Type-Options`, HSTS, `Permissions-Policy`, COEP). Vastgelegd als aparte security-issue #849 met bewijs en een voorgestelde repo-gestuurde route (`.htaccess` via de deploy). Twee ZAP-meldingen zijn getrieerd als niet-echt: 10027 (vals-positief uit de geminificeerde `main.dart.js`) en 10015 (Apache-standaard cache-header). ## Bewaker Ontwikkelgereedschap: raakt bestandsformaat, opslag, afhankelijkheden noch een publieke belofte. De enige uitgaande actie is een passieve scan van onze eigen host, ná een deploy die de gebruiker zelf start. Geen bewaker-weging nodig.
ci(dast): draai ZAP adviserend na elke webdeploy tegen de live host
All checks were successful
scans / scans (pull_request) Successful in 3m19s
7258e497e6
`make dast` bestond al maar was nergens ingehaakt. De scan is alleen iets
waard tegen een echte host — een lokale wegwerpserver antwoordt met zijn
eigen headers, niet die van de bundel. deploy_web.sh roept ZAP daarom als
laatste stap aan met DAST_URL op de zojuist gezette site.

Nadrukkelijk adviserend: de wissel is dan al gebeurd en geverifieerd, dus
een waarschuwing draait een deploy nooit terug. Zonder container-runtime
(typisch in CI) slaat de stap zichzelf over; handmatig overslaan met
OCIDECK_DEPLOY_SKIP_DAST=1. Blijft bewust buiten check/check-full.

De eerste live-run vond meteen iets echts (#849): de Apache-host stuurt
geen enkele beveiligingsheader.

Makefile-commentaar en docs/CHECKS.md meegewijzigd.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit e6c7adaae4 into main 2026-07-25 09:54:33 +00:00
Sign in to join this conversation.
No description provided.