Skip to content

fix(podman): pasta als default-netwerkmodus zodat Testcontainers werkt (#44, lost #82 op) - #88

Closed
ericwout-overheid wants to merge 2 commits into
feat/sandbox-hardeningfrom
feat/podman-pasta-default
Closed

fix(podman): pasta als default-netwerkmodus zodat Testcontainers werkt (#44, lost #82 op)#88
ericwout-overheid wants to merge 2 commits into
feat/sandbox-hardeningfrom
feat/podman-pasta-default

Conversation

@ericwout-overheid

Copy link
Copy Markdown
Collaborator

Lost #82 op voor de praktische use-case. Stapelt op de hardening-branch.

Probleem

Op een gehardende host faalde elke Testcontainers-run met een netavark-bridge:

netavark: failed to set autoconf sysctl: Sysctl error: IO Error: Permission denied (os error 13)

Diagnose (host-verificatie, zie #82): niet de hardening (geen AppArmor-DENIED, EACCES ≠ seccomp-EPERM, faalt in single- én multi-uid). De echte oorzaak is netns-ownership: voor een bridge zet podman een IPv6-autoconf-sysctl op een interface in de outer container-netns, die door init_user_ns wordt geowned (geen userns-remap), dus rootless podman mag er /proc/sys/net niet schrijven. Bevestigd met podman unshare … echo > /proc/sys/net/ipv6/…/autoconf → Permission denied.

Fix

De entrypoint zet netns = "pasta" in containers.conf. Pasta geeft elke container een eigen netwerk met port-forwarding naar localhost en vermijdt de bridge volledig. De default geldt ook voor containers die Testcontainers via de podman-Docker-API start, dus geen testcode hoeft aangepast.

Bestaande claude-home-volumes hebben al een containers.conf zonder netns; de entrypoint voegt de regel idempotent bij (zonder een handmatig aangepaste config te overschrijven).

Op een echte host bevestigd

== 4. Maven + Testcontainers ==
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
== OK — Testcontainers werkt (incl. Postgres) ==

Gehardende Tuxedo, multi-uid: SmokeTest (alpine) én PostgresSmokeTest (postgres:16-alpine met published port) beide groen.

Beperking

Container-naar-container over netwerknamen (Testcontainers Network, meerdere containers die elkáár bereiken) werkt niet met pasta — elke container is geïsoleerd met alleen port-forwarding naar de host. Dat vereist userns-remap op de outer container, wat als aparte spike op #82 blijft staan. Voor het gros (DB, wiremock, Redis via published port) volstaat pasta.

🤖 Generated with Claude Code

#44)

netavark faalde in nested rootless podman met "failed to set autoconf sysctl:
Permission denied": voor een bridge zet het een IPv6-sysctl op een interface
in de outer container-netns, die door init_user_ns geowned wordt (geen
userns-remap), dus rootless podman mag er /proc/sys/net niet schrijven. Dit
blokkeerde alle Testcontainers-runs op een gehardende host.

De entrypoint zet nu netns="pasta" in containers.conf. Pasta geeft elke
container een eigen netwerk met port-forwarding naar localhost en vermijdt de
bridge. Op een echte host bevestigd: smoke-test groen incl. PostgresSmokeTest
(multi-uid). Geen testcode aangepast — de netns-default geldt ook voor
containers die via de podman-Docker-API starten.

Beperking: container-naar-container over netwerknamen (Testcontainers Network)
werkt niet zonder userns-remap; dat blijft de userns-remap-spike. Bestaande
volumes krijgen de netns-regel via een idempotente migratie in de entrypoint.

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

Uit de reviewronde op deze PR:
- containers.conf-migratie robuuster: de grep matcht nu ook een ingesprongen
  netns (geen duplicaat-key die podman's TOML-parser breekt), en bij een config
  zonder [containers]-sectie wordt die sectie geappend i.p.v. een sed die stil
  niets doet. Post-check waarschuwt als het toevoegen tóch faalt.
- README-drift rechtgetrokken: twee plekken zeiden nog dat de entrypoint
  containers.conf "alleen aanmaakt als hij ontbreekt"; hij plaatst nu ook de
  netns-regel bij (overige drift blijft staan).
- Openstaand-bullet toegevoegd voor de container-naar-container-beperking, en de
  vage "spike/#44"-verwijzing vervangen door het concrete ticket #82.
- Egress-winst gedocumenteerd: nested pasta-egress loopt via de OUTPUT-chain en
  valt onder de allowlist, waar de bridge via FORWARD die allowlist kon omzeilen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@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