Mine sisu juurde

Küpsiste seaded

Vali iga liigi kohta, milliseid küpsiseid lubad. Oma valikut saad alati muuta iga lehe allosas oleva lingi „Küpsiste seaded“ kaudu. Privaatsuspoliitika

Vajalikud

Alati sees

Vajalikud sisselogimiseks, ostukorvi säilitamiseks ja sinu valikute meelespidamiseks. Need on alati sees.

Millised küpsised?
  • weboke_sessie, weboke_klant, weboke_remember: sinu seanss ja sisselogituks jäämine
  • weboke_basket: sinu ostukorv
  • wkBtwIncl: hindade näitamine koos käibemaksuga või ilma
  • wok_cookies: sinu küpsisevalik, 12 kuud

Mõõdab, milline reklaam viib külastuse või tellimuseni, et me ei maksaks reklaamide eest, mis midagi ei anna.

Millised küpsised?
  • Google Ads Google Tag Manageri kaudu (_gcl_au, _gcl_aw), kuni 90 päeva
  • OpenAI Ads, reklaamid ChatGPT-s
  • wok_aff: millise partneri kaudu meie juurde jõudsid (partnerprogramm), 60 päeva

4,6

Riik ja keel

Igal riigil on oma sait, selle riigi hindade ja käibemaksuga.

Vaata

Oma teenused ja taimerid

Moodul 6: Teenused ja logid · Lugemisaeg: 11 minutit

Õpieesmärk: Pärast seda õppetundi oskad käivitada oma programmi systemd-teenusena eraldi kasutaja all koos mõne turvavalikuga ning ajastada ülesandeid systemd-taimeri või croniga.

Põhimõisted: unit-fail, [Unit], [Service], [Install], ExecStart, User=, WorkingDirectory, EnvironmentFile, Restart=, WantedBy, NoNewPrivileges, ProtectSystem, ProtectHome, PrivateTmp, systemd-analyze security, taimer, OnCalendar, Persistent, crontab

Miks mitte lihtsalt "nohup" või "screen"?

Kes paneb serverisse oma programmi (väikese veebirakenduse, boti, skripti, mis igal ööl midagi teeb), käivitab selle esimesel korral sageli käsitsi: node server.js & või screen-seansis. See töötab seni, kuni logid välja, server taaskäivitub või programm jookseb kokku. Siis on see kadunud ja keegi ei märka.

Programm, mis peab alati töötama, peaks olema systemd-teenus. Siis:

  • käivitub see alglaadimisel ise;
  • käivitab systemd selle krahhi korral uuesti;
  • jõuab väljund journalisse (õppetund 6.2);
  • töötab see sinu valitud kasutaja all ja nende õigustega, mida sina lubad.

Oma unit-fail

Oletame, et sul on väike Node.js-rakendus kaustas /opt/factuurapp, mis kuulab aadressil 127.0.0.1:3000. nginx või Caddy avab selle hiljem välismaailmale (moodul 7).

Samm 1: eraldi kasutaja ilma shellita (õppetund 3.2). Rakendus ei pea olema root ega pea sisse logima:

anna@web1:~$ sudo adduser --system --group --home /opt/factuurapp --no-create-home factuurapp
anna@web1:~$ sudo chown -R factuurapp:factuurapp /opt/factuurapp/data

Kood ise võib jääda root'i omandisse (rakendus ei pea ennast muutma); teenuse kasutajale kuulub ainult kaust, kuhu rakendus kirjutab.

Samm 2: unit-fail. Oma unit'id pane kausta /etc/systemd/system/:

# /etc/systemd/system/factuurapp.service
[Unit]
Description=Factuurapp (Node.js)
After=network-online.target
Wants=network-online.target

[Service]
User=factuurapp
Group=factuurapp
WorkingDirectory=/opt/factuurapp
EnvironmentFile=/etc/factuurapp/env
ExecStart=/usr/bin/node /opt/factuurapp/server.js
Restart=on-failure
RestartSec=5s

NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/opt/factuurapp/data

[Install]
WantedBy=multi-user.target

