Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
name: Bug report
about: Iets werkt niet zoals verwacht
labels: bug
---

## Wat ging er mis

<!-- Eén of twee zinnen — wat verwachtte je, wat gebeurde er in plaats daarvan. -->

## Reproductie

<!-- Stappen om het probleem te reproduceren. Plak waar mogelijk de exacte commando's. -->

1. ...
2. ...
3. ...

## Omgeving

- **Distro + versie:** <!-- bv. Ubuntu 24.04, AlmaLinux 9.3, Arch (rolling 2026-05-15) -->
- **Versie van workstation-security:** <!-- output van: bash bootstrap.sh --version -->
- **Output van `bash check.sh`:**
```
<!-- plak hier -->
```
- **WSL?** <!-- ja / nee — zo ja, WSL1 of WSL2, met of zonder systemd-opt-in -->

## Output / logs

<!-- Plak relevante stderr / logfile-fragmenten. Lange output graag binnen <details>. -->

<details>
<summary>volledige output</summary>

```
...
```

</details>

## Wat heb je al geprobeerd

<!-- Optioneel — workarounds, gerelateerde issues, etc. -->
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Documentatie
url: https://github.com/MWest2020/workstation-security#readme
about: README, threat-model en compliance-mapping staan in de repo zelf — kijk daar eerst.
39 changes: 39 additions & 0 deletions .github/ISSUE_TEMPLATE/distro_support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
name: Distro support
about: Verzoek voor support van een distro die nog niet in alma/arch/ubuntu valt
labels: distro-support
---

## Distro

- **Naam + versie:** <!-- bv. openSUSE Tumbleweed, Void Linux, NixOS 25.05 -->
- **Package-manager:** <!-- zypper / xbps / nix / ... -->
- **`/etc/os-release` inhoud (relevante delen):**
```
ID=...
ID_LIKE=...
```

## Waarom deze distro

<!-- Eén of twee zinnen — gebruik je 'm zelf? Welk publiek zou er baat bij hebben? -->

## Bestaande oplossingen

<!-- Bestaat er een AV/rkhunter-package via de native pkg-manager? Wat is de daemon-naam? -->

- ClamAV-package: <!-- bv. zypper install clamav -->
- ClamAV-daemon-service: <!-- bv. clamd.service -->
- rkhunter-package: <!-- bv. niet beschikbaar / handmatige tarball / AUR -->

## Bereidheid tot testen

<!-- Belangrijke vraag — distro-PRs landen alleen als ze door iemand met die distro getest blijven worden. -->

- [ ] Ik gebruik deze distro zelf en kan PRs reviewen / testen.
- [ ] Ik heb een test-VM / container met deze distro en kan ad-hoc testen.
- [ ] Ik wil alleen het verzoek indienen en hoop dat iemand anders het oppakt.

## Aanvullende context

<!-- Optioneel — quirks van de distro die de installer moet weten (SELinux/AppArmor/non-systemd init/etc.) -->
7 changes: 6 additions & 1 deletion .github/workflows/shellcheck.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: ShellCheck
name: shellcheck

on: [push, pull_request]

Expand All @@ -11,3 +11,8 @@ jobs:
uses: ludeeus/action-shellcheck@2.0.0
with:
scandir: '.'
# Match local pre-commit config (.pre-commit-config.yaml line 30):
# severity=warning. Filters SC1091 (un-followable source notes) en
# SC2016 (literal-$HOME in user-facing strings — bewust) die op
# default-style-niveau noise zijn.
severity: warning
64 changes: 64 additions & 0 deletions .github/workflows/smoke.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# SPDX-License-Identifier: EUPL-1.2
#
# Smoke tests — draait bootstrap.sh --dry-run en check.sh in een container voor
# elk van de ondersteunde distrofamilies. Geen side effects op de runner;
# de container is ephemeral.
#
# Docker images: officiële Docker Hub images, rolling tag (zie design.md D4).
# Pin alleen als CI breekt door upstream-wijziging (zie smoke-tests spec, scenario
# "Rolling-image pinning bij upstream-breuk").

name: smoke

on:
push:
branches: [main]
pull_request:

jobs:
smoke:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- distro: alma9
image: almalinux:9
- distro: ubuntu2404
image: ubuntu:24.04
- distro: archlatest
image: archlinux:latest

name: smoke (${{ matrix.distro }})
steps:
- name: Checkout
uses: actions/checkout@v4

- name: bootstrap.sh --dry-run + check.sh in ${{ matrix.image }}
run: |
docker run --rm \
-v "${{ github.workspace }}:/repo:ro" \
-w /repo \
"${{ matrix.image }}" \
bash -c '
set -e
echo "=== bootstrap.sh --version ==="
bash bootstrap.sh --version
echo
echo "=== bootstrap.sh --dry-run ==="
bash bootstrap.sh --dry-run
echo
echo "=== check.sh (read-only audit) ==="
# check.sh exit-code = aantal problemen (capped op 2).
# In een schone container met geen ClamAV install verwachten we
# warnings — toegestaan tot exit 2. Boven 2 betekent: check.sh
# zelf is stuk, niet de baseline-toestand.
bash check.sh || rc=$?
if [[ "${rc:-0}" -gt 2 ]]; then
echo "check.sh exit=${rc} > 2 — script-fout, niet alleen warnings" >&2
exit "${rc}"
fi
echo
echo "=== install-pm-cooldown.sh --dry-run ==="
bash common/install-pm-cooldown.sh --dry-run
'
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ incident-token-revoke.env
*_rsa
*.crt

