Pāriet uz saturu

Sīkdatņu iestatījumi

Izvēlieties, kāda veida sīkdatnes atļaujat. Savu izvēli varat jebkurā laikā mainīt sadaļā Sīkdatņu iestatījumi katras lapas apakšā. Privātuma politika

Nepieciešamās

Vienmēr ieslēgtas

Vajadzīgas, lai pieteiktos, saglabātu grozu un atcerētos Jūsu izvēles. Tās vienmēr ir ieslēgtas.

Kuras sīkdatnes?
  • weboke_sessie, weboke_klant, weboke_remember: Jūsu sesija un pieteikšanās saglabāšana
  • weboke_basket: Jūsu grozs
  • wkBtwIncl: cenu rādīšana ar PVN vai bez PVN
  • wok_cookies: Jūsu sīkdatņu izvēle, 12 mēneši

Mēra, kura reklāma noved pie apmeklējuma vai pasūtījuma, lai mēs nemaksātu par reklāmām, kas neko nedod.

Kuras sīkdatnes?
  • Google Ads ar Google Tag Manager (_gcl_au, _gcl_aw), līdz 90 dienām
  • OpenAI Ads, reklāmas ChatGPT
  • wok_aff: caur kuru partneri nonācāt pie mums (partneru programma), 60 dienas

4,6

Valsts un valoda

Katrai valstij ir sava vietne ar attiecīgās valsts cenām un PVN.

Skatīt

Savi pakalpojumi un taimeri

6. modulis: Pakalpojumi un žurnāli · Lasīšanas laiks: 11 min.

Mācīšanās mērķis: Pēc šīs nodarbības Jūs varēsiet palaist savu programmu kā systemd pakalpojumu ar atsevišķu lietotāju un dažām drošības opcijām, kā arī plānot uzdevumus ar systemd taimeri vai cron.

Pamatjēdzieni: unit fails, [Unit], [Service], [Install], ExecStart, User=, WorkingDirectory, EnvironmentFile, Restart=, WantedBy, NoNewPrivileges, ProtectSystem, ProtectHome, PrivateTmp, systemd-analyze security, taimeris, OnCalendar, Persistent, crontab

Kāpēc ne vienkārši "nohup" vai "screen"?

Kad serverī uzliekat savu programmu (nelielu tīmekļa lietotni, botu, skriptu, kas katru nakti kaut ko dara), pirmo reizi to bieži palaižat manuāli: node server.js & vai screen sesijā. Tas darbojas, līdz Jūs atsakāties, serveris tiek restartēts vai programma avarē. Tad tā ir pazudusi, un neviens to nepamana.

Programmai, kurai jādarbojas vienmēr, jābūt systemd pakalpojumam. Tad:

  • tā startē automātiski, palaižot sistēmu;
  • systemd to palaiž no jauna, ja tā avarē;
  • tās izvade nonāk žurnālā (nodarbība 6.2);
  • tā darbojas Jūsu izvēlēta lietotāja vārdā, ar tām tiesībām, kuras Jūs atļaujat.

Savs unit fails

Pieņemsim, ka Jums ir neliela Node.js lietotne mapē /opt/factuurapp, kas klausās uz 127.0.0.1:3000. Vēlāk nginx vai Caddy to padarīs pieejamu no ārpuses (modulis 7).

1. solis: atsevišķs lietotājs bez čaulas (nodarbība 3.2). Lietotnei nav jābūt root, un tai nav jāpiesakās:

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

Pats kods var palikt root īpašumā (lietotnei nav jāmaina pašai sevi); dienesta lietotājam pieder tikai mape, kurā tā raksta.

2. solis: unit fails. Savus unit failus ievietojiet mapē /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

Trīs bloki:

  • [Unit]: apraksts un secība. After=network-online.target kopā ar Wants= nodrošina, ka pakalpojums startē tikai tad, kad tīkls ir pieejams.
  • [Service]: kā programma darbojas. ExecStart ar pilnu ceļu (systemd neizmanto meklēšanas ceļu kā Jūsu čaula). User= un Group= nosaka, kura vārdā tā darbojas. EnvironmentFile nolasa iestatījumus, piemēram, datubāzes paroli, no atsevišķa faila, lai tie neatrastos unit failā.
  • [Install]: ko dara enable. WantedBy=multi-user.target nozīmē: startēt līdz ar parastu sistēmas palaišanu.

3. solis: noslēpumi atsevišķi, ar stingrām tiesībām.

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

Saturs, piemēram, DATABASE_URL=postgres://factuur:...@127.0.0.1/factuur. systemd nolasa failu kā root, pirms pārslēdzas uz dienesta lietotāju, tāpēc pietiek ar 600, kas pieder root.

4. solis: ielādēt, startēt, pārbaudīt.

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

Drošības opcijas: maza piepūle, liela atšķirība

Četras rindas zem RestartSec piemērā ierobežo, ko pakalpojums var darīt, arī tad, ja kāds atrod ievainojamību Jūsu lietotnē:

OpcijaIedarbība
NoNewPrivileges=trueprocess un tā bērnprocesi nekad nevar iegūt vairāk tiesību (arī ne ar sudo vai setuid programmām)
ProtectSystem=strictvisa failu sistēma pakalpojumam ir tikai lasāma, izņemot to, ko atļaujat ar ReadWritePaths=
ProtectHome=true/home, /root un /run/user nav redzamas
PrivateTmp=truesava, tukša /tmp, ko citas programmas neredz

systemd var novērtēt Jūsu unit failu:

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

Jo mazāks skaitlis, jo labāk. Pakalpojums bez opcijām iegūst ap 9 ("UNSAFE"). Nav jātiecas uz nulli: katra pievienotā opcija var sabojāt kaut ko, kas lietotnei vajadzīgs. Pievienojiet tās pa vienai un pārbaudiet pēc katra soļa. Ja kaut kas vairs nedarbojas, iemesls parasti redzams žurnālā ("Read-only file system", "Permission denied").

