Siirry suoraan sisältöön

Evästeasetukset

Valitse, mitä evästetyyppejä sallit. Voit muuttaa valintaasi milloin tahansa jokaisen sivun alareunassa olevasta kohdasta Evästeasetukset. Tietosuojaseloste

Välttämättömät

Aina käytössä

Tarvitaan sisäänkirjautumiseen, ostoskorin säilyttämiseen ja valintojesi muistamiseen. Nämä ovat aina käytössä.

Mitkä evästeet?
  • weboke_sessie, weboke_klant, weboke_remember: istuntosi ja sisäänkirjautuneena pysyminen
  • weboke_basket: ostoskorisi
  • wkBtwIncl: hintojen näyttäminen verollisina tai verottomina
  • wok_cookies: evästevalintasi, 12 kuukautta

Mittaa, mikä mainos johtaa käyntiin tai tilaukseen, jotta emme maksa mainoksista, joista ei ole hyötyä.

Mitkä evästeet?
  • Google Ads Google Tag Managerin kautta (_gcl_au, _gcl_aw), enintään 90 päivää
  • OpenAI Ads, mainokset ChatGPT-palvelussa
  • wok_aff: minkä kumppanin kautta tulit meille (kumppaniohjelma), 60 päivää

4,6

Maa ja kieli

Jokaisella maalla on oma sivustonsa, jossa on kyseisen maan hinnat ja ALV.

Näytä

Omat palvelut ja ajastimet

Moduuli 6: Palvelut ja lokit · Lukuaika: 11 minuuttia

Tavoite: Tämän oppitunnin jälkeen osaat ajaa oman ohjelman systemd-palveluna omalla käyttäjällään muutamalla suojausasetuksella sekä ajastaa tehtäviä systemd-ajastimella tai cronilla.

Keskeiset käsitteet: unit-tiedosto, [Unit], [Service], [Install], ExecStart, User=, WorkingDirectory, EnvironmentFile, Restart=, WantedBy, NoNewPrivileges, ProtectSystem, ProtectHome, PrivateTmp, systemd-analyze security, ajastin (timer), OnCalendar, Persistent, crontab

Miksei vain "nohup" tai "screen"?

Kun asennat palvelimelle oman ohjelman (pienen verkkosovelluksen, botin tai skriptin, joka tekee jotain joka yö), käynnistät sen ensimmäisellä kerralla usein käsin: node server.js & tai screen-istunnossa. Se toimii, kunnes kirjaudut ulos, palvelin käynnistyy uudelleen tai ohjelma kaatuu. Silloin se on poissa, eikä kukaan huomaa sitä.

Ohjelman, jonka pitää olla aina käynnissä, kuuluu olla systemd-palvelu. Silloin:

  • se käynnistyy itsestään, kun palvelin käynnistyy;
  • systemd käynnistää sen uudelleen, jos se kaatuu;
  • sen tuloste menee journaliin (oppitunti 6.2);
  • se toimii valitsemasi käyttäjän alla ja vain sallimillasi oikeuksilla.

Oma unit-tiedosto

Oletetaan, että sinulla on pieni Node.js-sovellus hakemistossa /opt/factuurapp ja se kuuntelee osoitteessa 127.0.0.1:3000. nginx tai Caddy julkaisee sen myöhemmin ulospäin (moduuli 7).

Vaihe 1: oma käyttäjä ilman kuorta (oppitunti 3.2). Sovelluksen ei tarvitse olla root eikä kirjautua sisään:

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

Itse koodi voi jäädä rootin omistukseen (sovelluksen ei tarvitse muuttaa itseään); vain hakemisto, johon se kirjoittaa, kuuluu palvelukäyttäjälle.

Vaihe 2: unit-tiedosto. Omat unitit sijoitetaan hakemistoon /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