# IDE
# IDE / AI-tooling
.vscode/
.idea/
.claude/
*.swp
*.swo
*~
Expand Down
24 changes: 23 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,28 @@
# Changelog

## 2026-05-18 (avond) — Docs + review-fixes
## Unreleased — v1.0.0-release-readiness (A2 + C1-C6)

OpenSpec change: [`openspec/changes/v1-release-readiness/`](openspec/changes/v1-release-readiness/). Bundelt zeven kleine clusters richting v1.0.0-tag. PRs landen per cluster; tag wordt pas geplaatst als alles gemerged en CI groen is.

### Toegevoegd
- `VERSION`-file (top-level, semver `0.9.0`) als single source of truth voor versie. Helper `ws_version()` in `common/lib.sh` leest deze at-runtime; fallback `unknown` als de file ontbreekt (een script dat los gedownload werd faalt niet).
- `--version` / `-V` flag op alle user-facing entrypoints: `bootstrap.sh`, `check.sh`, en elke `common/*.sh` met CLI (`install-pm-cooldown.sh`, `install-shell-tools.sh`, `incident-token-revoke.sh`, `scan.sh`, `rkhunter-check.sh`, `update.sh`, `uninstall.sh`). Werkt zonder sudo. Helper `ws_handle_version()` in `lib.sh` voor de scripts die lib.sh source'n; `incident-token-revoke.sh` houdt zijn self-contained inline-variant.
- `--dry-run` flag op alle installers: `bootstrap.sh`, `alma/install.sh`, `arch/install.sh`, `ubuntu/install.sh`, `common/install-timers.sh`, `common/install-pm-cooldown.sh`. Geen side effects in dry-run; output copy-paste-baar naar een echte run. Flag propageert via `WS_DRY_RUN=1` env-var zodat dispatch-ketens 'm doorgeven (zie [`openspec/changes/v1-release-readiness/design.md`](openspec/changes/v1-release-readiness/design.md) D2). Helpers `ws_is_dry_run()` en `ws_run_or_print()` in `lib.sh`.
- `docs/supply-chain-cooldown.md` — staat-op-zichzelf-doc voor laag 2: aanleiding (npm-incident 2026-05-11), mechanisme per package-manager met versie-vereisten, per-workstation vs per-project vs CI-scope-gap, override-flow voor urgente CVEs. README-sectie 2 verkort tot 3-4 zinnen + link.
- `LICENSE` — volledige EUPL-1.2-tekst (van SPDX license-list-data, canoniek). Consistent met bestaande SPDX-headers per script.
- `CONTRIBUTING.md` — project-status, "voor een goede PR", "welke PRs landen makkelijk/lastig", OpenSpec-workflow.
- `.github/ISSUE_TEMPLATE/` — bug_report.md, distro_support.md, config.yml (`blank_issues_enabled: false`, met link naar README).
- `.github/workflows/smoke.yml` — GitHub Actions smoke-test matrix (alma9, ubuntu2404, archlatest via officiële Docker Hub images). Draait `bootstrap.sh --version`, `bootstrap.sh --dry-run`, `check.sh`, en `install-pm-cooldown.sh --dry-run` op elke push/PR. Geen side effects op de runner.
- OpenSpec scaffolding (`openspec/` directory) met de v1-release-readiness change (proposal, tasks, design, drie spec-deltas).

### Gewijzigd
- `README.md` — herstructureerd: badges bovenaan (smoke, license, shellcheck), doelgroep/scope gepromoveerd vóór de drie verdedigingslagen, elke laag eigen H2 met "wat", "voor wie", "snelle start", clone-URL gecorrigeerd naar `MWest2020/`, expliciete `## License`-sectie onderaan met EUPL-1.2-motivatie (digitale soevereiniteit, NLnet-context).
- `bootstrap.sh` — source't `common/lib.sh` voor versioning/dry-run helpers, root-check overgeslagen in dry-run-modus (CI-bruikbaar zonder sudo).
- `common/install-base.sh` — `require_root`, `freshclam_safe`, `rkhunter_init`, `enable_clamav_services` zijn nu dry-run-aware (printen wat ze zouden doen).
- `common/install-timers.sh` — `ws_write_unit` wrapper rond elke `cat >file <<HEREDOC`; in dry-run print de unit-inhoud naar stdout in plaats van naar `/etc/systemd/system/`. Drift-smoke-test wordt overgeslagen in dry-run (zou false-failen).
- `common/install-pm-cooldown.sh` — `--dry-run` print de zou-toegepast-zijn upserts plus huidige staat ter referentie, raakt `~/.npmrc` en `~/.bunfig.toml` niet aan.
- `common/incident-token-revoke.sh` — `SCRIPT_VERSION` leest nu uit het top-level `VERSION`-bestand (met `unknown`-fallback), in plaats van een hard-coded constant. Blijft self-contained (geen lib.sh-source).
- `docs/README.md` — index-tabel uitgebreid met `supply-chain-cooldown.md`.