Kolm plokki:

  • [Unit]: kirjeldus ja järjekord. After=network-online.target koos Wants= tagab, et teenus käivitub alles siis, kui võrk on olemas.
  • [Service]: kuidas programm töötab. ExecStart täieliku teega (systemd ei kasuta otsinguteed nagu su shell). User= ja Group= määravad, kelle all see töötab. EnvironmentFile loeb seaded, näiteks andmebaasi parooli, eraldi failist, nii et need ei ole unit'is kirjas.
  • [Install]: mida teeb enable. WantedBy=multi-user.target tähendab: käivitu tavalise alglaadimise ajal.

Samm 3: saladused eraldi ja rangete õigustega.

anna@web1:~$ sudo mkdir /etc/factuurapp
anna@web1:~$ sudo install -m 600 -o root -g root /dev/null /etc/factuurapp/env
anna@web1:~$ sudoedit /etc/factuurapp/env

Sisu näiteks DATABASE_URL=postgres://factuur:...@127.0.0.1/factuur. systemd loeb faili root'ina enne teenuse kasutajale ümberlülitumist, seega piisab, kui fail on root'i omandis õigustega 600.

Samm 4: laadi, käivita, kontrolli.

anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl enable --now factuurapp
anna@web1:~$ systemctl status factuurapp
anna@web1:~$ journalctl -u factuurapp -f

Turvavalikud: vähe vaeva, suur vahe

Näites RestartSec all olevad neli rida piiravad, mida teenus teha saab, ka siis, kui keegi leiab su rakendusest turvaaugu:

ValikMõju
NoNewPrivileges=trueprotsess ja selle alamprotsessid ei saa kunagi rohkem õigusi (ka mitte sudo või setuid-programmide kaudu)
ProtectSystem=strictkogu failisüsteem on teenusele ainult loetav, välja arvatud see, mida lubad ReadWritePaths= abil
ProtectHome=true/home, /root ja /run/user on nähtamatud
PrivateTmp=trueoma tühi /tmp, mida teised programmid ei näe

systemd oskab su unit'it hinnata:

anna@web1:~$ systemd-analyze security factuurapp
...
→ Overall exposure level for factuurapp.service: 4.9 OK 🙂

Mida väiksem number, seda parem. Ilma valikuteta teenus saab umbes 9 ("UNSAFE"). Nullini ei pea jõudma: iga lisatud valik võib lõhkuda midagi, mida rakendus vajab. Lisa neid ükshaaval ja testi pärast iga sammu. Kui miski enam ei tööta, leiad põhjuse tavaliselt journalist ("Read-only file system", "Permission denied").

Ülesannete ajastamine: taimerid

Kui midagi peab juhtuma kindlatel aegadel (varukoopia, koristusskript, aruanne), vajad taimerit. systemd-taimer koosneb kahest sama nimega unit'ist: .service ütleb, mida teha, ja .timer ütleb, millal.

# /etc/systemd/system/opruimen.service
[Unit]
Description=Oude exportbestanden opruimen

[Service]
Type=oneshot
User=factuurapp
ExecStart=/usr/bin/find /opt/factuurapp/data/export -type f -mtime +30 -delete
# /etc/systemd/system/opruimen.timer
[Unit]
Description=Dagelijks oude exportbestanden opruimen

[Timer]
OnCalendar=*-*-* 03:15:00
RandomizedDelaySec=10m
Persistent=true

[Install]
WantedBy=timers.target

Type=oneshot tähendab: programm töötab ja on seejärel valmis. OnCalendar on ajakava: iga päev kell 03:15. Võid kirjutada ka daily, weekly või Mon *-*-* 02:00; systemd-analyze calendar "Mon *-*-* 02:00" näitab, millal see järgmine kord on. Persistent=true on oluline: kui server oli kell 03:15 välja lülitatud, käivitub ülesanne kohe pärast alglaadimist. RandomizedDelaySec hajutab käivitusaega veidi.

Sisse lülitad taimeri, mitte teenuse:

anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl enable --now opruimen.timer
anna@web1:~$ systemctl list-timers opruimen
NEXT                        LEFT     LAST PASSED UNIT           ACTIVATES
Tue 2026-11-10 03:19:42 CET 15h left -    -      opruimen.timer opruimen.service
anna@web1:~$ sudo systemctl start opruimen.service    # testi nüüd üks kord käsitsi
anna@web1:~$ journalctl -u opruimen.service