Uzdevumu plānošana: taimeri

Darbībām, kam jānotiek noteiktos laikos (rezerves kopija, tīrīšanas skripts, atskaite), Jums vajag taimeri. systemd taimeris sastāv no diviem unit failiem ar vienādu nosaukumu: .service, kas nosaka, kam jānotiek, un .timer, kas nosaka, kad.

# /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 nozīmē: programma izpildās un pēc tam ir pabeigta. OnCalendar ir laika grafiks: katru dienu plkst. 03:15. Varat rakstīt arī daily, weekly vai Mon *-*-* 02:00; systemd-analyze calendar "Mon *-*-* 02:00" parāda, kad tas notiks nākamreiz. Persistent=true ir svarīgs: ja serveris plkst. 03:15 bija izslēgts, uzdevums tiek izpildīts uzreiz pēc palaišanas. RandomizedDelaySec nedaudz izkliedē sākuma brīdi.

Ieslēdziet taimeri, nevis service:

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    # tagad vienreiz pārbaudīt manuāli
anna@web1:~$ journalctl -u opruimen.service

Un cron?

cron ir vecāks, vienkāršāks rīks, un tas joprojām lieliski darbojas. Rinda lietotāja crontab (crontab -e):

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

Pieci lauki ir minūte, stunda, mēneša diena, mēnesis un nedēļas diena. Priekšrocības un trūkumi blakus:

cronsystemd taimeris
Iestatīšanaviena rindadivi faili
Izlaista izpilde (serveris izslēgts)tiek izlaistaar Persistent=true tiek izpildīta vēlāk
Izvade un kļūdaspa e-pastu, ja serveris var sūtīt e-pastu; citādi pazūdžurnālā
Drošības opcijas, lietotājsar pašu skriptuviss, ko piedāvā systemd (nodarbība iepriekš)
Redzēt, kad tas izpildījāssarežģītisystemctl list-timers un žurnāls

Serverim, ko pārvaldāt nopietni, taimeri ir labāka izvēle, īpaši rezerves kopijām (nodarbība 8.2): Jūs vēlaties droši zināt, ka tās izpildījās un ko tās ziņoja. cron rindu, kas klusi neizdodas, Jūs pamanāt tikai tad, kad Jums vajag rezerves kopiju.

AlmaLinux un Rocky Linux sistēmās

Unit faili un taimeri darbojas tieši tāpat. Viena atšķirība: SELinux var bloķēt savu pakalpojumu, kas lasa vai raksta failus vietā, kuru SELinux negaida, vai klausās uz neparasta porta. Paziņojums atrodas /var/log/audit/audit.log. Neizslēdziet SELinux, lai to atrisinātu; atrodiet pareizo etiķeti vai noteikumu (piemēram, ar semanage).

Kopsavilkums

  • Programmai, kurai jādarbojas vienmēr, jābūt systemd pakalpojumam: automātiska palaišana, restartēšana pēc avārijas, žurnāli žurnālā.
  • Savi unit faili mapē /etc/systemd/system/, ar User= atsevišķs lietotājs bez čaulas, noslēpumi failā EnvironmentFile ar tiesībām 600.
  • NoNewPrivileges, ProtectSystem=strict ar ReadWritePaths, ProtectHome un PrivateTmp ierobežo kaitējumu ievainojamības gadījumā; systemd-analyze security novērtē unit failu.
  • Taimeris ir .service plus .timer ar OnCalendar; Persistent=true izpilda izlaistās reizes vēlāk. Ieslēdziet taimeri, nevis service.
  • cron joprojām darbojas, bet taimeri dod labākus žurnālus un neizlaiž izpildes.

Tests (quiz)

1. Jūsu lietotne darbojas kā pakalpojums ar User=root. Kāpēc atsevišķs lietotājs ir labāks?



2. Jūs esat izveidojis .service un .timer. Ko ieslēdzat ar enable --now?



3. Ko taimerī dara Persistent=true?



4. Jūs pievienojat ProtectSystem=strict, un pēc tam lietotne, saglabājot augšupielādes, ziņo "Read-only file system". Kāds ir pareizais risinājums?



5. Kur glabājat sava pakalpojuma datubāzes paroli?



Uzdevums

Uzdevums O6.3: Savs pakalpojums ar taimeri. Izveidojiet savā serverī nelielu savu pakalpojumu ar taimeri, piemēram, skriptu, kas katru nakti ieraksta failā vai žurnālā brīvo diska vietu un systemctl --failed. Izmantojiet atsevišķu lietotāju, Type=oneshot, vismaz divas drošības opcijas un Persistent=true. Pārbaudiet ar systemctl start, apskatiet izvadi žurnālā un pierakstiet systemd-analyze security vērtējumu. Ielīmējiet savu .service un .timer un atbildiet uz kontrolsaraksta jautājumiem.

Uzdevums O6.3: Savs pakalpojums ar taimeri

Šo uzdevumu veicat paši; neviens to nepārbauda. Atzīmējiet, ko esat izdarījuši, un atzīmējiet uzdevumu kā paveiktu.




Jūsu atzīmes un piezīmes paliek tikai šajā pārlūkprogrammā; mēs tās nekur nesūtām. Ja esat pieteikušies, sadaļā Mani kursi saglabājam tikai to, ka uzdevums ir paveikts.

Vairāk lasīt

Lūdzu, uzgaidiet…

Iestatiet savus domēnus

Katram domēnam norādiet vārdu serverus, piesaisti hostingam un to, kurš būs turētājs.

Ielādē Jūsu domēnus…