systemd-enhetsbygger
Lag tryggere tjenesteenheter[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
Innledning
systemd-enhetsbyggeren genererer en tjenesteenhet (en .service-fil) med herdingsalternativer som er lette å glemme: en ikke-root-bruker, NoNewPrivileges, PrivateTmp, ProtectSystem=strict og ProtectHome.
systemd lar deg beskrive hva en tjeneste kan røre. Den genererte enheten er et forsvarlig utgangspunkt for en bakgrunnsarbeider, en agent eller enhver langvarig prosess.
Mål
- Generer en syntaktisk korrekt .service-enhet fra navn, kommando, bruker og arbeidskatalog.
- Bruk grunnleggende herding: dedikert bruker, omstart ved feil, ingen nye privilegier, privat /tmp og skrivebeskyttede systembaner.
- Hold enheten lesbar slik at en administrator kan justere den før distribusjon.
Inndata
- Beskrivelse (fritekst).
- ExecStart — den absolutte banen til den kjørbare filen.
- Tjenestebruker — kontoen uten privilegier som tjenesten kjører som.
- Arbeidskatalog (valgfritt).
Slik fungerer det
Verktøyet setter sammen tre seksjoner. [Unit] erklærer beskrivelsen og ordner tjenesten etter network-online.target. [Service] setter Type=simple, brukeren og arbeidskatalogen, ExecStart og Restart=on-failure med 5 sekunders forsinkelse.
Deretter følger herdingsdirektivene: NoNewPrivileges=true blokkerer å skaffe nye privilegier gjennom setuid-binærfiler; PrivateTmp=true gir tjenesten sin egen /tmp; ProtectSystem=strict gjør hele filsystemet skrivebeskyttet bortsett fra eksplisitt tillatte baner; ProtectHome=true skjuler /home, /root og /run/user.
[Install] erklærer WantedBy=multi-user.target slik at enheten kan aktiveres med systemctl enable.
Testbart eksempel
Prøv det — analysen kjører lokalt i nettleseren din.
Eksempel
Beskrivelse: Otho worker ExecStart: /opt/otho/bin/worker Bruker: otho Katalog: /opt/otho
Forventet utdata
[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
Les utdataene
- Lagre utdataene som /etc/systemd/system/<navn>.service, kjør sudo systemctl daemon-reload, deretter sudo systemctl start <navn>.
- Hvis tjenesten må skrive til systembaner, vil ProtectSystem=strict blokkere det — legg til ReadWritePaths eller flytt skrivbare data til arbeidskatalogen.
- Enheten er en mal: juster TimeoutStartSec, ressursgrenser (MemoryMax, CPUQuota) og capabilities (CapabilityBoundingSet) etter arbeidsmengden.
Risikoer
- Å kjøre en tjeneste som root med nettverkstilgang er den høyeste risikostandarden; den genererte enheten unngår det, men sjekk at ExecStart-binærfilen din eies av root.
- ProtectSystem=strict kan bryte tjenester som skriver utenfor arbeidskatalogen — test før produksjon.
- Restart=on-failure beskytter ikke mot krasj som avsluttes med exitkode 0; vurder Restart=always for kritiske arbeidere.
Begrensninger
- Verktøyet genererer filen; det kan ikke teste at den kjørbare filen din starter eller at tillatelsene er riktige.
- Det genererer ikke socket-aktivering, timere eller komplekse avhengighetsgrafer.
- Harding er en grunnlinje — en reell gjennomgang bør vurdere capabilities, seccomp og nettverksnavnerom.
Offisielle referanser
FAQ
Hvorfor en dedikert bruker for hver tjeneste?
En dedikert bruker uten privilegier begrenser hva en kompromittert tjeneste kan gjøre: den kan ikke lese andre brukeres filer eller skrive utenfor egne baner. Root bør reserveres for de få tjenestene som virkelig trenger det.
Hva gjør NoNewPrivileges=true?
Det hindrer tjenesten og dens barn i å skaffe privilegier gjennom setuid-binærfiler eller lignende mekanismer, selv om slike binærfiler finnes på systemet.
Hva er ProtectSystem=strict?
Det gjør hele filsystemet skrivebeskyttet for tjenesten, bortsett fra eksplisitt tillatte baner. Det er det sterkeste ProtectSystem-nivået og passer godt med tjenester som bare skriver til arbeidskatalogen eller /tmp.