ต่อจุดเมานต์ระบบไฟล์ส่วนตัวของกระบวนการ


24

ฉันกำลังตรวจสอบunshareคำสั่งและเป็นไปตามหน้า man

   unshare - run program with some namespaces unshared from parent

ฉันยังเห็นว่ามีเนมสเปซประเภทหนึ่งที่ระบุว่าเป็น

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

อะไรคือวัตถุประสงค์ของเนมสเปซเมานต์นี้? ฉันพยายามที่จะเข้าใจแนวคิดนี้ด้วยความช่วยเหลือของตัวอย่าง



@Gilles ขอบคุณ ฉันจะตรวจสอบมันออกมา. ในระหว่างนี้โปรดแจ้งให้เราทราบหากต้องการสิ่งอื่นในคำตอบ
Ramesh

คำตอบ:


29

การรันunshare -mให้กระบวนการเรียกใช้สำเนาส่วนบุคคลของเนมสเปซการเมานท์และยังยกเลิกการแชร์แอตทริบิวต์ของระบบไฟล์เพื่อที่จะไม่แชร์ไดเรกทอรีรากไดเรกทอรีปัจจุบันหรือแอตทริบิวต์ umask กับกระบวนการอื่น ๆ อีกต่อไป

ดังนั้นวรรคข้างต้นพูดอะไร? ให้เราลองและเข้าใจโดยใช้ตัวอย่างง่ายๆ

อาคาร 1:

ฉันทำตามคำสั่งด้านล่างในเทอร์มินัลแรก

#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 

คำสั่งสุดท้ายให้ผลลัพธ์เป็น

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

ตอนนี้ฉันก็ทำตามคำสั่งต่อไปนี้เช่นกัน

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

ผลลัพธ์ของlsคำสั่งคือ

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

ดังนั้นเรื่องใหญ่ในการทำสิ่งนี้คืออะไร? ทำไมฉันต้องทำมัน?

ฉันเปิดเทอร์มินัลอื่นตอนนี้ ( เทอร์มินัล 2 ) และทำตามคำสั่งด้านล่าง

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

ผลลัพธ์มีดังนี้

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

ไฟล์helloและhelloagainไม่สามารถมองเห็นได้และฉันยังเข้าสู่ระบบในฐานะ root เพื่อตรวจสอบไฟล์เหล่านี้ ดังนั้นข้อดีคือคุณสมบัตินี้ทำให้เราสามารถสร้างระบบไฟล์ชั่วคราวส่วนตัวที่แม้แต่กระบวนการที่เป็นเจ้าของรูทอื่น ๆ ก็ไม่สามารถมองเห็นหรือเรียกดูได้

จากหน้าคนของunshare,

mount namespace การติดตั้งและยกเลิกการต่อเชื่อมระบบไฟล์จะไม่ส่งผลกระทบต่อส่วนที่เหลือของระบบ (แฟล็ก CLONE_NEWNS) ยกเว้นระบบไฟล์ที่ทำเครื่องหมายไว้อย่างชัดเจนว่าใช้ร่วมกัน (ด้วย mount --make-shared; ดู / proc / self / mountinfo

ขอแนะนำให้ใช้ Mount --make-rprivate หรือ Mount --make-rslave หลังจากยกเลิกการแชร์ - เมานท์เพื่อให้แน่ใจว่าจุดเมานท์ในเนมสเปซใหม่นั้นไม่ได้ใช้ร่วมกันจากเนมสเปซผู้ปกครองจริงๆ

หน่วยความจำที่ใช้สำหรับเนมสเปซคือ VFS ซึ่งมาจากเคอร์เนล และ - ถ้าเราตั้งค่าไว้ตั้งแต่แรก - เราสามารถสร้างสภาพแวดล้อมเสมือนทั้งหมดที่เราเป็นผู้ใช้รูทโดยไม่มีสิทธิ์รูท

อ้างอิง:

ตัวอย่างมีการใช้กรอบโดยใช้รายละเอียดจากการโพสต์บล็อกนี้ นอกจากนี้คำพูดของคำตอบนี้มาจากคำอธิบายที่ยอดเยี่ยมนี้จากไมค์ อีกอ่านที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้สามารถพบได้จากคำตอบจากที่นี่


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.และเมื่อเปรียบเทียบchrootกับchrootไฟล์อื่นจะปรากฏให้ผู้อื่นเห็น นี่เป็นเรื่องที่น่าอัศจรรย์และประโยคนั้นน่าจะเป็นคำตอบที่ดีที่สุด +1
Sergiy Kolodyazhnyy

1
ไม่มีอะไรหนีรอดจากราก! การใช้nsenterคุณสามารถป้อนเนมสเปซและดูไฟล์ชั่วคราว สมมติว่ามีเพียงหนึ่ง unshare (หนึ่งในเจ้าของ tempdir) จากนั้นsudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -pจะอนุญาตให้ดูเนื้อหาได้
earcam

2

หากคุณติดตั้งbubblewrapไว้ในระบบของคุณคุณสามารถทำได้อย่างง่ายดายในขั้นตอนเดียว:

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

ในตัวอย่างด้านบนทุบตีภายในจะมีมุมมองของตนเองใน / tmp

โซลูชันได้แรงบันดาลใจจากคำตอบของ @ Ramesh - ขอบคุณสำหรับมัน!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.