Kolme osiota:

  • [Unit]: kuvaus ja järjestys. After=network-online.target yhdessä Wants=:n kanssa varmistaa, että palvelu käynnistyy vasta, kun verkko on käytettävissä.
  • [Service]: miten ohjelma ajetaan. ExecStart koko polun kanssa (systemd ei käytä hakupolkua kuten kuorisi). User= ja Group= määräävät, kenen alla se toimii. EnvironmentFile lukee asetukset, kuten tietokannan salasanan, erillisestä tiedostosta, jotta ne eivät ole unitissa.
  • [Install]: mitä enable tekee. WantedBy=multi-user.target tarkoittaa: käynnisty normaalin käynnistyksen yhteydessä.

Vaihe 3: salaisuudet erikseen, tiukoin oikeuksin.

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

Sisältö voi olla esimerkiksi DATABASE_URL=postgres://factuur:...@127.0.0.1/factuur. systemd lukee tiedoston rootina ennen kuin se vaihtaa palvelukäyttäjään, joten rootin omistama 600 riittää.

Vaihe 4: lataa, käynnistä, tarkista.

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

Suojausasetukset: pieni vaiva, suuri ero

Esimerkin neljä riviä kohdan RestartSec alla rajoittavat, mitä palvelu voi tehdä, myös silloin kun joku löytää sovelluksestasi haavoittuvuuden:

AsetusVaikutus
NoNewPrivileges=trueprosessi ja sen lapsiprosessit eivät voi koskaan saada lisää oikeuksia (eivät myöskään sudo:n tai setuid-ohjelmien kautta)
ProtectSystem=strictkoko tiedostojärjestelmä on palvelulle vain luku -tilassa, paitsi se, minkä sallit ReadWritePaths=:llä
ProtectHome=true/home, /root ja /run/user ovat näkymättömiä
PrivateTmp=trueoma, tyhjä /tmp, jota muut ohjelmat eivät näe

systemd voi arvioida unitisi:

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

Mitä pienempi luku, sitä parempi. Palvelu ilman asetuksia saa noin 9 ("UNSAFE"). Nollaan ei tarvitse pyrkiä: jokainen lisäämäsi asetus voi rikkoa jotain, mitä sovellus tarvitsee. Lisää ne yksi kerrallaan ja testaa jokaisen vaiheen jälkeen. Jos jokin lakkaa toimimasta, syy näkyy yleensä journalissa ("Read-only file system", "Permission denied").

Tehtävien ajastaminen: ajastimet

Kun jonkin pitää tapahtua säännöllisesti (varmuuskopio, siivousskripti, raportti), tarvitset ajastimen (timer). systemd-ajastin koostuu kahdesta samannimisestä unitista: .service kertoo, mitä tehdään, ja .timer kertoo, milloin.

# /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 tarkoittaa: ohjelma ajetaan ja se päättyy sen jälkeen. OnCalendar on aikataulu: joka päivä klo 03:15. Voit kirjoittaa myös daily, weekly tai Mon *-*-* 02:00; systemd-analyze calendar "Mon *-*-* 02:00" näyttää, milloin seuraava ajo on. Persistent=true on tärkeä: jos palvelin oli sammuksissa klo 03:15, tehtävä ajetaan heti käynnistyksen jälkeen. RandomizedDelaySec hajauttaa käynnistyshetkeä hieman.

Käyttöön otetaan ajastin, ei palvelua:

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    # testaa nyt kerran käsin
anna@web1:~$ journalctl -u opruimen.service

Entä cron?

cron on vanhempi ja yksinkertaisempi työkalu, ja se toimii edelleen hyvin. Rivi käyttäjän crontabissa (crontab -e):

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

Viisi kenttää ovat minuutti, tunti, kuukauden päivä, kuukausi ja viikonpäivä. Hyvät ja huonot puolet rinnakkain:

cronsystemd-ajastin
Käyttöönottoyksi rivikaksi tiedostoa
Väliin jäänyt ajo (palvelin sammuksissa)ohitetaanPersistent=true:n kanssa ajetaan jälkikäteen
Tuloste ja virheetsähköpostilla, jos palvelin voi lähettää postia; muuten katoavatjournalissa
Suojausasetukset, käyttäjäskriptin kauttakaikki systemd:n asetukset (katso yllä)
Milloin se ajettiinhankala selvittääsystemctl list-timers ja journal

