diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index c041816..cc57d9b 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -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" "$@" diff --git a/tests/test_entrypoint.py b/tests/test_entrypoint.py index 705f8b4..4e3763e 100644 --- a/tests/test_entrypoint.py +++ b/tests/test_entrypoint.py @@ -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"