feat(sandbox): Maven host-agent verwijderen, podman-set op eigen plek (#44) - #80
Merged
ericwout-overheid merged 13 commits intoAug 4, 2026
Merged
Conversation
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
requested review from
loek-rijksoverheid and
mreuvekamp
as code owners
August 3, 2026 09:38
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
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 |
This was referenced Aug 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
mvnuit op de host als de host-user, metpom.xml/mvnwuit de gedeeldeprojects-map die de sandbox kan schrijven. Op Linux bond hij bovendien auth-loos op0.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.
Wat er weg is
claude-sandbox/host-agents/maven/(maven_agent.py,run.sh,requirements.in,requirements.txt) enclaude-sandbox/docs/maven-mcp-agent.md. Samen −909 regels.host.docker.internal-route (compose.override.linux.yml.example, hetextra_hosts-comment incompose.yml, de OUTPUT-ACCEPT-regel ininit-firewall.sh). Die bestond puur om de agent op poort 7777 te bereiken; zonder consument was het een uitzondering in een default-DROP allowlist. DeHOST_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 independabot.yml.Waar de podman-set nu staat
git mvvanhost-agents/maven/podman/naarclaude-sandbox/podman/— een eigen top-level map naast deDockerfileen decompose.override.podman-*.yml-bestanden.claude-sandbox/podman/README.mdis 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, rootlesspodman 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 inclaude-sandbox/podman/README.md.Reviewrondes
Twee rondes met
nerds-opensource,nerds-cloud,nerds-veiligheid,don-leidraadendigital-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=warningop de eigen scripts (init-firewall.sh,entrypoint.sh,podman/setup-host.sh,podman/smoke-test.sh) — schoon.host-agents/maven-mcp-agent-verwijzingen buiten de historische 06-10-documenten (die een banner kregen).Nog een handmatige stap (geen docker in de bouwomgeving):
docker compose configop de vier override-combinaties, en de echte smoke-test op een host.🤖 Generated with Claude Code