Vakavasti ylläpidetyllä palvelimella ajastimet ovat parempi valinta, etenkin varmuuskopioille (oppitunti 8.2): haluat varmasti tietää, että ne ajettiin ja mitä ne tulostivat. Hiljaa epäonnistuvan cron-rivin huomaat vasta, kun tarvitset varmuuskopiota.

AlmaLinuxissa ja Rocky Linuxissa

Unitit ja ajastimet toimivat täsmälleen samalla tavalla. Yksi ero: SELinux voi estää oman palvelun, joka lukee tai kirjoittaa tiedostoja paikassa, jota SELinux ei odota, tai joka kuuntelee epätavallisessa portissa. Ilmoitus löytyy kohteesta /var/log/audit/audit.log. Älä ratkaise ongelmaa poistamalla SELinuxia käytöstä; etsi oikea nimiö tai sääntö (esimerkiksi semanage:llä).

Yhteenveto

  • Ohjelman, jonka pitää olla aina käynnissä, kuuluu olla systemd-palvelu: se käynnistyy itsestään, käynnistyy uudelleen kaatuessaan ja kirjoittaa lokit journaliin.
  • Omat unitit hakemistoon /etc/systemd/system/, User=:llä oma käyttäjä ilman kuorta, salaisuudet EnvironmentFile:iin oikeuksilla 600.
  • NoNewPrivileges, ProtectSystem=strict yhdessä ReadWritePaths:n kanssa, ProtectHome ja PrivateTmp rajoittavat vahinkoa haavoittuvuuden sattuessa; systemd-analyze security arvioi unitin.
  • Ajastin on .service ja .timer, jossa on OnCalendar; Persistent=true ajaa väliin jääneet ajot jälkikäteen. Ota käyttöön ajastin, ei palvelua.
  • cron toimii edelleen, mutta ajastimet antavat paremmat lokit eivätkä jätä ajoja väliin.

Tietovisa (quiz)

1. Sovelluksesi toimii palveluna asetuksella User=root. Miksi oma käyttäjä on parempi?



2. Olet luonut tiedostot .service ja .timer. Minkä otat käyttöön komennolla enable --now?



3. Mitä Persistent=true tekee ajastimessa?



4. Lisäät asetuksen ProtectSystem=strict, ja sen jälkeen sovelluksesi antaa virheen "Read-only file system" tallentaessaan latauksia. Mikä on oikea ratkaisu?



5. Mihin laitat oman palvelusi tietokannan salasanan?



Tehtävä

Tehtävä O6.3: Oma palvelu ajastimella. Luo palvelimellesi pieni oma palvelu ajastimella, esimerkiksi skripti, joka kirjoittaa joka yö vapaan levytilan ja systemctl --failed:n tiedostoon tai journaliin. Käytä omaa käyttäjää, Type=oneshot:a, vähintään kahta suojausasetusta ja Persistent=true:a. Testaa komennolla systemctl start, katso tuloste journalista ja kirjaa ylös systemd-analyze security:n pistemäärä. Liitä .service ja .timer ja vastaa tarkistuslistan kysymyksiin.

Tehtävä O6.3: Oma palvelu ajastimella

Tämän tehtävän teet itse, kukaan ei tarkista sitä. Merkitse tekemäsi kohdat ja merkitse tehtävä tehdyksi.




Merkintäsi ja muistiinpanosi pysyvät vain tässä selaimessa, emme lähetä niitä minnekään. Jos olet kirjautunut sisään, tallennamme kohtaan Omat kurssit vain sen, että olet tehnyt tehtävän.

Lue lisää

Hetkinen…

Määritä verkkotunnuksesi

Määritä kullekin verkkotunnukselle nimipalvelimet, liitos webhotelliin ja se, kuka tulee omistajaksi.

Ladataan verkkotunnuksia…