{"id":638,"date":"2026-11-12T08:51:28","date_gmt":"2026-11-12T08:51:28","guid":{"rendered":"https:\/\/d-mashina.net\/?p=638"},"modified":"2026-11-12T08:51:28","modified_gmt":"2026-11-12T08:51:28","slug":"systemd-hardening-10-nastavitev-za-varnejse-linux-storitve","status":"publish","type":"post","link":"https:\/\/d-mashina.net\/index.php\/2026\/11\/12\/systemd-hardening-10-nastavitev-za-varnejse-linux-storitve\/","title":{"rendered":"systemd hardening: 10 nastavitev za varnej\u0161e Linux storitve"},"content":{"rendered":"<p><em>Linux stre\u017enik je lahko redno posodobljen, za\u0161\u010diten s po\u017earnim zidom in pravilno konfiguriran, pa ima \u0161e vedno storitve z bistveno ve\u010d pravicami, kot jih dejansko potrebujejo.<\/em><\/p>\n<p>Ko govorimo o varnosti Linux stre\u017enikov, najve\u010dkrat pomislimo na SSH, po\u017earni zid, SELinux, AppArmor, Fail2ban in redne varnostne posodobitve.<\/p>\n<p>Vse to je pomembno. Toda eno od precej uporabnih varnostnih orodij imamo na ve\u010dini sodobnih Linux distribucij \u017ee name\u0161\u010deno, pa ga pogosto premalo izkori\u0161\u010damo.<\/p>\n<p>To je <strong>systemd<\/strong>.<\/p>\n<p>Ve\u010dina administratorjev ga uporablja predvsem za zagon, ustavljanje in nadzor storitev. Vendar systemd omogo\u010da tudi omejevanje dostopa do datote\u010dnega sistema, privilegijev, naprav, omre\u017enih funkcij in nekaterih sistemskih klicev.<\/p>\n<p>S pravilno konfiguracijo lahko precej zmanj\u0161amo \u0161kodo, ki bi jo povzro\u010dila kompromitirana storitev.<\/p>\n<p>Poglejmo deset nastavitev, ki jih je smiselno poznati.<\/p>\n<h2>1. NoNewPrivileges=true<\/h2>\n<p>Ena prvih nastavitev, ki jih je vredno preveriti, je:<\/p>\n<p><code>NoNewPrivileges=true<\/code><\/p>\n<p>Ta prepre\u010duje, da bi proces in njegovi potomci pri izvajanju novih programov pridobili dodatne privilegije, na primer prek mehanizmov setuid ali datote\u010dnih capabilities.<\/p>\n<p>Pomembno je razumeti, da nastavitev ne odvzame privilegijev, ki jih proces \u017ee ima.<\/p>\n<p>\u010ce storitev \u017ee te\u010de kot root, bo \u0161e vedno imela precej\u0161nje pravice.<\/p>\n<p>Zato je nastavitev najbolj uporabna v kombinaciji z izvajanjem storitve pod namenskim neprivilegiranim uporabnikom in dodatnimi omejitvami.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri storitvah, ki morajo legitimno izvajati privilegirane pomo\u017ene programe.<\/p>\n<h2>2. PrivateTmp=true<\/h2>\n<p>Za \u0161tevilne aplikacije je imenik <code>\/tmp<\/code> prostor za za\u010dasne datoteke.<\/p>\n<p>Te\u017eava nastane, \u010de storitev uporablja skupne za\u010dasne imenike, do katerih lahko dostopajo tudi drugi procesi.<\/p>\n<p>Z nastavitvijo:<\/p>\n<p><code>PrivateTmp=true<\/code><\/p>\n<p>storitev dobi svoj zasebni pogled na <code>\/tmp<\/code> in <code>\/var\/tmp<\/code>.<\/p>\n<p>To zmanj\u0161a tveganje za dolo\u010dene napade prek za\u010dasnih datotek in nenamerne konflikte med aplikacijami.<\/p>\n<p><strong>Kdaj previdno?<\/strong> \u010ce si aplikacije med seboj izmenjujejo datoteke prek skupnega <code>\/tmp<\/code>, lahko tak\u0161na omejitev prekine njihovo delovanje.<\/p>\n<h2>3. ProtectSystem=strict<\/h2>\n<p>To je ena zanimivej\u0161ih mo\u017enosti.<\/p>\n<p><code>ProtectSystem=strict<\/code><\/p>\n<p>Za storitev naredi skoraj celotno datote\u010dno hierarhijo samo za branje, z dolo\u010denimi izjemami za sistemske virtualne datote\u010dne sisteme.<\/p>\n<p>Aplikacija tako ne more kar poljubno spreminjati sistemskih konfiguracij in datotek.<\/p>\n<p>Toda kaj, \u010de mora pisati v <code>\/var\/lib\/myapp<\/code>?<\/p>\n<p>Za to obstaja nastavitev:<\/p>\n<p><code>ReadWritePaths=\/var\/lib\/myapp<\/code><\/p>\n<p>Z njo dolo\u010dimo izjemo, ki omogo\u010da pisanje na navedeno pot, \u010de to dopu\u0161\u010dajo tudi obi\u010dajna dovoljenja in na\u010din priklopa datote\u010dnega sistema.<\/p>\n<p>\u0160e bolj\u0161a mo\u017enost za storitve, ki jih sami razvijamo, je pogosto uporaba <code>StateDirectory=<\/code> in <code>RuntimeDirectory=<\/code>.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri podatkovnih bazah, stre\u017eni\u0161kih aplikacijah in drugih storitvah, ki pi\u0161ejo na ve\u010d razli\u010dnih lokacij. Pred uvedbo je treba popisati vse potrebne poti.<\/p>\n<h2>4. ProtectHome=true<\/h2>\n<p>Ali spletna storitev res potrebuje dostop do osebnih imenikov uporabnikov?<\/p>\n<p>V ve\u010dini primerov ne.<\/p>\n<p><code>ProtectHome=true<\/code><\/p>\n<p>Prepre\u010di dostop do vsebine imenikov <code>\/home<\/code>, <code>\/root<\/code> in <code>\/run\/user<\/code> znotraj storitve.<\/p>\n<p>To je \u0161e posebej koristno pri procesih, ki so dosegljivi prek omre\u017eja.<\/p>\n<p>\u010ce pride do kompromitacije aplikacije, je ena od mo\u017enih poti napadalca iskanje uporabni\u0161kih podatkov, konfiguracij in zasebnih klju\u010dev.<\/p>\n<p>Ta nastavitev lahko tak\u0161en dostop omeji.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri storitvah, ki namerno uporabljajo podatke v doma\u010dih imenikih, na primer nekaterih SFTP, backup in uporabni\u0161kih aplikacijah.<\/p>\n<h2>5. PrivateDevices=true<\/h2>\n<p>Linux storitve obi\u010dajno ne potrebujejo neposrednega dostopa do fizi\u010dnih naprav.<\/p>\n<p><code>PrivateDevices=true<\/code><\/p>\n<p>Storitev dobi omejen, zaseben pogled na <code>\/dev<\/code>, z osnovnimi navideznimi napravami, ki jih obi\u010dajne aplikacije potrebujejo.<\/p>\n<p>S tem prepre\u010dimo neposreden dostop do \u0161tevilnih naprav, na primer diskov.<\/p>\n<p>To je pomembno, ker lahko kompromitiran proces z ustreznimi privilegiji in dostopom do naprav povzro\u010di precej ve\u010d \u0161kode kot obi\u010dajna uporabni\u0161ka aplikacija.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri storitvah za upravljanje strojne opreme, diskov, USB naprav, virtualizacije in drugih programih, ki potrebujejo dejanske naprave.<\/p>\n<h2>6. ProtectKernelTunables=true<\/h2>\n<p>Linux jedro omogo\u010da spreminjanje \u0161tevilnih parametrov prek <code>\/proc\/sys<\/code>, <code>\/sys<\/code> in podobnih vmesnikov.<\/p>\n<p>Obi\u010dajna aplikacija teh nastavitev ne bi smela spreminjati.<\/p>\n<p><code>ProtectKernelTunables=true<\/code><\/p>\n<p>Omeji mo\u017enost spreminjanja sistemskih nastavitev jedra znotraj storitve.<\/p>\n<p>To pomaga zmanj\u0161ati tveganje, da bi kompromitirana aplikacija posegala v nastavitve operacijskega sistema.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri namenskih sistemskih storitvah, ki morajo spreminjati parametre jedra.<\/p>\n<h2>7. ProtectKernelModules=true<\/h2>\n<p>Nalaganje modulov Linux jedra je privilegirana operacija.<\/p>\n<p>Ve\u010dina aplikacij tega ne potrebuje.<\/p>\n<p><code>ProtectKernelModules=true<\/code><\/p>\n<p>Prepre\u010duje, da bi proces neposredno nalagal ali odstranjeval module jedra, in odstrani ustrezno capability iz dovoljenega nabora.<\/p>\n<p>To ne pomeni, da jedro v nobenem primeru ne more samodejno nalo\u017eiti modula zaradi drugih sistemskih dogodkov.<\/p>\n<p>Pomeni pa, da ima sama storitev eno nevarno mo\u017enost manj.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri storitvah za upravljanje modulov, virtualizacije in namenske strojne opreme.<\/p>\n<h2>8. ProtectControlGroups=true<\/h2>\n<p>Linux uporablja cgroups za upravljanje in omejevanje procesov ter sistemskih virov.<\/p>\n<p>S pomo\u010djo:<\/p>\n<p><code>ProtectControlGroups=true<\/code><\/p>\n<p>storitev ne more poljubno spreminjati hierarhije kontrolnih skupin prek obi\u010dajnih vmesnikov cgroup.<\/p>\n<p>Pri ve\u010dini obi\u010dajnih spletnih in aplikacijskih storitev za to ni potrebe.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri upravljalnikih kontejnerjev in drugih storitvah, ki morajo same ustvarjati ali upravljati cgroups.<\/p>\n<h2>9. CapabilityBoundingSet=<\/h2>\n<p>Linux capabilities omogo\u010dajo razdelitev tradicionalnih privilegijev uporabnika root na manj\u0161e sklope.<\/p>\n<p>Namesto da procesu dovolimo vse, mu lahko omejimo nabor zmogljivosti.<\/p>\n<p>Na primer:<\/p>\n<p><code>CapabilityBoundingSet=<\/code><\/p>\n<p>Prazna vrednost odstrani vse capabilities iz dovoljenega nabora storitve.<\/p>\n<p>To je lahko odli\u010dna izbira za preprosto aplikacijo, ki te\u010de kot navaden uporabnik in ne potrebuje privilegiranih operacij.<\/p>\n<p>\u010ce potrebuje dolo\u010deno capability, lahko dovolimo samo tisto, ki je res potrebna.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri procesih, ki potrebujejo privilegirana omre\u017ena vrata, dolo\u010dene sistemske operacije ali upravljanje drugih procesov.<\/p>\n<p>Pri uporabi te nastavitve moramo razumeti tudi razliko med <code>CapabilityBoundingSet=<\/code> in <code>AmbientCapabilities=<\/code>.<\/p>\n<h2>10. SystemCallFilter=<\/h2>\n<p>Linux programi komunicirajo z jedrom prek sistemskih klicev.<\/p>\n<p>Nekateri klici so namenjeni zelo specifi\u010dnim opravilom, ki jih obi\u010dajna storitev ne potrebuje.<\/p>\n<p>systemd omogo\u010da filtriranje sistemskih klicev s pomo\u010djo seccomp.<\/p>\n<p>Primer:<\/p>\n<p><code>SystemCallFilter=@system-service<\/code><\/p>\n<p>Ta skupina vklju\u010duje sistemske klice, obi\u010dajno potrebne za \u0161tevilne sistemske storitve.<\/p>\n<p>S tem lahko omejimo dostop do drugih funkcionalnosti jedra.<\/p>\n<p>Vendar skupina ni univerzalna re\u0161itev. Nekateri jeziki, izvajalna okolja in aplikacije potrebujejo dodatne sistemske klice.<\/p>\n<p><strong>Kdaj previdno?<\/strong> Pri Javi, dolo\u010denih runtime okoljih, aplikacijah s kompleksnim upravljanjem pomnilnika ter programih, ki uporabljajo posebne sistemske funkcije.<\/p>\n<p>Filtre je treba preizkusiti tudi med dejanskimi opravili aplikacije, ne le ob njenem zagonu.<\/p>\n<div>\n<hr \/>\n<\/div>\n<h2>Kako vse skupaj uporabimo v praksi?<\/h2>\n<p>Najbolje je za\u010deti pri eni manj kriti\u010dni storitvi.<\/p>\n<p>Recimo, da imamo lastno aplikacijo <code>myapp.service<\/code>, ki te\u010de kot uporabnik <code>myapp<\/code> in svoje podatke shranjuje v <code>\/var\/lib\/myapp<\/code>.<\/p>\n<p>V systemd ustvarimo dodatno konfiguracijo, imenovano <em>drop-in override<\/em>:<\/p>\n<p><code>sudo systemctl edit myapp.service<\/code><\/p>\n<p>Vnesemo nastavitve, prilagojene dejanskim potrebam aplikacije.<\/p>\n<p>Pomembno: vseh deset omejitev ne smemo na slepo uporabiti za vsako storitev. Konfiguracija, ki je primerna za preprosto spletno aplikacijo, lahko povsem onemogo\u010di Docker, sistem za varnostne kopije ali podatkovno bazo.<\/p>\n<p>Ko shranimo konfiguracijo, preverimo njeno veljavnost, ponovno za\u017eenemo storitev in pregledamo dnevnike.<\/p>\n<p>Spremembe, ki vplivajo na omre\u017eje, zapisovanje datotek ali sistemske klice, lahko povzro\u010dijo te\u017eave \u0161ele pri dolo\u010denih opravilih.<\/p>\n<p>Zato samo uspe\u0161en zagon storitve \u0161e ni dokaz, da vse deluje.<\/p>\n<h2>Kako preverimo varnost storitve?<\/h2>\n<p>systemd ima uporabno vgrajeno orodje:<\/p>\n<p><code>sudo systemd-analyze security myapp.service<\/code><\/p>\n<p>Izpi\u0161e seznam varnostnih nastavitev in oceno izpostavljenosti.<\/p>\n<p>Ni\u017eja ocena praviloma pomeni stro\u017eje omejitve systemd.<\/p>\n<p>Pomembno pa je, da ta ocena ni celovita varnostna revizija.<\/p>\n<p>Ne preverja vseh ranljivosti programske opreme, aplikacijske avtentikacije, pravil po\u017earnega zidu in drugih zunanjih varnostnih mehanizmov.<\/p>\n<p>Storitev z nizko oceno ima lahko \u0161e vedno kriti\u010dno ranljivost. Storitev z visoko oceno pa ni nujno ranljiva.<\/p>\n<p>Ocena je zato predvsem pomo\u010d pri prepoznavanju mo\u017enosti za dodatno utrjevanje.<\/p>\n<h2>Zakaj ne bi preprosto vsega omogo\u010dili?<\/h2>\n<p>Ker varnost ni tekmovanje v \u0161tevilu omogo\u010denih nastavitev.<\/p>\n<p>\u010ce storitvi odvzamemo nekaj, kar dejansko potrebuje, smo lahko povzro\u010dili izpad.<\/p>\n<p>Pri produkcijskih Linux stre\u017enikih zato priporo\u010dam postopno uvajanje.<\/p>\n<p>Najprej pregled obstoje\u010de konfiguracije, nato ena ali nekaj omejitev, funkcionalni preizkusi in \u0161ele potem nadaljnje utrjevanje.<\/p>\n<p>\u0160e posebej previdni moramo biti pri storitvah, kot so Docker, Podman, NFS, podatkovne baze, sistemi za varnostne kopije in programska oprema za virtualizacijo.<\/p>\n<p>Te pogosto potrebujejo bistveno \u0161ir\u0161i dostop do jedra, naprav ali datote\u010dnega sistema.<\/p>\n<h2>Zaklju\u010dek<\/h2>\n<p>Varnost Linux stre\u017enika ni odvisna samo od tega, ali imamo name\u0161\u010dene zadnje posodobitve in pravilno nastavljen po\u017earni zid.<\/p>\n<p>Pomembno je tudi, kaj lahko posamezna storitev dejansko po\u010dne.<\/p>\n<p>\u010ce spletni aplikaciji ni treba dostopati do doma\u010dih imenikov uporabnikov, ji tega ni treba dovoliti.<\/p>\n<p>\u010ce proces ne potrebuje dostopa do fizi\u010dnih naprav, ga lahko omejimo.<\/p>\n<p>In \u010de aplikacija ne potrebuje privilegiranih operacij, ni razloga, da ji pustimo nepotrebne capabilities.<\/p>\n<p><strong>Najbolj\u0161a varnostna nastavitev ni tista, ki omogo\u010di najve\u010d omejitev, ampak tista, ki storitvi dovoli natanko toliko, kolikor potrebuje za svoje delo.<\/strong><\/p>\n<p>systemd nam za tak\u0161no na\u010delo najmanj\u0161ih privilegijev ponuja zelo uporabna orodja.<\/p>\n<p>Le uporabiti jih moramo.<\/p>\n<p><em>Ste \u017ee uporabili systemd sandboxing na svojih produkcijskih Linux stre\u017enikih? Katere nastavitve so vam povzro\u010dile najve\u010d te\u017eav?<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Linux stre\u017enik je lahko redno posodobljen, za\u0161\u010diten s po\u017earnim zidom in pravilno konfiguriran, pa ima \u0161e vedno storitve z bistveno ve\u010d pravicami, kot jih dejansko potrebujejo. Ko govorimo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":639,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,153,113],"tags":[156,155,159,157,154,158],"class_list":["post-638","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-systemd","category-varnost","tag-debian","tag-linux-hardening","tag-linux-security","tag-oracle-linux","tag-systemd","tag-systemd-sandboxing"],"_links":{"self":[{"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/posts\/638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/comments?post=638"}],"version-history":[{"count":1,"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/posts\/638\/revisions"}],"predecessor-version":[{"id":640,"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/posts\/638\/revisions\/640"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/media\/639"}],"wp:attachment":[{"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/media?parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/categories?post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mashina.net\/index.php\/wp-json\/wp\/v2\/tags?post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}