bwrap - ยูทิลิตีการตั้งค่าคอนเทนเนอร์
bwrap [OPTION...] [COMMAND]
bwrap เป็นตัวช่วยพิเศษสำหรับการตั้งค่าคอนเทนเนอร์ คุณไม่น่าจะใช้โดยตรงจาก commandline แม้ว่าจะเป็นไปได้ก็ตาม
มันทำงานโดยการสร้างเนมสเปซระบบไฟล์ใหม่ที่ว่างเปล่าโดยที่รูทอยู่บน tmpfs ที่มองไม่เห็นจากโฮสต์ และจะถูกล้างข้อมูลโดยอัตโนมัติเมื่อกระบวนการสุดท้ายออก จากนั้นคุณสามารถใช้ตัวเลือกบรรทัดคำสั่งเพื่อสร้างระบบไฟล์รูทและสภาพแวดล้อมการประมวลผลสำหรับคำสั่งที่จะทำงานในเนมสเปซ
ตามค่าเริ่มต้น bwrap จะสร้างเนมสเปซสำหรับเชื่อมต่อใหม่สำหรับแซนด์บ็อกซ์ นอกจากนี้ยังเลือกที่จะตั้งค่าผู้ใช้ใหม่, ipc, pid, เครือข่ายและ uts เนมสเปซ (แต่โปรดทราบว่าจำเป็นต้องใช้เนมสเปซผู้ใช้หากไม่ได้ติดตั้ง bwrap setuid root) แอปพลิเคชันในแซนด์บ็อกซ์สามารถทำงานได้ด้วย UID และ GID ที่แตกต่างกัน
หากจำเป็น (เช่น เมื่อใช้เนมสเปซ PID) bwrap กำลังเรียกใช้กระบวนการ pid 1 ขั้นต่ำในแซนด์บ็อกซ์ที่รับผิดชอบในการเก็บเกี่ยวซอมบี้ นอกจากนี้ยังตรวจพบเมื่อกระบวนการสมัครเริ่มต้น (pid 2) ตายและรายงานสถานะการออกกลับไปยังผู้วางไข่ดั้งเดิม กระบวนการ pid 1 ออกเพื่อล้างข้อมูลในแซนด์บ็อกซ์เมื่อไม่มีกระบวนการอื่นในแซนด์บ็อกซ์เหลืออยู่
เมื่อใช้ตัวเลือกหลายครั้ง ตัวเลือกสุดท้ายจะชนะ เว้นแต่จะระบุไว้เป็นอย่างอื่น
พิมพ์วิธีใช้และออก
ฉบับพิมพ์
แยกวิเคราะห์อาร์กิวเมนต์ที่คั่นด้วย nul จากตัวอธิบายไฟล์ที่กำหนด ตัวเลือกนี้สามารถใช้ได้หลายครั้งเพื่อแยกวิเคราะห์ตัวเลือกจากหลายแหล่ง
สร้างเนมสเปซผู้ใช้ใหม่
สร้างเนมสเปซผู้ใช้ใหม่หากเป็นไปได้ ให้ข้ามไป
สร้างเนมสเปซ ipc ใหม่
สร้างเนมสเปซ pid ใหม่
สร้างเนมสเปซเครือข่ายใหม่
สร้างเนมสเปซ uts ใหม่
สร้างเนมสเปซ cgroup ใหม่
สร้างเนมสเปซกลุ่ม cgroup ใหม่ ถ้าเป็นไปได้ ให้ข้ามไป
ยกเลิกการแชร์เนมสเปซที่เป็นไปได้ทั้งหมด ปัจจุบันเทียบเท่ากับ: --unshare-user-try --unshare-ipc --unshare-pid --unshare-net --unshare-uts --unshare-cgroup-ลอง
รักษาเนมสเปซของเครือข่าย โดยแทนที่ --unshare-all หรือ --unshare-net ก่อนหน้านี้
ใช้เนมสเปซผู้ใช้ที่มีอยู่แทนการสร้างใหม่ เนมสเปซต้องเป็นไปตามข้อกำหนดการอนุญาตสำหรับ setns() ซึ่งโดยทั่วไปหมายความว่าเนมสเปซจะต้องสืบทอดมาจากเนมสเปซผู้ใช้ที่ใช้งานอยู่ในปัจจุบัน ซึ่งเป็นเจ้าของโดยผู้ใช้คนเดียวกัน
สิ่งนี้เข้ากันไม่ได้กับ --unshare-user และใช้งานไม่ได้ใน bubblewrap รุ่น setuid
หลังจากตั้งค่าเนมสเปซใหม่แล้ว ให้เปลี่ยนเป็นเนมสเปซที่ระบุ เพื่อให้ใช้งานได้ เนมสเปซที่ระบุต้องเป็นลูกหลานของเนมสเปซผู้ใช้ที่ใช้สำหรับการตั้งค่า ดังนั้นสิ่งนี้จะมีประโยชน์เมื่อใช้ร่วมกับ --userns เท่านั้น
สิ่งนี้มีประโยชน์เพราะบางครั้ง bubblewrap เองจะสร้างเนมสเปซผู้ใช้ที่ซ้อนกัน (เพื่อแก้ไขปัญหาเคอร์เนลบางอย่าง) และสามารถใช้ --userns2 เพื่อป้อนข้อมูลเหล่านี้ได้
ป้องกันไม่ให้กระบวนการในแซนด์บ็อกซ์สร้างเนมสเปซผู้ใช้เพิ่มเติม เพื่อไม่ให้จัดเรียงเนมสเปซระบบไฟล์ใหม่หรือแก้ไขเนมสเปซอื่นๆ ที่ซับซ้อนกว่านี้ ขณะนี้ดำเนินการโดยการตั้งค่า user.max_user_namespaces sysctl เป็น 1 จากนั้นป้อนเนมสเปซผู้ใช้ที่ซ้อนกันซึ่งไม่สามารถเพิ่มขีดจำกัดนั้นในเนมสเปซภายนอก ตัวเลือกนี้ต้องใช้ --unshare-user และไม่ทำงานใน bubblewrap รุ่น setuid
ยืนยันว่ากระบวนการในแซนด์บ็อกซ์ถูกป้องกันไม่ให้สร้างเนมสเปซผู้ใช้เพิ่มเติม แต่ไม่มีการดำเนินการใดเป็นพิเศษเพื่อป้องกันสิ่งนั้น ตัวอย่างเช่น สามารถใช้ร่วมกับ --userns เพื่อตรวจสอบว่าเนมสเปซผู้ใช้ที่กำหนดได้รับการตั้งค่าแล้วเพื่อป้องกันการสร้างเนมสเปซผู้ใช้เพิ่มเติม
ใช้เนมสเปซ pid ที่มีอยู่แทนการสร้าง สิ่งนี้มักจะใช้กับ --userns เนื่องจากเนมสเปซ pid จะต้องเป็นเจ้าของโดยเนมสเปซผู้ใช้เดียวกันกับที่ bwrap ใช้
โปรดทราบว่าสิ่งนี้สามารถรวมกับ --unshare-pid และในกรณีนี้ หมายความว่าแซนด์บ็อกซ์จะอยู่ในเนมสเปซ pid ของตัวเอง ซึ่งเป็นลูกของการส่งผ่านในอันเดียว
ใช้รหัสผู้ใช้ที่กำหนดเองในแซนด์บ็อกซ์ (ต้องมี --unshare-user)
ใช้รหัสกลุ่มที่กำหนดเองในแซนด์บ็อกซ์ (ต้องมี --unshare-user)
ใช้ชื่อโฮสต์ที่กำหนดเองในแซนด์บ็อกซ์ (ต้องมี --unshare-uts)
เปลี่ยนไดเรกทอรีเป็น DIR
ตั้งค่าตัวแปรสภาพแวดล้อม
ยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อม
ยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อมทั้งหมด ยกเว้น PWD และตัวแปรอื่นๆ ที่กำหนดโดย --setenv
ล็อค DEST ในขณะที่แซนด์บ็อกซ์กำลังทำงาน ตัวเลือกนี้สามารถใช้ได้หลายครั้งเพื่อล็อกไฟล์หลายไฟล์
เปิดตัวอธิบายไฟล์นี้ไว้ในขณะที่แซนด์บ็อกซ์กำลังทำงาน
เหล่านี้คือการดำเนินการทั้งหมดที่แก้ไขระบบไฟล์โดยตรง หรือเมานต์ข้อมูลในระบบไฟล์ สิ่งเหล่านี้ใช้ตามลำดับที่กำหนดเป็นอาร์กิวเมนต์
ไดเร็กทอรีหลักที่ขาดหายไปซึ่งจำเป็นสำหรับการสร้างปลายทางที่ระบุจะถูกสร้างขึ้นโดยอัตโนมัติตามต้องการ โดยปกติการอนุญาตจะถูกตั้งค่าเป็น 0755 (rwxr-xr-x) อย่างไรก็ตาม หากตัวเลือก --perms มีผล และตั้งค่าการอนุญาตสำหรับกลุ่มหรืออื่นๆ เป็นศูนย์ ไดเร็กทอรีหลักที่สร้างขึ้นใหม่จะตั้งค่าการอนุญาตที่เกี่ยวข้องเป็นศูนย์ด้วย --size แก้ไขขนาดของส่วนต่อเชื่อมที่สร้างขึ้นก่อนหน้าการกระทำ --tmpfs --perms และ --size สามารถรวมกันได้
ตัวเลือกนี้ไม่ได้ทำอะไรเลยและต้องตามด้วยตัวเลือกใดตัวเลือกหนึ่งที่มีผลกระทบ กำหนดสิทธิ์สำหรับการดำเนินการถัดไปเป็น OCTAL การดำเนินการที่ตามมาจะไม่ได้รับผลกระทบ ตัวอย่างเช่น
--perms 0700 --tmpfs /a --tmpfs /b
Note that --perms and --size can be combined:
--perms 0700 --size 10485760 --tmpfs /s
will apply permissions as well as a maximum size to the created tmpfs.
ตัวเลือกนี้ไม่ได้ทำอะไรเลยและต้องตามด้วย --tmpfs กำหนดขนาดเป็นไบต์สำหรับ tmpfs ถัดไป ตัวอย่างเช่น,
--size 10485760 --tmpfs /tmp
จะสร้าง tmpfs ที่ /tmp ขนาด 10MiB การดำเนินการที่ตามมาจะไม่ได้รับผลกระทบ ตัวอย่างเช่น
--size 10485760 --tmpfs /a --tmpfs /b
จะเมานต์ /a ด้วยขนาด 10MiB จากนั้นกลับสู่ขนาดเริ่มต้นสำหรับ /b
โปรดทราบว่าสามารถใช้ --perms และ --size ร่วมกันได้:
--size 10485760 --perms 0700 --tmpfs /s
จะใช้สิทธิ์และขนาดสูงสุดกับ tmpfs ที่สร้างขึ้น
เชื่อมโยงเมานต์เส้นทางโฮสต์ SRC บน DEST
เท่ากับ --ผูก แต่ละเว้น SRC ที่ไม่มีอยู่จริง
เชื่อมต่อเส้นทางโฮสต์ SRC บน DEST ทำให้สามารถเข้าถึงอุปกรณ์ได้
เท่ากับ --dev-bind แต่ละเว้น SRC ที่ไม่มีอยู่จริง
ผูกเมาต์เส้นทางโฮสต์ SRC แบบอ่านอย่างเดียวบน DEST
เท่ากับ --ro-bind แต่ละเว้น SRC ที่ไม่มีอยู่จริง
ติดตั้งเส้นทาง DEST ใหม่เป็นแบบอ่านอย่างเดียว ใช้งานได้บนจุดต่อเชื่อมที่ระบุเท่านั้น โดยไม่ต้องเปลี่ยนจุดต่อเชื่อมอื่นใดภายใต้เส้นทางที่ระบุ
เมานต์ procfs บน DEST
เมานต์ devtmpfs ใหม่บน DEST
เมานต์ tmpfs ใหม่บน DEST หากตัวเลือกก่อนหน้าคือ --perms จะเป็นการตั้งค่าโหมดของ tmpfs มิฉะนั้น tmpfs จะมีโหมด 0755 หากตัวเลือกก่อนหน้าคือ --size ตัวเลือกนี้จะตั้งค่าขนาดเป็นไบต์ของ tmpfs มิฉะนั้น tmpfs จะมีขนาดเริ่มต้น
เมานต์ mqueue ใหม่บน DEST
สร้างไดเร็กทอรีที่ DEST หากมีไดเร็กทอรีอยู่แล้ว การอนุญาตจะไม่ถูกแก้ไข โดยไม่สนใจ --perms (ใช้ --chmod หากต้องเปลี่ยนการอนุญาตของไดเร็กทอรีที่มีอยู่) หากไดเร็กทอรีถูกสร้างขึ้นใหม่และตัวเลือกก่อนหน้านี้คือ --perms จะเป็นการตั้งค่าโหมดของไดเร็กทอรี มิฉะนั้น ไดเร็กทอรีที่สร้างขึ้นใหม่จะมีโหมด 0755
คัดลอกจากตัวอธิบายไฟล์ FD ไปยัง DEST หากตัวเลือกก่อนหน้าคือ --perms จะเป็นการตั้งค่าโหมดของไฟล์ใหม่ มิฉะนั้น ไฟล์จะมีโหมด 0666 (โปรดทราบว่าโหมดนี้ไม่เหมือนกับ --bind-data)
คัดลอกจากไฟล์ descriptor FD ไปยังไฟล์ที่เชื่อมต่อแบบผูกบน DEST หากตัวเลือกก่อนหน้าคือ --perms จะเป็นการตั้งค่าโหมดของไฟล์ใหม่ มิฉะนั้น ไฟล์จะมีโหมด 0600 (โปรดทราบว่าโหมดนี้ไม่เหมือนกับ --file)
คัดลอกจากไฟล์ descriptor FD ไปยังไฟล์ที่เชื่อมต่อแบบอ่านอย่างเดียวบน DEST หากตัวเลือกก่อนหน้าคือ --perms จะเป็นการตั้งค่าโหมดของไฟล์ใหม่ มิฉะนั้น ไฟล์จะมีโหมด 0600 (โปรดทราบว่าโหมดนี้ไม่เหมือนกับ --file)
สร้าง symlink ที่ DEST ด้วย SRC เป้าหมาย
ตั้งค่าสิทธิ์ของ PATH ซึ่งต้องมีอยู่แล้วเป็น OCTAL
โหลดและใช้กฎ seccomp จาก FD กฎต้องอยู่ในรูปแบบของโปรแกรม cBPF ที่คอมไพล์ ซึ่งสร้างโดย seccomp_export_bpf หากกำหนดตัวเลือกนี้มากกว่าหนึ่งครั้ง ระบบจะใช้ตัวเลือกสุดท้ายเท่านั้น ใช้ --add-seccomp-fd หากจำเป็นต้องใช้โปรแกรม seccomp หลายโปรแกรม
โหลดและใช้กฎ seccomp จาก FD กฎต้องอยู่ในรูปแบบของโปรแกรม cBPF ที่คอมไพล์ ซึ่งสร้างโดย seccomp_export_bpf ตัวเลือกนี้สามารถทำซ้ำได้ ซึ่งในกรณีนี้โปรแกรม seccomp ทั้งหมดจะถูกโหลดตามลำดับที่กำหนด (โปรดทราบว่าเคอร์เนลจะประเมินค่าเหล่านั้นในลำดับย้อนกลับ ดังนั้นโปรแกรมสุดท้ายในบรรทัดคำสั่ง bwrap จะได้รับการประเมินก่อน) ทั้งหมด ยกเว้นสุดท้าย ต้องอนุญาตให้ใช้ PR_SET_SECCOMP prctl ไม่สามารถรวมตัวเลือกนี้กับ --seccomp
Exec Label จากแซนด์บ็อกซ์ ในระบบ SELinux คุณสามารถระบุบริบท SELinux สำหรับกระบวนการแซนด์บ็อกซ์ได้
ป้ายกำกับไฟล์สำหรับเนื้อหาแซนด์บ็อกซ์ชั่วคราว ในระบบ SELinux คุณสามารถระบุบริบท SELinux สำหรับเนื้อหาแซนด์บ็อกซ์ได้
ปิดกั้นแซนด์บ็อกซ์ในการอ่านจาก FD จนกว่าจะมีข้อมูลบางส่วน
อย่าเริ่มต้นเนมสเปซผู้ใช้ แต่รอ FD จนกว่าจะพร้อม สิ่งนี้ทำให้กระบวนการภายนอก (เช่น newuidmap/newgidmap) ตั้งค่าเนมสเปซผู้ใช้ก่อนที่กระบวนการแซนด์บ็อกซ์จะใช้มัน
เขียนข้อมูลในรูปแบบ JSON เกี่ยวกับแซนด์บ็อกซ์ไปยัง FD
มีการเขียนเอกสาร JSON หลายฉบับไปยัง FD หนึ่งรายการต่อบรรทัด ("รูปแบบ JSON บรรทัด"[1]) แต่ละบรรทัดเป็นวัตถุ JSON เดียว หลังจาก bwrap เริ่มกระบวนการย่อยภายในแซนด์บ็อกซ์แล้ว ก็จะเขียนวัตถุที่มีสมาชิก child-pid ไปยัง --json-status-fd (ซึ่งจะเป็นการทำซ้ำ < แข็งแกร่ง>--info-fd) ค่าที่สอดคล้องกันคือ ID กระบวนการของกระบวนการลูกในเนมสเปซ pid ที่เรียกใช้ bwrap หากมี ID เนมสเปซจะรวมอยู่ในวัตถุด้วย child-pid; อีกครั้ง ซึ่งจะซ้ำกับ --info-fd ที่เก่ากว่า เมื่อกระบวนการย่อยภายในแซนด์บ็อกซ์ออกจาก bwrap จะเขียนวัตถุที่มีสมาชิกรหัสออก จากนั้นปิด --json-status-fd ค่าที่สอดคล้องกับ exit-code คือสถานะการออกของ child ในการเข้ารหัสเชลล์ตามปกติ (n หากออกตามปกติด้วยสถานะ n หรือ 128+n หากถูกฆ่าโดยสัญญาณ n) อาจเพิ่มสมาชิกอื่นๆ ลงในออบเจ็กต์เหล่านั้นใน bwrap เวอร์ชันอนาคต และออบเจ็กต์ JSON อื่นๆ อาจเพิ่มก่อนหรือหลังออบเจ็กต์ปัจจุบัน ดังนั้นผู้อ่านต้องละเว้นสมาชิกและออบเจ็กต์ที่พวกเขาไม่เข้าใจ
สร้างเทอร์มินัลเซสชันใหม่สำหรับแซนด์บ็อกซ์ (เรียก setid()) สิ่งนี้จะตัดการเชื่อมต่อแซนด์บ็อกซ์ออกจากเทอร์มินัลการควบคุม ซึ่งหมายความว่าแซนด์บ็อกซ์ไม่สามารถแทรกอินพุตเข้าไปในเทอร์มินัลได้
หมายเหตุ: ในแซนด์บ็อกซ์ทั่วไป หากคุณไม่ได้ใช้ --new-session ขอแนะนำให้ใช้ seccomp เพื่อยกเลิกการอนุญาต TIOCSTI ioctl มิฉะนั้น แอปพลิเคชันสามารถป้อนอินพุตจากแป้นพิมพ์ไปยังเทอร์มินัลได้
ตรวจสอบให้แน่ใจว่ากระบวนการลูก (COMMAND) ตายเมื่อพาเรนต์ bwraps ตาย ฆ่า (SIGKILL) กระบวนการแซนด์บ็อกซ์ bwrap ทั้งหมดในลำดับจากพาเรนต์ไปยังลูก รวมถึงกระบวนการ COMMAND เมื่อพาเรนต์ bwrap หรือ bwraps ตาย ดู prctl, PR_SET_PDEATHSIG
อย่าสร้างกระบวนการด้วย PID=1 ในแซนด์บ็อกซ์เพื่อเก็บเกี่ยวกระบวนการลูก
เพิ่มความสามารถที่ระบุเมื่อทำงานในฐานะผู้ใช้ที่มีสิทธิ์ ยอมรับค่าพิเศษ ALL เพื่อเพิ่มตัวพิมพ์ใหญ่ที่อนุญาตทั้งหมด
ลดความสามารถที่ระบุเมื่อทำงานในฐานะผู้ใช้ที่มีสิทธิ์ ยอมรับค่าพิเศษ ALL เพื่อทิ้งตัวพิมพ์ใหญ่ทั้งหมด ตามค่าเริ่มต้น จะไม่มีตัวพิมพ์ใหญ่เหลืออยู่ในกระบวนการแซนด์บ็อกซ์ ตัวเลือก --cap-add และ --cap-drop จะถูกประมวลผลตามลำดับที่ระบุไว้ในบรรทัดคำสั่ง โปรดระวังตามลำดับที่ระบุไว้
ใช้เป็น cwd ในแซนด์บ็อกซ์หากไม่ได้ระบุ --chdir ไว้อย่างชัดเจน และไม่มี cwd ปัจจุบันอยู่ในแซนด์บ็อกซ์ สามารถใช้ตัวเลือก --setenv เพื่อแทนที่ค่าที่ใช้ที่นี่
คำสั่ง bwrap จะส่งคืนสถานะการออกของกระบวนการสมัครเริ่มต้น (pid 2 ในแซนด์บ็อกซ์)
1. รูปแบบ "บรรทัด JSON": https://jsonlines.org/