- Beheer per container: de stackkaart klapt uit naar de losse containers, met start/stop/herstart, logs en live CPU-/geheugengebruik per container. De containernaam wordt getoetst aan compose_ps van díé stack, zodat de route geen willekeurige container op de host kan raken. - Stacks met een eigen IP-adres (macvlan/ipvlan): netwerkbeheer onder Instellingen → Netwerken, netwerkkeuze in de installatiemodal met voorstel voor het eerstvolgende vrije adres, en automatische omzetting van het gerenderde compose-bestand (poortmappings eruit, ipv4_address erin). De templates in apps/ blijven ongewijzigd. - Toegekende IP's worden vastgehouden in .serverup.json en getoond op de stackkaart, zodat een volgende installatie ze niet opnieuw uitdeelt. - Vrije poort voorstellen bij installeren: next_free_port() bestond al maar werd nergens gebruikt. Bezette poorten worden in de UI gemeld. - Genereerknop voor velden die op een geheim wijzen (token/password/secret), lokaal gegenereerd via crypto.getRandomValues. - Compose valideren met `docker compose config` vóór het wegschrijven, zowel bij de editor als na het renderen bij installatie. Ontbreekt de compose-CLI, dan blokkeert dat een installatie niet. - Uitloggen in de zijbalk; gebruikersbeheer en wachtwoord wijzigen onder Instellingen → Beveiliging. - docs/netwerken.md (incl. de shim-interface die de host nodig heeft om zijn eigen macvlan-containers te bereiken) en docs/beveiliging.md toegevoegd. - CHANGELOG bijgewerkt; testsuite uitgebreid naar 112 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
4.4 KiB
Beveiliging
Server Up beheert de Docker-daemon. Wie toegang heeft tot de webinterface, kan containers starten met willekeurige volumes — en daarmee in de praktijk alles op de host. Behandel toegang tot Server Up dus als root-toegang tot de server.
Vanaf v0.5.00 is de interface standaard afgeschermd met een login.
Eerste start
Bij de eerste start is er nog geen account. Open de webinterface en maak er meteen een aan: zolang dat niet gebeurd is, kan iedereen die de pagina bereikt het beheerdersaccount claimen. De container laat daarom bij het opstarten een waarschuwing zien.
Standaard bindt docker-compose.yml de poort op 127.0.0.1, dus alleen vanaf de
server zelf bereikbaar. Wil je er van buitenaf bij, zet dan een reverse proxy met
TLS ervoor (zie onder) en pas BIND aan in je .env.
Authenticatiemodi
Instelbaar via PUT /api/auth/mode:
| Modus | Betekenis |
|---|---|
local (standaard) |
Gebruikersnaam + wachtwoord in Server Up zelf |
proxy |
Identiteit komt uit een header van je reverse proxy; geen lokale login meer |
both |
Beide; handig om SSO te testen zonder jezelf buiten te sluiten |
Wachtwoorden worden opgeslagen als scrypt-hash (n=2¹⁴) met een willekeurige salt. Na vijf mislukte pogingen is het account vijf minuten geblokkeerd.
SSO via een reverse proxy
Draai je Authelia, Authentik of Cloudflare Access, dan kan die de identiteit in
een header zetten (meestal Remote-User).
Belangrijk: die header wordt alleen vertrouwd als het bron-IP in
trusted_proxies staat. Zonder die lijst kan iedereen de header zelf meesturen
en zich voordoen als beheerder. Server Up weigert daarom modus proxy/both als
trusted_proxies leeg is.
Zorg er ook voor dat je proxy de header van binnenkomende requests wist en zelf opnieuw zet.
Reverse proxy met TLS
Server Up spreekt gewoon HTTP. Zet er een proxy voor die TLS afhandelt:
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Remote-User ""; # wis wat de client stuurt
}
Zet SU_HTTPS=1 in de omgeving zodra alles via TLS loopt; de sessiecookie krijgt
dan de Secure-vlag.
Wat er beveiligd is
- Sessies —
HttpOnly,SameSite=Strict, 12 uur geldig. - CSRF — elke POST/PUT/DELETE vereist de
X-CSRF-Token-header. Routes die de toestand wijzigen accepteren geen GET meer. - Padvalidatie — stack-, instantie- en repo-namen worden gecontroleerd, zodat
ze nooit buiten
LIBRARY_DIRof de git-cache kunnen wijzen. - Git-URL's — alleen
http(s)://,ssh://engit@host:pad. Git'sext::-transport voert een shell-commando uit en wordt geweigerd. - Templates — boilerplates renderen in een Jinja2-sandbox.
- Geheimen — git-tokens worden nooit teruggegeven door de API (alleen een
has_token-vlag);config.jsonensecret.keystaan op 0600. - Headers — CSP op
'self',X-Frame-Options: DENY,nosniff,Referrer-Policy: no-referrer. Alle front-end libraries worden meegeleverd, dus er gaat op runtime niets naar een CDN. - SSH — host-keys worden geverifieerd (
accept-new, opgeslagen in/data/known_hosts).
Externe repo's en modules
Een module is Python-code die Server Up uitvoert. Voeg alleen repo's toe die je vertrouwt. Twee knoppen om aan te draaien:
-
AUTO_SYNC_ON_BOOTstaat standaard uit. Repo's worden dus niet vanzelf bijgewerkt; je synchroniseert zelf wanneer je dat wilt. -
Zet per repo een
commitin de config om hem op een specifieke commit vast te zetten:{"id": "mijn-apps", "url": "https://…", "branch": "main", "commit": "a1b2c3d"}
Wat níét is afgedekt
- De docker-socket zelf. Server Up heeft volledige toegang tot de daemon; dat is inherent aan wat het doet. Een socket-proxy die alleen bepaalde endpoints toelaat werkt niet, omdat compose vrijwel alles nodig heeft.
- Rechten per gebruiker. Elk account heeft dezelfde volledige toegang; er zijn geen rollen.
- Rate limiting op de API buiten de login-lockout om. Zet er zo nodig een proxy met rate limiting voor.
Een probleem melden
Vind je een beveiligingsprobleem, meld het dan via de repository-issues met zo veel mogelijk details over de reproductie.