systemd Unit Builder
Maak veiligere service-units[Unit] Description=Otho worker After=network-online.target Wants=network-online.target [Service] Type=simple User=otho WorkingDirectory=/opt/otho ExecStart=/opt/otho/bin/worker Restart=on-failure RestartSec=5s NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true [Install] WantedBy=multi-user.target
Inleiding
De systemd Unit Builder genereert een service-unit (een .service-bestand) met hardeningopties die makkelijk worden vergeten: een niet-rootgebruiker, NoNewPrivileges, PrivateTmp, ProtectSystem=strict en ProtectHome.
systemd laat u beschrijven wat een service mag aanraken. De gegenereerde unit is een verdedigbaar startpunt voor een achtergrondworker, een agent of elk langlopend proces.
Doel
- Genereer een syntactisch correcte .service-unit op basis van naam, opdracht, gebruiker en werkmap.
- Pas basis-hardening toe: toegewijde gebruiker, herstart bij fouten, geen nieuwe privileges, privé /tmp en alleen-lezen systeempaden.
- Houd de unit leesbaar zodat een beheerder hem vóór implementatie kan aanpassen.
Invoerwaarden
- Beschrijving (vrije tekst).
- ExecStart — het absolute pad naar het uitvoerbare bestand.
- Servicegebruiker — het account zonder privileges waaronder de service draait.
- Werkmap (optioneel).
Hoe het werkt
Het hulpmiddel stelt drie secties samen. [Unit] declareert de beschrijving en plaatst de service na network-online.target. [Service] stelt Type=simple, de gebruiker en werkmap, ExecStart en Restart=on-failure met een vertraging van 5 seconden in.
Daarna volgen de hardeningrichtlijnen: NoNewPrivileges=true blokkeert het verkrijgen van nieuwe privileges via setuid-binaire bestanden; PrivateTmp=true geeft de service een eigen /tmp; ProtectSystem=strict maakt het hele bestandssysteem alleen-lezen behalve expliciet toegestane paden; ProtectHome=true verbergt /home, /root en /run/user.
[Install] declareert WantedBy=multi-user.target zodat de unit met systemctl enable kan worden ingeschakeld.
Testbaar voorbeeld
Probeer het — de analyse draait lokaal in uw browser.
Voorbeeld
Beschrijving: Otho worker ExecStart: /opt/otho/bin/worker Gebruiker: otho Map: /opt/otho
Verwachte uitvoer
[Unit] Description=Otho worker After=network-online.target Wants=network-online.target [Service] Type=simple User=otho WorkingDirectory=/opt/otho ExecStart=/opt/otho/bin/worker Restart=on-failure RestartSec=5s NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true [Install] WantedBy=multi-user.target
De uitvoer lezen
- Sla de uitvoer op als /etc/systemd/system/<naam>.service, voer sudo systemctl daemon-reload uit en daarna sudo systemctl start <naam>.
- Als de service naar systeempaden moet schrijven, blokkeert ProtectSystem=strict dat — voeg ReadWritePaths toe of verplaats de beschrijfbare gegevens naar de werkmap.
- De unit is een sjabloon: pas TimeoutStartSec, resourcelimieten (MemoryMax, CPUQuota) en capabilities (CapabilityBoundingSet) aan op de workload.
Risico's
- Een service als root met netwerktoegang is de risicovolste standaard; de gegenereerde unit vermijdt dit, maar controleer dat uw ExecStart-binair bestand eigendom van root is.
- ProtectSystem=strict kan services breken die buiten hun werkmap schrijven — test vóór productie.
- Restart=on-failure beschermt niet tegen crashes die met exitcode 0 eindigen; overweeg Restart=always voor kritieke workers.
Beperkingen
- Het hulpmiddel genereert het bestand; het kan niet testen dat uw uitvoerbare bestand start of dat de machtigingen kloppen.
- Het genereert geen socket-activatie, timers of complexe afhankelijkheidsgrafieken.
- Hardening is een basislijn — een echte beoordeling moet capabilities, seccomp en netwerknamespaces overwegen.
Officiële referenties
FAQ
Waarom een toegewijde gebruiker voor elke service?
Een toegewijde gebruiker zonder privileges beperkt wat een gecompromitteerde service kan doen: hij kan geen bestanden van andere gebruikers lezen of buiten zijn eigen paden schrijven. Root moet worden gereserveerd voor de weinige services die het echt nodig hebben.
Wat doet NoNewPrivileges=true?
Het voorkomt dat de service en zijn kinderen privileges verkrijgen via setuid-binaire bestanden of vergelijkbare mechanismen, zelfs als zulke binaire bestanden op het systeem bestaan.
Wat is ProtectSystem=strict?
Het maakt het hele bestandssysteem alleen-lezen voor de service, behalve expliciet toegestane paden. Het is het sterkste ProtectSystem-niveau en past goed bij services die alleen naar hun werkmap of /tmp schrijven.