Linux kernel namespace: erinevus redaktsioonide vahel
| (ei näidata sama kasutaja 19 vahepealset redaktsiooni) | |||
| 2. rida: | 2. rida: | ||
TODO | TODO | ||
===Tööpõhimõte=== | |||
Namespace dimensioonid, 2026 aasta alguses 8 | |||
* mnt (Mount): Filesystems | |||
* uts: Hostname/Domain | |||
* ipc: Shared memory/Message queues | |||
* pid: Process numbering | |||
* net: Network stack | |||
* user: UID/GID mapping (The "Key" to rootless) | |||
* cgroup: Control group hierarchy | |||
* time: System clock offset (the "newest" major one) | |||
Väited | |||
* süsteemi käivitamisel moodustatakse automaatselt esimene komplekt namespace'isid (root/initial/global namespace) | |||
* namespace ja kasutaja ei käi koos, nt global namespace kõik protsessid ei ole root kasutaja omad (unshare jt käskudega käsurealt sellist tulemust konstrueerida paistab ei olegi nii lihtne) | |||
* user namespace on eriline, mingis mõttes teised on tema all | |||
* namespace'il on omanik | |||
* tavaliselt on namespace'id anonüümsed mitte nimelised, st nad tekitatakse käigult (ja käigult eemaldatakse) - esimese asjasse puutuva protsessi tekkimisel tekitatakse ning viimase töötava protsessi kadumisel eemaldatakse | |||
* namespace'id moodustavad hierarhia (nt vaadata töökohaarvutis kus on käivitatud google chrome protsess, midagi snap põhiselt jne) | |||
* tavaliselt kaasneb süsteemi sisse loginud kasutajaga (mitte 'su - kasutajanimi') 'kasutaja namespace' tekitamine (systemd põhises süsteemis) | |||
Käsurealt toimetamiseks namespace'idega on olulised sellised programmid | |||
* nsenter - saab kinnituda/siseneda namespace'i | |||
* unshare - saab protsessile käivitamisel öelda, et tekitatakse ka uus namespace ja seejuures protsess loobuks mingitest ressurssidest (nt võrk) | |||
* lsns - esitada namespace'ide nimekiri | |||
Iga protsess on seotud kõiki tüüpi namespace'idega, kui ei ole eraldi täpsustatud, siis on selleks protessi parent protsessi namespace'id, nt protsess 'cron' | |||
<pre> | |||
root@dh-minio-01:~# ps aux | grep -v "\]" | grep -v grep | grep cron | |||
root 650 0.0 0.0 6856 2924 ? Ss Apr18 0:00 /usr/sbin/cron -f | |||
root@dh-minio-01:~# lsns -p 650 | |||
NS TYPE NPROCS PID USER COMMAND | |||
4026531834 time 132 1 root /sbin/init | |||
4026531835 cgroup 120 1 root /sbin/init | |||
4026531836 pid 119 1 root /sbin/init | |||
4026531837 user 112 1 root /sbin/init | |||
4026531838 uts 115 1 root /sbin/init | |||
4026531839 ipc 119 1 root /sbin/init | |||
4026531840 net 113 1 root /sbin/init | |||
4026531841 mnt 107 1 root /sbin/init | |||
</pre> | |||
Kui protsessi juures on täpsustatud osa namespace'isid, siis ülejäänud on vanema omad, nt | |||
<pre> | |||
root@dh-minio-01:~# ps aux | grep -v "\]" | grep -v grep | grep rsyslogd | |||
root 656 0.0 0.0 219680 5412 ? Ssl Apr18 0:01 /usr/sbin/rsyslogd -n -iNONE | |||
root@dh-minio-01:~# lsns -p 656 | |||
NS TYPE NPROCS PID USER COMMAND | |||
4026531834 time 132 1 root /sbin/init | |||
4026531835 cgroup 120 1 root /sbin/init | |||
4026531836 pid 119 1 root /sbin/init | |||
4026531837 user 112 1 root /sbin/init | |||
4026531839 ipc 119 1 root /sbin/init | |||
4026531840 net 113 1 root /sbin/init | |||
4026532411 uts 1 656 root ├─/usr/sbin/rsyslogd -n -iNONE | |||
4026532461 mnt 1 656 root └─/usr/sbin/rsyslogd -n -iNONE | |||
</pre> | |||
===Misc=== | ===Misc=== | ||
Käitatakse shell (bash) ning seejuures tekitatakse temaga seoses mitu namespace'i | |||
* user - see on paratamatult vajalik | |||
* net - võrgunduse dimensioon | |||
* TODO | |||
* illustratsiooniks seadistatakse ka lo võrguseadmele ip aadress | |||
<pre> | <pre> | ||
| 85. rida: | 157. rida: | ||
4026532409 net 2 6065 kasutaja └─unshare --user --net --pid --map-root-user --mount --fork /bin/bash | 4026532409 net 2 6065 kasutaja └─unshare --user --net --pid --map-root-user --mount --fork /bin/bash | ||
</pre> | </pre> | ||
unshare väljumisest sobib öelda exit | |||
<pre> | |||
root@ph-minio-01:~# exit | |||
kasutaja@ph-minio-01:~$ | |||
</pre> | |||
systemd varjab namespace abil protsessi eest ära osa failisüsteemist | |||
<pre> | |||
root@dh-minio-01:~# lsns --tree=owner | |||
NS TYPE NPROCS PID USER COMMAND | |||
4026531837 user 110 1 root /sbin/init | |||
├─4026531834 time 110 1 root /sbin/init | |||
├─4026531835 cgroup 110 1 root /sbin/init | |||
├─4026531836 pid 110 1 root /sbin/init | |||
├─4026531838 uts 106 1 root /sbin/init | |||
├─4026531839 ipc 110 1 root /sbin/init | |||
├─4026531840 net 110 1 root /sbin/init | |||
├─4026531841 mnt 105 1 root /sbin/init | |||
├─4026531862 mnt 1 32 root kdevtmpfs | |||
├─4026532333 mnt 1 322 systemd-timesync /usr/lib/systemd/systemd-timesyncd | |||
├─4026532336 mnt 1 353 root /usr/lib/systemd/systemd-udevd | |||
├─4026532337 uts 1 322 systemd-timesync /usr/lib/systemd/systemd-timesyncd | |||
├─4026532338 uts 1 353 root /usr/lib/systemd/systemd-udevd | |||
├─4026532406 mnt 1 11405 root /usr/sbin/rsyslogd -n -iNONE | |||
├─4026532407 uts 1 11405 root /usr/sbin/rsyslogd -n -iNONE | |||
├─4026532461 uts 1 653 root /usr/lib/systemd/systemd-logind | |||
├─4026532468 mnt 1 653 root /usr/lib/systemd/systemd-logind | |||
root@dh-minio-01:~# nsenter -m -t 322 findmnt | grep inacc | |||
TARGET SOURCE FSTYPE OPTIONS | |||
├─/home tmpfs[/systemd/inaccessible/dir] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 | |||
│ ├─/proc/kallsyms tmpfs[/systemd/inaccessible/reg] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 | |||
│ ├─/proc/kcore tmpfs[/systemd/inaccessible/reg] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 | |||
│ ├─/proc/kmsg tmpfs[/systemd/inaccessible/reg] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 | |||
│ ├─/run/credentials tmpfs[/systemd/inaccessible/dir] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 | |||
├─/root tmpfs[/systemd/inaccessible/dir] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 | |||
├─/usr/lib/modules tmpfs[/systemd/inaccessible/dir] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 | |||
root@dh-minio-01:~# systemctl show systemd-timesyncd | grep ^Prote | |||
ProtectClock=no | |||
ProtectKernelTunables=yes | |||
ProtectKernelModules=yes | |||
ProtectKernelLogs=yes | |||
ProtectControlGroups=yes | |||
ProtectControlGroupsEx=yes | |||
ProtectHome=yes | |||
ProtectSystem=strict | |||
ProtectProc=invisible | |||
ProtectHostname=yes | |||
</pre> | |||
Kui nt vaikimisi midagi mitte varjavale postgresqli serviceile lisada | |||
<pre> | |||
root@dh-minio-01:~# systemctl edit postgresql@17-main | |||
[Service] | |||
ProtectKernelModules=yes | |||
</pre> | |||
siis postgresql protsessid saavad omale isikliku namespace'i | |||
<pre> | |||
root@dh-minio-01:~# lsns --tree=owner | |||
NS TYPE NPROCS PID USER COMMAND | |||
4026531837 user 115 1 root /sbin/init | |||
├─4026531834 time 115 1 root /sbin/init | |||
├─4026531835 cgroup 115 1 root /sbin/init | |||
├─4026531836 pid 115 1 root /sbin/init | |||
├─4026531838 uts 111 1 root /sbin/init | |||
├─4026531839 ipc 115 1 root /sbin/init | |||
├─4026531840 net 115 1 root /sbin/init | |||
├─4026531841 mnt 104 1 root /sbin/init | |||
├─4026531862 mnt 1 32 root kdevtmpfs | |||
├─4026532333 mnt 1 322 systemd-timesync /usr/lib/systemd/systemd-timesyncd | |||
├─4026532336 mnt 1 353 root /usr/lib/systemd/systemd-udevd | |||
├─4026532337 uts 1 322 systemd-timesync /usr/lib/systemd/systemd-timesyncd | |||
├─4026532338 uts 1 353 root /usr/lib/systemd/systemd-udevd | |||
├─4026532406 mnt 1 11405 root /usr/sbin/rsyslogd -n -iNONE | |||
├─4026532407 uts 1 11405 root /usr/sbin/rsyslogd -n -iNONE | |||
├─4026532408 mnt 6 146129 postgres /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgresql.conf | |||
├─4026532461 uts 1 653 root /usr/lib/systemd/systemd-logind | |||
├─4026532468 mnt 1 653 root /usr/lib/systemd/systemd-logind | |||
</pre> | |||
nsenter abil saab enam-vähem sama tulemuse, mis 'docker exec -ti container_name bash' | |||
<pre> | |||
nsenter -t $CPID -m -u -i -n -p bash | |||
</pre> | |||
kus | |||
* ei rakendu kõnealuse protsessi cgroups kitsendused | |||
* ei rakendu kõnealuse protsessi capabilities kitsendused | |||
* minnakse otse suhtlema kerneliga st mööda dockerd jms osakondadest | |||
===namespace mõju töökohaarvutile=== | |||
Töökohaarvuti kasutusjuhtumile on iseloomulikud lõppkasutaja kasutamisele iseloomulikud namespace'id | |||
[[Fail:20260415-namespace-ubuntu-desktop-2404-02.png|1300px]] | |||
kus | |||
* chrome brauseri töötamisega kaasneb hulka protsesse, paljud asuvad suhteliselt isiklikus namespace'is | |||
* snap kujul publitseeritud tarkvara kasutab ka ohtralt namespace'isid | |||
* kasutajaga seotud namespace kasutuse puhul on iseloomulik nö sügavama hierarhia moodustamine | |||
===Kasulikud lisamaterjalid=== | ===Kasulikud lisamaterjalid=== | ||
* TODO | * TODO | ||
Viimane redaktsioon: 22. aprill 2026, kell 09:14
Sissejuhatus
TODO
Tööpõhimõte
Namespace dimensioonid, 2026 aasta alguses 8
- mnt (Mount): Filesystems
- uts: Hostname/Domain
- ipc: Shared memory/Message queues
- pid: Process numbering
- net: Network stack
- user: UID/GID mapping (The "Key" to rootless)
- cgroup: Control group hierarchy
- time: System clock offset (the "newest" major one)
Väited
- süsteemi käivitamisel moodustatakse automaatselt esimene komplekt namespace'isid (root/initial/global namespace)
- namespace ja kasutaja ei käi koos, nt global namespace kõik protsessid ei ole root kasutaja omad (unshare jt käskudega käsurealt sellist tulemust konstrueerida paistab ei olegi nii lihtne)
- user namespace on eriline, mingis mõttes teised on tema all
- namespace'il on omanik
- tavaliselt on namespace'id anonüümsed mitte nimelised, st nad tekitatakse käigult (ja käigult eemaldatakse) - esimese asjasse puutuva protsessi tekkimisel tekitatakse ning viimase töötava protsessi kadumisel eemaldatakse
- namespace'id moodustavad hierarhia (nt vaadata töökohaarvutis kus on käivitatud google chrome protsess, midagi snap põhiselt jne)
- tavaliselt kaasneb süsteemi sisse loginud kasutajaga (mitte 'su - kasutajanimi') 'kasutaja namespace' tekitamine (systemd põhises süsteemis)
Käsurealt toimetamiseks namespace'idega on olulised sellised programmid
- nsenter - saab kinnituda/siseneda namespace'i
- unshare - saab protsessile käivitamisel öelda, et tekitatakse ka uus namespace ja seejuures protsess loobuks mingitest ressurssidest (nt võrk)
- lsns - esitada namespace'ide nimekiri
Iga protsess on seotud kõiki tüüpi namespace'idega, kui ei ole eraldi täpsustatud, siis on selleks protessi parent protsessi namespace'id, nt protsess 'cron'
root@dh-minio-01:~# ps aux | grep -v "\]" | grep -v grep | grep cron
root 650 0.0 0.0 6856 2924 ? Ss Apr18 0:00 /usr/sbin/cron -f
root@dh-minio-01:~# lsns -p 650
NS TYPE NPROCS PID USER COMMAND
4026531834 time 132 1 root /sbin/init
4026531835 cgroup 120 1 root /sbin/init
4026531836 pid 119 1 root /sbin/init
4026531837 user 112 1 root /sbin/init
4026531838 uts 115 1 root /sbin/init
4026531839 ipc 119 1 root /sbin/init
4026531840 net 113 1 root /sbin/init
4026531841 mnt 107 1 root /sbin/init
Kui protsessi juures on täpsustatud osa namespace'isid, siis ülejäänud on vanema omad, nt
root@dh-minio-01:~# ps aux | grep -v "\]" | grep -v grep | grep rsyslogd
root 656 0.0 0.0 219680 5412 ? Ssl Apr18 0:01 /usr/sbin/rsyslogd -n -iNONE
root@dh-minio-01:~# lsns -p 656
NS TYPE NPROCS PID USER COMMAND
4026531834 time 132 1 root /sbin/init
4026531835 cgroup 120 1 root /sbin/init
4026531836 pid 119 1 root /sbin/init
4026531837 user 112 1 root /sbin/init
4026531839 ipc 119 1 root /sbin/init
4026531840 net 113 1 root /sbin/init
4026532411 uts 1 656 root ├─/usr/sbin/rsyslogd -n -iNONE
4026532461 mnt 1 656 root └─/usr/sbin/rsyslogd -n -iNONE
Misc
Käitatakse shell (bash) ning seejuures tekitatakse temaga seoses mitu namespace'i
- user - see on paratamatult vajalik
- net - võrgunduse dimensioon
- TODO
- illustratsiooniks seadistatakse ka lo võrguseadmele ip aadress
kasutaja@ph-minio-01:~$ unshare --user --net --map-root-user /bin/bash
root@ph-minio-01:~# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
root@ph-minio-01:~# ip addr add 127.0.0.1 dev lo
root@ph-minio-01:~# ip link set up dev lo
root@ph-minio-01:~# ping -c 2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.020 ms
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1023ms
rtt min/avg/max/mdev = 0.016/0.018/0.020/0.002 ms
ning
root@ph-minio-01:~# lsns -n | grep kasutaja 4026532406 user 1 5124 kasutaja /bin/bash 4026532407 net 1 5124 kasutaja /bin/bash root@ph-minio-01:~# lsns 4026532406 PID PPID USER COMMAND 5124 4954 kasutaja /bin/bash root@ph-minio-01:~# lsns 4026532407 PID PPID USER COMMAND 5124 4954 kasutaja /bin/bash
Piiratud keskkonna moodustamine
kasutaja@ph-minio-01:~$ unshare --user --net --pid --map-root-user --mount --fork /bin/bash root@ph-minio-01:~# mount --make-rprivate / root@ph-minio-01:~# mount -t proc proc /proc root@ph-minio-01:~# mount -t sysfs sysfs /sys root@ph-minio-01:~# mkdir /tmp/empty root@ph-minio-01:~# mount --bind /tmp/empty /sys/bus/pci
Tulemusena
root@ph-minio-01:~# lspci lspci: Cannot open /sys/bus/pci/devices root@ph-minio-01:~# /usr/sbin/driverctl list-devices driverctl: No overridable devices found. Kernel too old? root@ph-minio-01:~# dmesg dmesg: read kernel buffer failed: Operation not permitted root@ph-minio-01:~# netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State
ning lsns vaatest
kasutaja@ph-minio-01:~$ lsns
NS TYPE NPROCS PID USER COMMAND
...
4026532406 user 2 6065 kasutaja ├─unshare --user --net --pid --map-root-user --mount --fork /bin/bash
4026532407 mnt 2 6065 kasutaja ├─unshare --user --net --pid --map-root-user --mount --fork /bin/bash
4026532408 pid 1 6066 kasutaja │ └─/bin/bash
4026532409 net 2 6065 kasutaja └─unshare --user --net --pid --map-root-user --mount --fork /bin/bash
unshare väljumisest sobib öelda exit
root@ph-minio-01:~# exit kasutaja@ph-minio-01:~$
systemd varjab namespace abil protsessi eest ära osa failisüsteemist
root@dh-minio-01:~# lsns --tree=owner NS TYPE NPROCS PID USER COMMAND 4026531837 user 110 1 root /sbin/init ├─4026531834 time 110 1 root /sbin/init ├─4026531835 cgroup 110 1 root /sbin/init ├─4026531836 pid 110 1 root /sbin/init ├─4026531838 uts 106 1 root /sbin/init ├─4026531839 ipc 110 1 root /sbin/init ├─4026531840 net 110 1 root /sbin/init ├─4026531841 mnt 105 1 root /sbin/init ├─4026531862 mnt 1 32 root kdevtmpfs ├─4026532333 mnt 1 322 systemd-timesync /usr/lib/systemd/systemd-timesyncd ├─4026532336 mnt 1 353 root /usr/lib/systemd/systemd-udevd ├─4026532337 uts 1 322 systemd-timesync /usr/lib/systemd/systemd-timesyncd ├─4026532338 uts 1 353 root /usr/lib/systemd/systemd-udevd ├─4026532406 mnt 1 11405 root /usr/sbin/rsyslogd -n -iNONE ├─4026532407 uts 1 11405 root /usr/sbin/rsyslogd -n -iNONE ├─4026532461 uts 1 653 root /usr/lib/systemd/systemd-logind ├─4026532468 mnt 1 653 root /usr/lib/systemd/systemd-logind root@dh-minio-01:~# nsenter -m -t 322 findmnt | grep inacc TARGET SOURCE FSTYPE OPTIONS ├─/home tmpfs[/systemd/inaccessible/dir] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 │ ├─/proc/kallsyms tmpfs[/systemd/inaccessible/reg] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 │ ├─/proc/kcore tmpfs[/systemd/inaccessible/reg] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 │ ├─/proc/kmsg tmpfs[/systemd/inaccessible/reg] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 │ ├─/run/credentials tmpfs[/systemd/inaccessible/dir] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 ├─/root tmpfs[/systemd/inaccessible/dir] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 ├─/usr/lib/modules tmpfs[/systemd/inaccessible/dir] tmpfs ro,nosuid,nodev,noexec,relatime,size=605312k,mode=755,inode64 root@dh-minio-01:~# systemctl show systemd-timesyncd | grep ^Prote ProtectClock=no ProtectKernelTunables=yes ProtectKernelModules=yes ProtectKernelLogs=yes ProtectControlGroups=yes ProtectControlGroupsEx=yes ProtectHome=yes ProtectSystem=strict ProtectProc=invisible ProtectHostname=yes
Kui nt vaikimisi midagi mitte varjavale postgresqli serviceile lisada
root@dh-minio-01:~# systemctl edit postgresql@17-main [Service] ProtectKernelModules=yes
siis postgresql protsessid saavad omale isikliku namespace'i
root@dh-minio-01:~# lsns --tree=owner NS TYPE NPROCS PID USER COMMAND 4026531837 user 115 1 root /sbin/init ├─4026531834 time 115 1 root /sbin/init ├─4026531835 cgroup 115 1 root /sbin/init ├─4026531836 pid 115 1 root /sbin/init ├─4026531838 uts 111 1 root /sbin/init ├─4026531839 ipc 115 1 root /sbin/init ├─4026531840 net 115 1 root /sbin/init ├─4026531841 mnt 104 1 root /sbin/init ├─4026531862 mnt 1 32 root kdevtmpfs ├─4026532333 mnt 1 322 systemd-timesync /usr/lib/systemd/systemd-timesyncd ├─4026532336 mnt 1 353 root /usr/lib/systemd/systemd-udevd ├─4026532337 uts 1 322 systemd-timesync /usr/lib/systemd/systemd-timesyncd ├─4026532338 uts 1 353 root /usr/lib/systemd/systemd-udevd ├─4026532406 mnt 1 11405 root /usr/sbin/rsyslogd -n -iNONE ├─4026532407 uts 1 11405 root /usr/sbin/rsyslogd -n -iNONE ├─4026532408 mnt 6 146129 postgres /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgresql.conf ├─4026532461 uts 1 653 root /usr/lib/systemd/systemd-logind ├─4026532468 mnt 1 653 root /usr/lib/systemd/systemd-logind
nsenter abil saab enam-vähem sama tulemuse, mis 'docker exec -ti container_name bash'
nsenter -t $CPID -m -u -i -n -p bash
kus
- ei rakendu kõnealuse protsessi cgroups kitsendused
- ei rakendu kõnealuse protsessi capabilities kitsendused
- minnakse otse suhtlema kerneliga st mööda dockerd jms osakondadest
namespace mõju töökohaarvutile
Töökohaarvuti kasutusjuhtumile on iseloomulikud lõppkasutaja kasutamisele iseloomulikud namespace'id
kus
- chrome brauseri töötamisega kaasneb hulka protsesse, paljud asuvad suhteliselt isiklikus namespace'is
- snap kujul publitseeritud tarkvara kasutab ka ohtralt namespace'isid
- kasutajaga seotud namespace kasutuse puhul on iseloomulik nö sügavama hierarhia moodustamine
Kasulikud lisamaterjalid
- TODO