Skip to content

feat(sandbox): Maven host-agent verwijderen, podman-set op eigen plek (#44) - #80

Merged
ericwout-overheid merged 13 commits into
feat/maven-podman-pocfrom
feat/verwijder-maven-host-bridge
Aug 4, 2026
Merged

feat(sandbox): Maven host-agent verwijderen, podman-set op eigen plek (#44)#80
ericwout-overheid merged 13 commits into
feat/maven-podman-pocfrom
feat/verwijder-maven-host-bridge

Conversation

@ericwout-overheid

Copy link
Copy Markdown
Collaborator

Aanleiding

Podman-in-de-sandbox werkt. Daarmee vervalt de reden om de Maven host-agent te laten staan, en die agent was het grootste resterende risico: hij voerde mvn uit op de host als de host-user, met pom.xml/mvnw uit de gedeelde projects-map die de sandbox kan schrijven. Op Linux bond hij bovendien auth-loos op 0.0.0.0:7777. ADR 0001 beschreef dat als een container→host code-execution-bridge en kondigde aan dat de agent kon vervallen zodra de podman-opzet bevestigd was.

Deze PR is de eerste van twee gestapelde PR's. PR A (deze) verandert geen sandbox-gedrag behalve het opruimen van bridge-infrastructuur. PR B (volgt, base = deze branch) sluit de container-escape die de security-review op #76 vond.

Merge-volgorde: deze stack (#76 → PR A → PR B) is bedoeld om samen naar main te gaan. De ontwerp- en plandocumenten in PR A beschrijven de escape die PR B dicht; merge PR A niet los naar main vooruitlopend op PR B.

Wat er weg is

  • De Maven host-agent: claude-sandbox/host-agents/maven/ (maven_agent.py, run.sh, requirements.in, requirements.txt) en claude-sandbox/docs/maven-mcp-agent.md. Samen −909 regels.
  • De host.docker.internal-route (compose.override.linux.yml.example, het extra_hosts-comment in compose.yml, de OUTPUT-ACCEPT-regel in init-firewall.sh). Die bestond puur om de agent op poort 7777 te bereiken; zonder consument was het een uitzondering in een default-DROP allowlist. De HOST_NETWORK-ACCEPT blijft, dus Docker DNS en IDE-koppelingen binnen het bridge-netwerk werken door.
  • requirements.txt (509 gepinde regels) weg ruimt tegelijk de Dependabot-security-alertstroom op; er was geen pip-entry in dependabot.yml.

Waar de podman-set nu staat

git mv van host-agents/maven/podman/ naar claude-sandbox/podman/ — een eigen top-level map naast de Dockerfile en de compose.override.podman-*.yml-bestanden. claude-sandbox/podman/README.md is de enige plek met bedieningsstappen; de rest verwijst ernaar. ADR 0001 staat op Geaccepteerd met nog één spoor.

Ondersteunde platforms

Bevestigd: gehardend Ubuntu/Tuxedo, Linux Docker (niet-gehardend), Rancher Desktop op macOS, macOS podman machine (rootful, ook multi-uid). Niet ondersteund (niet bevestigd, geen terugvaloptie meer): Docker Desktop op Mac/Windows, rootless podman machine, WSL2. Dat is een bewuste afweging — binnen dit team zijn er geen gebruikers op die platforms; een hergebruiker met wél zulke werkplekken moet de opzet daar eerst bevestigen. Details in claude-sandbox/podman/README.md.

Reviewrondes

Twee rondes met nerds-opensource, nerds-cloud, nerds-veiligheid, don-leidraad en digital-waste-spotter. Ronde 1 leverde ~18 bevindingen op (documentatie, achtergebleven verwijzingen, één feitelijk foute comment over seccomp-padresolutie); alle verwerkt. Ronde 2 bevestigde: geen belangrijke bevindingen meer.

Verificatie

Statisch, in deze omgeving gedraaid:

  • shellcheck --severity=warning op de eigen scripts (init-firewall.sh, entrypoint.sh, podman/setup-host.sh, podman/smoke-test.sh) — schoon.
  • Geen host-agents/maven-mcp-agent-verwijzingen buiten de historische 06-10-documenten (die een banner kregen).
  • Interne markdown-links kloppen.

Nog een handmatige stap (geen docker in de bouwomgeving): docker compose config op de vier override-combinaties, en de echte smoke-test op een host.

🤖 Generated with Claude Code

ericwout-overheid and others added 13 commits August 3, 2026 08:16
Twee gestapelde PR's. PR A verwijdert de Maven host-agent en geeft de
podman-in-sandbox-set een eigen plek onder claude-sandbox/podman/. PR B
sluit de container-escape uit de security-review op #76: root-entrypoint
met privilege-drop in plaats van de NOPASSWD SETENV-sudoers-regel, een
AppArmor-profiel dat daadwerkelijk mediateert, en een ruimere
seccomp-blocklist.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#44)

Zestien taken over twee gestapelde PR's, met per taak een controle die eerst
faalt. Legt onder meer vast dat de omschakeling naar USER root de
gedocumenteerde exec-commando's raakt, en waarom --no-new-privs bewust
ontbreekt bij de privilege-drop.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
De podman-in-sandbox-set stond in de boom van de Maven host-agent, waardoor
wijzigingen aan podman lazen als wijzigingen aan die agent. Verplaatst naar
een eigen top-level map, met de seccomp-paden in beide overrides mee.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
De host-agent draaide mvn op de host als de host-user, met pom.xml en mvnw
uit de projects-map die de sandbox kan schrijven — een container→host
code-execution-bridge. Podman-in-de-sandbox vervangt hem, dus hij kan weg.

Verwijdert ook requirements.txt (509 regels). Dependabot heeft geen
pip-entry in de config, maar security-updates scannen manifests repo-breed;
die alert-stroom vervalt hiermee.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ken (#44)

Alle paden naar de oude host-agents-boom bijgewerkt. De podman-README is nu
de enige plek met bedieningsstappen; de rest verwijst ernaar. Voegt een
expliciete lijst ondersteunde platforms toe, inclusief wat niet bevestigd
is nu er geen terugvaloptie meer is. De per-setup-matrix en de sectie
Openstaand herhaalden die status en verwijzen er nu naar.

De twee 2026-06-10-documenten zijn historisch: daarin zijn alleen paden
bijgewerkt, geen inhoud.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Het ADR was voorwaardelijk geformuleerd: de host-agent zou vervallen zodra
de podman-opzet breed bevestigd was. Dat is gebeurd, dus dit is de afronding
die het document zelf aankondigde.

De sectie "Goedkope hardening host-agent" is weg — die ging volledig over een
component die niet meer bestaat. De security-balans blijft in deze PR staan
zoals hij was; die wordt in de hardening-PR bijgewerkt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Uit de reviewronde op deze PR:
- Dockerfile-comment: "i.p.v. via de host" (route bestaat niet meer) weg, en
  het niet-bestaande compose.override.podman.yml vervangen door de echte
  -linux/-macos-bestanden.
- .gitignore: dode host-agents/**-regels weg.
- De seccomp-paduitleg die ik eerder toevoegde was fout: Compose resolvet een
  relatief pad tegen de projectdirectory (map van het eerste -f-bestand), niet
  tegen de werkdirectory. Rechtgezet in beide overrides én in de README-tabel,
  die het tegenovergestelde beweerde.
- macos-override: het voorbeeldcommando gebruikte `podman compose` (delegeert
  naar docker-compose, seccomp-inline faalt) met een niet-bestaande
  bestandsnaam; nu podman-compose met het juiste pad. ${PWD:?} faalt hard als
  PWD niet gezet is, i.p.v. een pad vanaf filesystem-root te vormen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Deze route — de compose.override.linux.yml.example, het extra_hosts-comment
in compose.yml en de OUTPUT-ACCEPT-regel in init-firewall.sh — bestond
uitsluitend om de container de Maven host-agent op poort 7777 te laten
bereiken. Die agent is verwijderd, dus de route is een uitzondering in een
default-DROP allowlist zonder consument. De firewall-comment noodde bovendien
nog uit tot "MCP-servers op de host".

De HOST_NETWORK-ACCEPT (regel eronder) blijft; die dekt Docker DNS-forwarding
en IDE-koppelingen binnen het bridge-netwerk. Alleen het VM-interne
host.docker.internal-IP buiten dat netwerk (Docker Desktop/Rancher) valt weg.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…rd (#44)

Reviewfixes op ADR 0001 nu het op Geaccepteerd staat:
- "Géén CAP_SYS_ADMIN" klopte niet meer: de multi-uid opt-in uit #76 zet hem
  in de bounding set. Gecorrigeerd, met de nuance dat claude CapEff=0 heeft.
  De volledige herschrijving van de security-balans volgt in de hardening-PR.
- Sectie "Overwogen en verworpen" toegevoegd: de host-agent en de
  Docker-socket-runner, met de reden waarom de host-agent ook geen veiliger
  alternatief is. Die redenering was bij het schrappen van spoor 2 verdwenen.
- "Optie C/D" verwees naar een A/B die uit het document geknipt was; hernoemd
  naar "sysbox/microVM".
- De consequentie voor Windows/WSL2-werkplekken expliciet benoemd en de
  "geen gebruikers"-onderbouwing gekwalificeerd als teamspecifiek.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ntdubbeld (#44)

- README:35-37 raadde aan de projects-map "buiten docker te bouwen, testen of
  opstarten" — dat is de #44-aanval zonder agent: een rogue pom.xml/mvnw/
  Makefile/git-hook draait dan met host-rechten. Met het verwijderen van de
  host-agent verdween ook de tegenmaatregel (die stond in maven-mcp-agent.md
  en de ADR-hardeningsectie), terwijl het risico aan de gedeelde mount hangt.
  Waarschuwing teruggezet op de plek waar de mount beschreven wordt.
- Het macOS-startcommando stond woordelijk op drie plekken en dreef al uiteen
  (mist BUILDAH_FORMAT/--build). De kopieën in README en opstarten-en-afsluiten
  wijzen nu naar podman/README.md i.p.v. een eigen, driftend commando.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… expliciet (#44)

- "Migratie vanaf de host-agent" toegevoegd: git rm stopt geen draaiende
  run.sh (auth-loze listener op 0.0.0.0:7777) of MCP-registratie die in het
  claude-home volume een rebuild overleeft. Drie opruimstappen.
- De status-tabel en de per-setup-matrix somden dezelfde platforms met
  verschillende labels op; samengevoegd tot één tabel Platform | Status | Wat
  je nodig hebt, met de niet-ondersteunde platforms als expliciete rij.
- Eén regel bovenaan "Stappen" dat alles vanuit claude-sandbox/ draait (stap 2
  ging al uit van een cd die pas in stap 3 stond).
- Stap 2 vermeldt nu dat setup-host.sh sudo op de host vereist — op een
  beheerde werkplek zonder admin loop je daar anders vast.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Die twee documenten worden vanuit de compose-overrides, de Dockerfile en de
podman-README aangehaald als ontwerpbron, maar hun statusregel zei nog "in
review" en één regel beschreef de host-agent nog als beschikbare fallback —
in tegenspraak met de README ("geen terugvaloptie meer"). Een banner bovenaan
markeert ze als historisch en de fallback-bijzin is geschrapt. De inhoud
blijft verder bevroren; padverwijzingen als maven_agent.py beschrijven bewust
de toenmalige situatie.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
De build-context is claude-sandbox/, maar de Dockerfile COPY't alleen vendor/,
skills/, init-firewall.sh en entrypoint.sh. Zonder .dockerignore werd bij elke
--build de hele boom ingepakt en naar de daemon gestuurd, inclusief projects/
(de default mountlocatie met gebruikerscheckouts) en podman/sample/target/.
Sluit die uit; de image blijft identiek.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ericwout-overheid
ericwout-overheid marked this pull request as draft August 3, 2026 14:16
Base automatically changed from feat/podman-multiuid-optin to feat/maven-podman-poc August 4, 2026 13:01
@ericwout-overheid
ericwout-overheid merged commit 448b295 into main Aug 4, 2026
3 checks passed
@ericwout-overheid
ericwout-overheid deleted the feat/verwijder-maven-host-bridge branch August 4, 2026 13:01
@ericwout-overheid

Copy link
Copy Markdown
Collaborator Author

Samengevoegd in #46 en daar in één keer te reviewen. De gestapelde opzet zorgde ervoor dat werk dat verderop in de stack weer werd teruggedraaid alsnog gereviewd moest worden; in de samengevoegde diff valt dat weg.

Geverifieerd dat claude-sandbox/ en docs/ in #46 byte-identiek zijn aan de eindtoestand van deze stack — er is geen reviewfix uit deze PR verloren gegaan. De plan- en designdocumenten staan apart in #96.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant