per proses mount poin sistem file pribadi

24

Saya sedang memeriksa unshareperintah dan menurut halaman manualnya,

   unshare - run program with some namespaces unshared from parent

Saya juga melihat ada jenis namespace terdaftar sebagai,

 mount namespace
              mounting and unmounting filesystems will not affect rest of the system.

Apa sebenarnya tujuan dari mount namespace ini ? Saya mencoba memahami konsep ini dengan bantuan beberapa contoh.

Ramesh
sumber
1
Lihat juga kernel: Dukungan Namespaces dan artikel Michael Kerrisk tentang ruang nama di LWN .
Gilles 'SO- stop being evil'
@Gilles, terima kasih. Saya akan memeriksanya. Sementara itu, beri tahu saya jika ada hal lain yang perlu ditambahkan dalam jawaban.
Ramesh

Jawaban:

29

Menjalankan unshare -mmemberi proses panggilan salinan pribadi dari mount namespace-nya, dan juga unshares atribut sistem file sehingga tidak lagi berbagi direktori root, direktori saat ini, atau atribut umask dengan proses lainnya.

Jadi apa kata paragraf di atas? Mari kita coba dan pahami menggunakan contoh sederhana.

Terminal 1:

Saya melakukan perintah di bawah ini di terminal pertama.

#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory. 
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points. 
grep /tmp /proc/mounts 

Perintah terakhir memberi saya output sebagai,

tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0

Sekarang, saya melakukan perintah berikut juga.

cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa

Output dari lsperintah ini adalah,

ls -lFa
total 4
drwxrwxrwt   2 root root   80 Sep  3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../
-rw-r--r--   1 root root    0 Sep  3 22:23 hello
-rw-r--r--   1 root root    0 Sep  3 22:23 helloagain

Jadi apa masalahnya dalam melakukan semua ini? Mengapa saya harus melakukannya?

Saya membuka terminal lain sekarang ( terminal 2 ) dan melakukan perintah di bawah ini.

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

Outputnya seperti di bawah ini.

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

File hellodan helloagaintidak terlihat dan saya bahkan login sebagai root untuk memeriksa file-file ini. Jadi keuntungannya adalah, fitur ini memungkinkan kita untuk membuat sistem file sementara pribadi yang bahkan proses yang dimiliki oleh root lainnya tidak dapat melihat atau menelusuri.

Dari halaman manual unshare,

mount namespace Pemasangan dan unmount filesystem tidak akan mempengaruhi sisa sistem (flag CLONE_NEWNS), kecuali untuk filesystem yang secara eksplisit ditandai sebagai shared (dengan mount --make-shared; lihat / proc / self / mountinfo untuk flag bersama).

Disarankan untuk menggunakan mount --make-rprivate atau mount --make-rslave setelah berhenti berbagi --mount untuk memastikan bahwa mountpoints di namespace baru benar-benar tidak dibagi dari namespace parental.

Memori yang digunakan untuk namespace adalah VFS yang berasal dari kernel. Dan - jika kita mengaturnya di tempat pertama - kita dapat membuat seluruh lingkungan virtual di mana kita adalah pengguna root tanpa izin root.

Referensi:

Contohnya dibingkai menggunakan detail dari posting blog ini . Juga, kutipan dari jawaban ini berasal dari penjelasan yang luar biasa dari Mike . Bacaan lain yang indah tentang ini dapat ditemukan dari jawaban dari sini .

Ramesh
sumber
1
this feature makes it possible for us to create a private temporary filesystem that even other root-owned processes cannot see or browse through.Dan dibandingkan dengan chroot, dengan chrootfile terlihat oleh orang lain. Ini luar biasa, dan kalimat itu mungkin harus seperti di bagian atas jawabannya. Diberi +1
Sergiy Kolodyazhnyy
1
Tidak ada yang lolos dari root! Menggunakan nsenterAnda dapat memasuki namespace dan melihat file-file sementara. Dengan asumsi hanya satu unshare (yang memiliki tempdir), maka sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -pakan memungkinkan konten untuk dilihat
earcam
2

Jika Anda memiliki bubblewrap diinstal pada sistem Anda, Anda dapat melakukannya dengan mudah dalam satu langkah:

bwrap --dev-bind / / --tmpfs /tmp bash

Pada contoh di atas, inner bash akan memiliki tampilan sendiri di / tmp.

Solusi yang terinspirasi oleh jawaban @ Ramesh-s - terima kasih untuk itu!

VasyaNovikov
sumber