işlem başına özel dosya sistemi bağlama noktaları


24

unshareKomutu kontrol ediyordum ve adam sayfasına göre,

   unshare - run program with some namespaces unshared from parent

Ayrıca şöyle bir ad alanı olduğunu görüyorum:

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

Bu takma ad alanının tam olarak amacı nedir ? Bu kavramı bazı örneklerin yardımıyla anlamaya çalışıyorum.



@Gilles, teşekkürler. Kontrol edeceğim. Bu arada, lütfen cevaba başka bir şey eklenmesi gerekiyorsa bana bildirin.
Ramesh

Yanıtlar:


29

Çalıştırma unshare -mçağıran sürece mount ad alanının özel bir kopyasını verir ve ayrıca dosya sistemi özniteliklerini paylaşır, böylece kök dizinini, geçerli dizini veya umask özniteliklerini başka bir işlemle paylaşmaz.

Peki yukarıdaki paragrafta ne yazıyor? Basit bir örnek kullanarak deneyelim ve anlayalım.

Terminal 1:

İlk terminalde aşağıdaki komutları yapıyorum.

#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 

Son komut bana çıktısını verir.

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

Şimdi aşağıdaki komutları da yaptım.

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

lsKomutun çıktısı ,

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

Öyleyse bütün bunları yaparken asıl mesele nedir? Neden yapmalıyım?

Şimdi başka bir terminal açtım ( terminal 2 ) ve aşağıdaki komutları yapıyorum.

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

Çıktı aşağıdaki gibidir.

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

Dosyalar hellove helloagaingörünmez ve hatta bu dosyaları kontrol etmek için root olarak oturum. Bu yüzden avantaj, bu özellik, diğer kök işlemlerinin bile göremediği veya göz atamayacağı özel bir geçici dosya sistemi oluşturmamızı sağlıyor.

Man sayfasından unshare,

mount ad alanı Dosya sistemlerinin montajı ve bağlantılarının kaldırılması, açıkça paylaşılan olarak işaretlenen dosya sistemleri dışında (paylaşılan -make-paylaşılan; paylaşılan bayraklar için bkz. / proc / self / mountinfo), sistemin geri kalanını etkilemez (CLONE_NEWNS bayrağı).

Yeni ad alanındaki bağlanma noktalarının gerçekten ana ad alanından paylaşılmadığından emin olmak için mount --make-rprivate veya mount --make-rslave'yi paylaşmadan sonra kullanmanız önerilir.

Ad alanı için kullanılan bellek, çekirdekten gelen VFS'dir. Ve - ilk etapta doğru kurarsak - root kullanıcısı olduğumuz tüm sanal ortamları root izinleri olmadan yaratabiliriz.

Referanslar:

Örnek, bu blog gönderisinden ayrıntılar kullanılarak çerçevelenmiştir . Ayrıca, bu cevabın alıntıları Mike'ın bu harika açıklamasından . Bununla ilgili bir başka harika okuma buradan cevap olarak bulunabilir .


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.Ve karşılaştırıldığında chroot, chrootdosyaları başkaları tarafından görülebilir. Bu şaşırtıcı ve bu cümle muhtemelen cevabın tepesinde olmalı. +1 yaptı.
Sergiy Kolodyazhnyy

1
Hiçbir şey kökünden kaçamaz! Kullanarak nsenterad alanına girebilir ve geçici dosyaları görüntüleyebilirsiniz. Yalnızca bir sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -p
paylaşılmıyorsa

2

Sisteminizde kurulu bubblewrap varsa , tek adımda kolayca yapabilirsiniz:

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

Yukarıdaki örnekte, iç bash / tmp ile ilgili kendi görüşüne sahip olacaktır.

@ Ramesh-s cevabından ilham alan çözüm - bunun için teşekkürler!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.