### Toegevoegd
- `docs/` directory met aanvullende documentatie naast hoofd-README. Drie files: `README.md` (index, hoe te gebruiken per audience), `compliance.md` (mapping van workstation-security componenten op control-IDs in vier frameworks: ISO 27001:2022 Annex A, SOC 2 Trust Services Criteria 2017 CC6/CC7/CC8/CC9, NEN 7510-2:2017, en BIO V1.04), en `threat-model.md` (in-scope/out-of-scope met expliciete reasoning en operating assumptions). Aanleiding: audit-evidence wordt sterker wanneer een auditor naar `docs/compliance.md#A.8.7` kan navigeren in plaats van scripts te moeten lezen. Eerste pass — control-mapping is geverifieerd tegen framework-hoofdsecties maar niet woord-voor-woord tegen de letterlijke control-tekst. Voor audit-ready scope: trim de doc tot de frameworks die voor die specifieke audit in scope zijn en valideer dáár woord-voor-woord.
Expand Down
50 changes: 50 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Contributing

workstation-security is een persoonlijk onderhouden project. Bijdragen zijn welkom, maar er is geen response-tijd-garantie en niet elke PR landt.

## Voor een goede PR

1. Test op je eigen distro (en idealiter één andere — dry-run via `bash bootstrap.sh --dry-run` werkt op elke distro zonder side effects).
2. `bash common/check-shell-headers.sh --all .` moet exit 0 geven.
3. `shellcheck -x` over je wijziging clean.
4. `CHANGELOG.md`-entry in de juiste sectie (`## Unreleased` → relevante categorie).
5. Hou de PR klein — één feature/fix per PR. Bundle alleen wanneer onlosmakelijk verbonden (zie OpenSpec changes onder `openspec/changes/` voor hoe gebundelde scope er uit ziet).

## Welke PRs landen makkelijk

- Bug-fixes met reproductie-stappen (gebruik [bug report-template](.github/ISSUE_TEMPLATE/bug_report.md)).
- Nieuwe distro-support (gebruik [distro support-template](.github/ISSUE_TEMPLATE/distro_support.md) om eerst overeenstemming te bereiken).
- Doc-verbeteringen.
- Tests, smoke-test-uitbreidingen, CI-hardening.

## Welke PRs landen lastig

- Scope-uitbreiding richting centrale EDR / log-aggregatie / fleet management. Dit project blijft expliciet workstation-only — zie [`docs/threat-model.md`](docs/threat-model.md) → "Out of scope".
- Wijzigingen die nieuwe runtime-dependencies introduceren zonder concrete bug/feature-justification.
- Refactors zonder een concreet probleem dat ze oplossen.
- Wijzigingen die de drie verdedigingslagen door-elkaar-husselen of moeilijker apart te begrijpen maken — elk van AV/cooldown/IR moet standalone uitlegbaar blijven.

## Stijl

- Shell: Google Shell Style + repo-conventies (zie `common/check-shell-headers.sh` voor wat er afgedwongen wordt).
- Shebang: `#!/usr/bin/env bash` (macOS-portable).
- SPDX-header: `# SPDX-License-Identifier: EUPL-1.2` in eerste 5 regels.
- `# role:` marker: `entrypoint`, `library`, `container-entrypoint`, `installer`, of `tool`.
- `set -euo pipefail` voor `entrypoint` / `installer` (libraries laten de caller bepalen).
- Comments: leg de *waarom* uit, niet de *wat*. Audit-relevante keuzes verdienen een paragraaf.
- Nederlandse tekst in user-facing output mag — consistent met de bestaande baseline.

## Spec-driven changes (OpenSpec)

Voor niet-triviale wijzigingen werken we via OpenSpec changes in `openspec/changes/<change-name>/`. Een change bevat:

- `proposal.md` — Why / What / Capabilities / Impact.
- `tasks.md` — concrete checkboxes per cluster.
- `specs/<capability>/spec.md` — requirements met scenarios.
- `design.md` — alleen wanneer een ontwerpkeuze niet vanzelfsprekend is en gedocumenteerd moet kunnen worden voor een latere lezer / auditor.

Validatie: `openspec validate <change-name> --strict` moet groen zijn voordat de change archived wordt. De [OpenSpec CLI](https://github.com/Fission-AI/OpenSpec) installeer je via `npm i -g @fission-ai/openspec`.

## License

Door een PR in te dienen ga je akkoord dat je bijdrage onder dezelfde [EUPL-1.2](LICENSE) wordt vrijgegeven die de rest van het project gebruikt. Geen CLA, geen overdracht van rechten — je behoudt copyright op je bijdrage en licentieert hem onder EUPL-1.2.
Loading
Loading