setpriv wil per capability een eigen teken
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 16m58s

`+chown,dac_override,fowner` kwam door elke stringtest heen maar werd door
setpriv geweigerd met "bad capability string", waarna de container niet meer
opstartte. Alleen de CI-stap in een echte container zag dit.

- CAPS is nu +chown,+dac_override,+fowner
- de test laat de echte setpriv over de string oordelen in plaats van hem te
  vergelijken met een verwachte tekst; met de oude waarde faalt hij

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
This commit is contained in:
Ramon 2026-08-02 22:29:01 +02:00
parent 94364973ff
commit a7b00fc82b
2 changed files with 32 additions and 3 deletions

View file

@ -99,7 +99,10 @@ fi
#
# Alle drie zitten al in de standaardset van Docker; er komt hier dus geen
# enkel recht bij dat de container niet al had. Wat weggaat is de rest van root.
CAPS="chown,dac_override,fowner"
#
# Elke capability krijgt zijn eigen teken: setpriv leest "+a,b" niet als "+a,+b"
# maar weigert het met "bad capability string".
CAPS="+chown,+dac_override,+fowner"
if ! command -v setpriv >/dev/null 2>&1; then
log "setpriv ontbreekt in dit image; ik draai als root verder."
@ -109,4 +112,4 @@ fi
log "Server Up draait als $GEBRUIKER ($SU_UID:$SU_GID)."
export HOME=/data
exec setpriv --reuid "$SU_UID" --regid "$SU_GID" --init-groups \
--inh-caps "+$CAPS" --ambient-caps "+$CAPS" "$@"
--inh-caps "$CAPS" --ambient-caps "$CAPS" "$@"

View file

@ -147,10 +147,36 @@ def test_afzakken_zet_klaar_en_geeft_de_juiste_rechten(nep_omgeving, tmp_path):
assert "--reuid 1000" in setpriv[0] and "--regid 1000" in setpriv[0]
# Zonder ambient caps verliest het proces bij het afzakken precies de
# rechten die het voor verhuizen en backups nodig heeft.
assert "--ambient-caps +chown,dac_override,fowner" in setpriv[0]
assert "--ambient-caps" in setpriv[0]
assert "chown" in setpriv[0] and "dac_override" in setpriv[0]
assert "echo APP-GESTART" in setpriv[0], "de app wordt niet doorgegeven"
def _caps_uit_het_script() -> str:
for regel in SCRIPT.read_text(encoding="utf-8").splitlines():
if regel.startswith("CAPS="):
return regel.split("=", 1)[1].strip().strip('"')
raise AssertionError("geen CAPS= in het entrypoint")
@pytest.mark.skipif(shutil.which("setpriv") is None,
reason="setpriv niet aanwezig; in het image wél (Dockerfile)")
def test_setpriv_snapt_de_capability_string():
"""De echte setpriv laten oordelen in plaats van de tekst te vergelijken.
`+chown,dac_override` zag er goed uit en kwam door elke stringtest heen,
maar setpriv wil per capability een teken en weigerde het met "bad
capability string" — waarna Server Up niet meer opstartte. Dat is precies
wat een vergelijking op tekst niet ziet en dit wel.
"""
caps = _caps_uit_het_script()
r = subprocess.run([shutil.which("setpriv"), "--inh-caps", caps, "true"],
capture_output=True, text=True, timeout=30)
# Toepassen mag mislukken (dat mag alleen root); de string moet leesbaar zijn.
assert "bad capability string" not in r.stderr, \
f"setpriv weigert '{caps}': elke capability wil zijn eigen + of -"
def test_de_gid_van_de_docker_socket_wordt_overgenomen(nep_omgeving, tmp_path):
"""Die verschilt per host; hardcoderen in compose werkt daarom niet."""
sok = tmp_path / "docker.sock"