Aga cron?

cron on vanem ja lihtsam tööriist ning töötab endiselt hästi. Rida kasutaja crontab'is (crontab -e):

15 3 * * * /usr/local/bin/opruimen.sh

Viis välja on minut, tund, kuupäev, kuu ja nädalapäev. Plussid ja miinused kõrvuti:

cronsystemd-taimer
Seadistamineüks ridakaks faili
Vahele jäänud käivitus (server väljas)jäetakse vahelePersistent=true abil tehakse järele
Väljund ja veade-postiga, kui server saab kirju saata; muidu kaovadjournalis
Turvavalikud, kasutajaskripti enda kaudukõik systemd võimalused (vt eespool)
Näha, millal see töötaskeerulinesystemctl list-timers ja journal

Serveri puhul, mida haldad tõsiselt, on taimerid parem valik, eriti varukoopiate jaoks (õppetund 8.2): tahad kindlalt teada, et need töötasid ja mida need väljastasid. Vaikselt ebaõnnestuvat cron-rida märkad alles siis, kui vajad varukoopiat.

AlmaLinuxis ja Rocky Linuxis

Unit'id ja taimerid töötavad täpselt samamoodi. Üks erinevus: SELinux võib takistada sinu teenust, mis loeb või kirjutab faile kohas, mida SELinux ei oota, või kuulab ebatavalisel pordil. Teade on kirjas failis /var/log/audit/audit.log. Ära lülita SELinuxit lahenduseks välja; otsi õige silt või reegel (näiteks semanage abil).

Kokkuvõte

  • Programm, mis peab alati töötama, peaks olema systemd-teenus: käivitub ise, taaskäivitub krahhi korral, logid on journalis.
  • Oma unit'id kausta /etc/systemd/system/, User= abil eraldi kasutaja ilma shellita, saladused failis EnvironmentFile õigustega 600.
  • NoNewPrivileges, ProtectSystem=strict koos ReadWritePaths, ProtectHome ja PrivateTmp piiravad kahju turvaaugu korral; systemd-analyze security hindab unit'it.
  • Taimer on .service pluss .timer koos OnCalendar; Persistent=true teeb vahele jäänud käivitused järele. Lülita sisse taimer, mitte teenus.
  • cron töötab endiselt, kuid taimerid annavad paremad logid ega jäta käivitusi vahele.

Test (quiz)

1. Su rakendus töötab teenusena seadega User=root. Miks on eraldi kasutaja parem?



2. Lõid .service ja .timer. Mille lülitad sisse käsuga enable --now?



3. Mida teeb taimeris Persistent=true?



4. Lisad ProtectSystem=strict ja su rakendus annab seejärel üleslaadimiste salvestamisel teate "Read-only file system". Mis on õige lahendus?



5. Kuhu paned oma teenuse andmebaasi parooli?



Ülesanne

Ülesanne O6.3: Oma teenus koos taimeriga. Loo oma serverisse väike teenus koos taimeriga, näiteks skript, mis kirjutab igal ööl vaba kettaruumi ja systemctl --failed faili või journalisse. Kasuta eraldi kasutajat, Type=oneshot, vähemalt kahte turvavalikut ja Persistent=true. Testi käsuga systemctl start, vaata väljundit journalis ja pane kirja systemd-analyze security hinne. Kleebi oma .service ja .timer ning vasta kontrollnimekirja küsimustele.

Ülesanne O6.3: Oma teenus koos taimeriga

Selle ülesande teed ise, keegi ei kontrolli seda. Märgi ära, mida tegid, ja märgi ülesanne tehtuks.




Su linnukesed ja märkmed jäävad ainult sellesse brauserisse, me ei saada neid kuhugi. Kui oled sisse loginud, salvestame Minu kursustes ainult info, et tegid ülesande ära.

Loe edasi

Hetk…

Seadista oma domeenid

Määra iga domeeni jaoks nimeserverid, seos sinu majutusega ja kes saab omanikuks.

Laadin sinu domeene…