Linux kernel kontrollib tegevusi: erinevus redaktsioonide vahel
| (ei näidata sama kasutaja 2 vahepealset redaktsiooni) | |||
| 27. rida: | 27. rida: | ||
Väited syscall kasutamise kohta |
Väited syscall kasutamise kohta |
||
| − | * kui tavakasutaja tegeleb omale kuuluva tekstifaili sisu muutmisega, siis ta esmalt sooritab open() syscalli ja seda üldiselt lubatakse kõigil kasutajatel teha, seejuures saab süsteem teada, kas kasutajal on lubatud kõnealuse failiga tegeleda ja mil viisil jne; ja edasi kasutaja ütleb read() syscall'i: read() iseenesest vajab tugevaid lube töötamiseks, aga süsteem tuletab loa protsessi omaniku/grupi kõrvutamisest faili omaniku/grupi ja loabittidega - näiliselt tundub, et read(), write() jt selliste syscallide kasutamine toimub väga liberaalselt |
+ | * kui tavakasutaja tegeleb omale kuuluva tekstifaili sisu muutmisega, siis ta esmalt sooritab open() syscalli ja seda üldiselt lubatakse kõigil kasutajatel teha, seejuures saab süsteem teada, kas kasutajal on lubatud kõnealuse failiga tegeleda ja mil viisil jne; ja edasi kasutaja ütleb read() syscall'i: read() iseenesest vajab tugevaid lube töötamiseks, aga süsteem tuletab loa protsessi omaniku/grupi kõrvutamisest faili omaniku/grupi ja loabittidega - näiliselt tundub, et read(), write() jt selliste syscallide kasutamine toimub väga liberaalselt |
| − | * kui kasutaja root käivitab tekstireadaktori asub tegelema tekstifaili sisu muutmisega, siis toimub sarnane kontroll kuid see annab väga jaatava vastuse kuna kasutaja on root (uid=0) - kernelil on kasutada loogika, et kui kasutaja on root siis see on samaväärne kõigi capacitite olemasoluga |
+ | * kui kasutaja root käivitab tekstireadaktori asub tegelema tekstifaili sisu muutmisega, siis toimub sarnane kontroll kuid see annab väga jaatava vastuse kuna kasutaja on root (uid=0) - kernelil on kasutada loogika, et kui kasutaja on root, siis see on samaväärne kõigi capacitite olemasoluga |
Joonis |
Joonis |
||
| 47. rida: | 47. rida: | ||
* systemd - tegeleb seccomp ja capabilities rakendamisega |
* systemd - tegeleb seccomp ja capabilities rakendamisega |
||
* apparmor - tegeleb lsm rakendamisega |
* apparmor - tegeleb lsm rakendamisega |
||
| + | * tundub, et reaalsuses see olukord ei ole väga sirgejooneline - nt apparmor sätib samuti capabilitisid (rakendub nö kõige suurem kitsendus) |
||
===gemini joonis=== |
===gemini joonis=== |
||
Viimane redaktsioon: 4. mai 2026, kell 03:04
Sissejuhatus
TODO
Mõisted
- seccomp
- capabilities
- dac/acl
- lsm
Tööpõhimõte
Väited
- üldiselt tahab protsess kasutada mingit ressurssi ja seda on vaja kontrollida (nt peab süsteem otsustama, kas seda kasutamist lubada)
- privileegid (st õigus midagi teha, midagi kasutada) pole mitte niivõrd kasutajal, aga privileegid on protsessil
- protsessi privileegid tulenevad muu hulgast kolmest asjaolust: 1. seccomp syscall tulemüür, 2. capabilities, 3. lsm
- capability'le vastab komplekt syscallisid (tavaliselt)
- system call (syscall, 'make system call') - xxx
Syscallisid on üldiselt kahesuguseid
- Automatic Syscalls: Actions like mmap(), read(), or brk() are considered "safe." The kernel assumes that if you have the memory or the file handle, you can perform these actions. No special "permission" is needed beyond standard file permissions.
- Restricted Syscalls: Actions like clock_adjtime(), reboot(), or mount() are "dangerous." Historically, the kernel had a simple rule: if (uid == 0) (Root), allow; else, deny.
Väited syscall kasutamise kohta
- kui tavakasutaja tegeleb omale kuuluva tekstifaili sisu muutmisega, siis ta esmalt sooritab open() syscalli ja seda üldiselt lubatakse kõigil kasutajatel teha, seejuures saab süsteem teada, kas kasutajal on lubatud kõnealuse failiga tegeleda ja mil viisil jne; ja edasi kasutaja ütleb read() syscall'i: read() iseenesest vajab tugevaid lube töötamiseks, aga süsteem tuletab loa protsessi omaniku/grupi kõrvutamisest faili omaniku/grupi ja loabittidega - näiliselt tundub, et read(), write() jt selliste syscallide kasutamine toimub väga liberaalselt
- kui kasutaja root käivitab tekstireadaktori asub tegelema tekstifaili sisu muutmisega, siis toimub sarnane kontroll kuid see annab väga jaatava vastuse kuna kasutaja on root (uid=0) - kernelil on kasutada loogika, et kui kasutaja on root, siis see on samaväärne kõigi capacitite olemasoluga
Joonis
töötav protsess -> syscall liides -> kernel -> ressurss
^ ^ ^
| | |
| | |
seccomp tulemüür capabilities lsm (apparmor)
dac
kus
- systemd - tegeleb seccomp ja capabilities rakendamisega
- apparmor - tegeleb lsm rakendamisega
- tundub, et reaalsuses see olukord ei ole väga sirgejooneline - nt apparmor sätib samuti capabilitisid (rakendub nö kõige suurem kitsendus)
gemini joonis
[ PROCESS ]
|
| 1. SECCOMP GATE (The Vocabulary Check)
| "Is this syscall even allowed to be uttered?"
| [ Filter: 23 active ] ---------------------> [ REJECT / SIGSYS ]
|
v
| 2. CAPABILITIES GATE (The Authority Check)
| "Does this process hold the specific bit for this action?"
| [ e.g., CAP_SYS_TIME ] --------------------> [ REJECT / EPERM ]
|
v
| 3. DAC / ACL GATE (The Identity Check)
| "Is the process UID/GID on the list for this file/device?"
| [ Feature: +ACL ] -------------------------> [ REJECT / EACCES ]
|
v
| 4. LSM / MAC GATE (The Policy "Horizon")
| "Does the overall security policy permit this role this access?"
| [ AppArmor / SELINUX ] --------------------> [ REJECT / DENIED ]
|
v
[ RESOURCE ] (e.g., /dev/sda, System Clock, Network Socket)
Capabilities
Linuxi tuumas on üldotstarbeline capability süsteem, mille abil nt saab protsessidele anda erinevaid privileege. Nt üks selline capabiliti on dac_override, mis seisneb selles, et root kasutajal on õigus sõita üle enamusest piirangutest, nt saab root töötada kasutajale kuuluvate failidega. Kui root kasutajale ei anna apparmor profiil erilisi privileege, siis root kasutaja on enam-vähem samaväärne tavakasutajaga, mille nimeks on 'root'. St tal ei ole õigust nt teiste kasutajate faile lugeda. Selleks, et root kasutajale kehtestatud apparmor profiili tingimustes see ülesõitmise privileeg tagasi tekiks sobib kasutada profiilis rida 'capability dac_override'. Capability süsteem on üldotstarbeline, ta ei ole LSM komponent, nt üks tema esinemise koht on selles, et uuemal ajal /bin/ping ei ole enam setuid
# ls -ld /bin/ping -rwxr-xr-x 1 root root 44104 Nov 8 2014 /bin/ping # getcap /bin/ping /bin/ping = cap_net_raw+ep # getfattr -d -m "^security\\." /bin/ping getfattr: Removing leading '/' from absolute path names # file: bin/ping security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
Kusjuures stat programm kasutab nn legacy syscall'i ja ei esita capabilities kohta infot (olevat olemas ka statx)
Failile cap seadistamiseks sobib öelda nt
# setcap cap_net_raw,cap_setuid,cap_setgid+ep /tmp/capable
kus
- +ep - kehtestatud
Kasulikud lisamaterjalid
- https://wiki.archlinux.org/index.php/Capabilities
- man capabilities
Capabilities - 2026 kevad märkmed
Väited
- teatud mõttes capabilities laiendab nö klassikaliselt setuid lahendust (mis võimaldab faili omaduste alusel tuletada protsessi käivitamise jaoks sobivad privileegid - tavaliselt tavakasutaja -> root kasutaja)
- võimalik on tekitada tavakasutajale kuuluva protsessi, mis on binditud privilegeeritud st <1024 port külge
- teatud määral päritakse capabilitied parent protsessi käest child protsessi poolt
capabilities saab toimuda kahe nö allika põhiselt
- faili xattr alusel staatiliselt
- kõrgema privileegiga protsessi poolt väljakutsutud viisil dünaamiliselt (nt systemd service unit)
systemd puhul tavaliselt seadistatakse alumime ja ülemine lagi privileegidega
root@zabbix-pub-01:~# systemctl show systemd-resolved | grep Capab CapabilityBoundingSet=cap_setpcap cap_net_bind_service cap_net_raw AmbientCapabilities=cap_setpcap cap_net_bind_service cap_net_raw root@zabbix-pub-01:~# egrep -r AmbientCapabilities /lib/systemd/ /lib/systemd/system/e2scrub_reap.service:AmbientCapabilities=CAP_SYS_ADMIN CAP_SYS_RAWIO /lib/systemd/system/e2scrub@.service:AmbientCapabilities=CAP_SYS_ADMIN CAP_SYS_RAWIO /lib/systemd/system/xfs_scrub@.service:AmbientCapabilities=CAP_SYS_ADMIN CAP_FOWNER CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_SYS_RAWIO /lib/systemd/system/systemd-timesyncd.service:AmbientCapabilities=CAP_SYS_TIME /lib/systemd/system/systemd-networkd.service:AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW /lib/systemd/system/systemd-resolved.service:AmbientCapabilities=CAP_SETPCAP CAP_NET_RAW CAP_NET_BIND_SERVICE
Parasjagu olevat protsesside seisu capability mõttes esitab pscap programm, nt
root@zabbix-pub-01:~# apt-get install libcap-ng-utils root@zabbix-pub-01:~# pscap -a ppid pid uid command capabilities 0 1 root systemd full + 1 344 root systemd-journal chown, dac_override, dac_read_search, fowner, setgid, setuid, sys_ptrace, sys_admin, audit_control, mac_override, syslog, audit_read + 1 395 root multipathd full + 1 413 root systemd-udevd chown, dac_override, dac_read_search, fowner, fsetid, kill, setgid, setuid, setpcap, linux_immutable, net_bind_service, net_broadcast, net_admin, net_raw, ipc_lock, ipc_owner, sys_module, sys_rawio, sys_chroot, sys_ptrace, sys_pacct, sys_admin, sys_boot, sys_nice, sys_resource, sys_tty_config, mknod, lease, audit_write, audit_control, setfcap, mac_override, mac_admin, syslog, block_suspend, audit_read, perfmon, bpf, checkpoint_restore + 1 562 systemd-network systemd-network net_bind_service, net_broadcast, net_admin, net_raw @ + 1 577 systemd-resolve systemd-resolve net_raw @ + 1 593 systemd-timesync systemd-timesyn sys_time @ + 1 715 messagebus dbus-daemon audit_write + 1 719 root php-fpm8.3 full + 1 724 root qemu-ga full + 1 733 root systemd-logind chown, dac_override, dac_read_search, fowner, linux_immutable, sys_admin, sys_tty_config, audit_control, mac_admin + ...
Dünaamiline capability
Ühes aknas öeldakse
root@zabbix-pub-01:~# capsh --keep=1 --user=nobody --inh=cap_chown --addamb=cap_chown --caps="cap_chown=eip" -- -c "sleep 60"
ja teises küsitakse
root@zabbix-pub-01:~# ps aux | grep sleep nobody 216107 0.0 0.1 5692 2196 pts/0 S+ 00:45 0:00 sleep 60 root@zabbix-pub-01:~# grep -i cap /proc/216107/status CapInh: 0000000000000001 CapPrm: 0000000000000001 CapEff: 0000000000000001 CapBnd: 000001ffffffffff CapAmb: 0000000000000001
seccomp
Tööpõhimõte
TODO
Misc
seccomp leiab kõneks olevad syscallid üles nn bpf-classic filtrite abil, antud juhul 23 tükki (neid ei esita bpftool prog show)
root@pve-svc-02:~# cat /proc/1436092/status | grep Seccomp Seccomp: 2 Seccomp_filters: 23
root@dh-minio-01:~# cat seccomp-list.sh
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
status=$(grep "Seccomp:" /proc/$pid/status 2>/dev/null | awk '{print $2}')
if [ "$status" = "2" ]; then
name=$(cat /proc/$pid/comm)
echo "PID $pid ($name) is SECCOMP FILTERED"
fi
done
nt Debian v. 13 arvutis
root@dh-minio-01:~# sh seccomp-list.sh PID 11405 (rsyslogd) is SECCOMP FILTERED PID 155380 (nginx) is SECCOMP FILTERED PID 155381 (nginx) is SECCOMP FILTERED PID 155382 (nginx) is SECCOMP FILTERED PID 157836 (postgres) is SECCOMP FILTERED PID 157837 (postgres) is SECCOMP FILTERED PID 157838 (postgres) is SECCOMP FILTERED PID 157840 (postgres) is SECCOMP FILTERED PID 157841 (postgres) is SECCOMP FILTERED PID 157842 (postgres) is SECCOMP FILTERED PID 297 (systemd-journal) is SECCOMP FILTERED PID 322 (systemd-timesyn) is SECCOMP FILTERED PID 353 (systemd-udevd) is SECCOMP FILTERED PID 653 (systemd-logind) is SECCOMP FILTERED
Kasulikud lisamaterjalid
Kasulikud lisamaterjalid
- TODO