bwrap - คู่มืออ้างอิง ตัวเลือก ตัวอย่างคำสั่ง


ชื่อ

bwrap - ยูทิลิตีการตั้งค่าคอนเทนเนอร์

เรื่องย่อ

bwrap [OPTION...] [COMMAND]

คำอธิบาย

bwrap เป็นตัวช่วยพิเศษสำหรับการตั้งค่าคอนเทนเนอร์ คุณไม่น่าจะใช้โดยตรงจาก commandline แม้ว่าจะเป็นไปได้ก็ตาม

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

ตามค่าเริ่มต้น bwrap จะสร้างเนมสเปซสำหรับเชื่อมต่อใหม่สำหรับแซนด์บ็อกซ์ นอกจากนี้ยังเลือกที่จะตั้งค่าผู้ใช้ใหม่, ipc, pid, เครือข่ายและ uts เนมสเปซ (แต่โปรดทราบว่าจำเป็นต้องใช้เนมสเปซผู้ใช้หากไม่ได้ติดตั้ง bwrap setuid root) แอปพลิเคชันในแซนด์บ็อกซ์สามารถทำงานได้ด้วย UID และ GID ที่แตกต่างกัน

หากจำเป็น (เช่น เมื่อใช้เนมสเปซ PID) bwrap กำลังเรียกใช้กระบวนการ pid 1 ขั้นต่ำในแซนด์บ็อกซ์ที่รับผิดชอบในการเก็บเกี่ยวซอมบี้ นอกจากนี้ยังตรวจพบเมื่อกระบวนการสมัครเริ่มต้น (pid 2) ตายและรายงานสถานะการออกกลับไปยังผู้วางไข่ดั้งเดิม กระบวนการ pid 1 ออกเพื่อล้างข้อมูลในแซนด์บ็อกซ์เมื่อไม่มีกระบวนการอื่นในแซนด์บ็อกซ์เหลืออยู่

ตัวเลือก

เมื่อใช้ตัวเลือกหลายครั้ง ตัวเลือกสุดท้ายจะชนะ เว้นแต่จะระบุไว้เป็นอย่างอื่น

ตัวเลือกทั่วไป:

--help

พิมพ์วิธีใช้และออก

--version

ฉบับพิมพ์

--args FD

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

ตัวเลือกที่เกี่ยวข้องกับเนมสเปซเคอร์เนล:

--unshare-user

สร้างเนมสเปซผู้ใช้ใหม่

--unshare-user-try

สร้างเนมสเปซผู้ใช้ใหม่หากเป็นไปได้ ให้ข้ามไป

--unshare-ipc

สร้างเนมสเปซ ipc ใหม่

--unshare-pid

สร้างเนมสเปซ pid ใหม่

--unshare-net

สร้างเนมสเปซเครือข่ายใหม่

--unshare-uts

สร้างเนมสเปซ uts ใหม่

--unshare-cgroup

สร้างเนมสเปซ cgroup ใหม่

--unshare-cgroup-try

สร้างเนมสเปซกลุ่ม cgroup ใหม่ ถ้าเป็นไปได้ ให้ข้ามไป

--unshare-all

ยกเลิกการแชร์เนมสเปซที่เป็นไปได้ทั้งหมด ปัจจุบันเทียบเท่ากับ: --unshare-user-try --unshare-ipc --unshare-pid --unshare-net --unshare-uts --unshare-cgroup-ลอง

--share-net

รักษาเนมสเปซของเครือข่าย โดยแทนที่ --unshare-all หรือ --unshare-net ก่อนหน้านี้

--userns FD

ใช้เนมสเปซผู้ใช้ที่มีอยู่แทนการสร้างใหม่ เนมสเปซต้องเป็นไปตามข้อกำหนดการอนุญาตสำหรับ setns() ซึ่งโดยทั่วไปหมายความว่าเนมสเปซจะต้องสืบทอดมาจากเนมสเปซผู้ใช้ที่ใช้งานอยู่ในปัจจุบัน ซึ่งเป็นเจ้าของโดยผู้ใช้คนเดียวกัน

สิ่งนี้เข้ากันไม่ได้กับ --unshare-user และใช้งานไม่ได้ใน bubblewrap รุ่น setuid

--userns2 FD

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

สิ่งนี้มีประโยชน์เพราะบางครั้ง bubblewrap เองจะสร้างเนมสเปซผู้ใช้ที่ซ้อนกัน (เพื่อแก้ไขปัญหาเคอร์เนลบางอย่าง) และสามารถใช้ --userns2 เพื่อป้อนข้อมูลเหล่านี้ได้

--disable-userns

ป้องกันไม่ให้กระบวนการในแซนด์บ็อกซ์สร้างเนมสเปซผู้ใช้เพิ่มเติม เพื่อไม่ให้จัดเรียงเนมสเปซระบบไฟล์ใหม่หรือแก้ไขเนมสเปซอื่นๆ ที่ซับซ้อนกว่านี้ ขณะนี้ดำเนินการโดยการตั้งค่า user.max_user_namespaces sysctl เป็น 1 จากนั้นป้อนเนมสเปซผู้ใช้ที่ซ้อนกันซึ่งไม่สามารถเพิ่มขีดจำกัดนั้นในเนมสเปซภายนอก ตัวเลือกนี้ต้องใช้ --unshare-user และไม่ทำงานใน bubblewrap รุ่น setuid

--assert-userns-disabled

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

--pidns FD

ใช้เนมสเปซ pid ที่มีอยู่แทนการสร้าง สิ่งนี้มักจะใช้กับ --userns เนื่องจากเนมสเปซ pid จะต้องเป็นเจ้าของโดยเนมสเปซผู้ใช้เดียวกันกับที่ bwrap ใช้

โปรดทราบว่าสิ่งนี้สามารถรวมกับ --unshare-pid และในกรณีนี้ หมายความว่าแซนด์บ็อกซ์จะอยู่ในเนมสเปซ pid ของตัวเอง ซึ่งเป็นลูกของการส่งผ่านในอันเดียว

--uid UID

ใช้รหัสผู้ใช้ที่กำหนดเองในแซนด์บ็อกซ์ (ต้องมี --unshare-user)

--gid GID

ใช้รหัสกลุ่มที่กำหนดเองในแซนด์บ็อกซ์ (ต้องมี --unshare-user)

--hostname HOSTNAME

ใช้ชื่อโฮสต์ที่กำหนดเองในแซนด์บ็อกซ์ (ต้องมี --unshare-uts)

ตัวเลือกเกี่ยวกับการตั้งค่าสภาพแวดล้อม:

--chdir DIR

เปลี่ยนไดเรกทอรีเป็น DIR

--setenv VAR VALUE

ตั้งค่าตัวแปรสภาพแวดล้อม

--unsetenv VAR

ยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อม

--clearenv

ยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อมทั้งหมด ยกเว้น PWD และตัวแปรอื่นๆ ที่กำหนดโดย --setenv

ตัวเลือกสำหรับการตรวจสอบแซนด์บ็อกซ์จากภายนอก:

--lock-file DEST

ล็อค DEST ในขณะที่แซนด์บ็อกซ์กำลังทำงาน ตัวเลือกนี้สามารถใช้ได้หลายครั้งเพื่อล็อกไฟล์หลายไฟล์

--sync-fd FD

เปิดตัวอธิบายไฟล์นี้ไว้ในขณะที่แซนด์บ็อกซ์กำลังทำงาน

ตัวเลือกที่เกี่ยวข้องกับระบบไฟล์:

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

ไดเร็กทอรีหลักที่ขาดหายไปซึ่งจำเป็นสำหรับการสร้างปลายทางที่ระบุจะถูกสร้างขึ้นโดยอัตโนมัติตามต้องการ โดยปกติการอนุญาตจะถูกตั้งค่าเป็น 0755 (rwxr-xr-x) อย่างไรก็ตาม หากตัวเลือก --perms มีผล และตั้งค่าการอนุญาตสำหรับกลุ่มหรืออื่นๆ เป็นศูนย์ ไดเร็กทอรีหลักที่สร้างขึ้นใหม่จะตั้งค่าการอนุญาตที่เกี่ยวข้องเป็นศูนย์ด้วย --size แก้ไขขนาดของส่วนต่อเชื่อมที่สร้างขึ้นก่อนหน้าการกระทำ --tmpfs --perms และ --size สามารถรวมกันได้

--perms OCTAL

ตัวเลือกนี้ไม่ได้ทำอะไรเลยและต้องตามด้วยตัวเลือกใดตัวเลือกหนึ่งที่มีผลกระทบ กำหนดสิทธิ์สำหรับการดำเนินการถัดไปเป็น 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.

--size BYTES

ตัวเลือกนี้ไม่ได้ทำอะไรเลยและต้องตามด้วย --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 ที่สร้างขึ้น

--bind SRC DEST

เชื่อมโยงเมานต์เส้นทางโฮสต์ SRC บน DEST

--bind-try SRC DEST

เท่ากับ --ผูก แต่ละเว้น SRC ที่ไม่มีอยู่จริง

--dev-bind SRC DEST

เชื่อมต่อเส้นทางโฮสต์ SRC บน DEST ทำให้สามารถเข้าถึงอุปกรณ์ได้

--dev-bind-try SRC DEST

เท่ากับ --dev-bind แต่ละเว้น SRC ที่ไม่มีอยู่จริง

--ro-bind SRC DEST

ผูกเมาต์เส้นทางโฮสต์ SRC แบบอ่านอย่างเดียวบน DEST

--ro-bind-try SRC DEST

เท่ากับ --ro-bind แต่ละเว้น SRC ที่ไม่มีอยู่จริง

--remount-ro DEST

ติดตั้งเส้นทาง DEST ใหม่เป็นแบบอ่านอย่างเดียว ใช้งานได้บนจุดต่อเชื่อมที่ระบุเท่านั้น โดยไม่ต้องเปลี่ยนจุดต่อเชื่อมอื่นใดภายใต้เส้นทางที่ระบุ

--proc DEST

เมานต์ procfs บน DEST

--dev DEST

เมานต์ devtmpfs ใหม่บน DEST

--tmpfs DEST

เมานต์ tmpfs ใหม่บน DEST หากตัวเลือกก่อนหน้าคือ --perms จะเป็นการตั้งค่าโหมดของ tmpfs มิฉะนั้น tmpfs จะมีโหมด 0755 หากตัวเลือกก่อนหน้าคือ --size ตัวเลือกนี้จะตั้งค่าขนาดเป็นไบต์ของ tmpfs มิฉะนั้น tmpfs จะมีขนาดเริ่มต้น

--mqueue DEST

เมานต์ mqueue ใหม่บน DEST

--dir DEST

สร้างไดเร็กทอรีที่ DEST หากมีไดเร็กทอรีอยู่แล้ว การอนุญาตจะไม่ถูกแก้ไข โดยไม่สนใจ --perms (ใช้ --chmod หากต้องเปลี่ยนการอนุญาตของไดเร็กทอรีที่มีอยู่) หากไดเร็กทอรีถูกสร้างขึ้นใหม่และตัวเลือกก่อนหน้านี้คือ --perms จะเป็นการตั้งค่าโหมดของไดเร็กทอรี มิฉะนั้น ไดเร็กทอรีที่สร้างขึ้นใหม่จะมีโหมด 0755

--file FD DEST

คัดลอกจากตัวอธิบายไฟล์ FD ไปยัง DEST หากตัวเลือกก่อนหน้าคือ --perms จะเป็นการตั้งค่าโหมดของไฟล์ใหม่ มิฉะนั้น ไฟล์จะมีโหมด 0666 (โปรดทราบว่าโหมดนี้ไม่เหมือนกับ --bind-data)

--bind-data FD DEST

คัดลอกจากไฟล์ descriptor FD ไปยังไฟล์ที่เชื่อมต่อแบบผูกบน DEST หากตัวเลือกก่อนหน้าคือ --perms จะเป็นการตั้งค่าโหมดของไฟล์ใหม่ มิฉะนั้น ไฟล์จะมีโหมด 0600 (โปรดทราบว่าโหมดนี้ไม่เหมือนกับ --file)

--ro-bind-data FD DEST

คัดลอกจากไฟล์ descriptor FD ไปยังไฟล์ที่เชื่อมต่อแบบอ่านอย่างเดียวบน DEST หากตัวเลือกก่อนหน้าคือ --perms จะเป็นการตั้งค่าโหมดของไฟล์ใหม่ มิฉะนั้น ไฟล์จะมีโหมด 0600 (โปรดทราบว่าโหมดนี้ไม่เหมือนกับ --file)

--symlink SRC DEST

สร้าง symlink ที่ DEST ด้วย SRC เป้าหมาย

--chmod OCTAL PATH

ตั้งค่าสิทธิ์ของ PATH ซึ่งต้องมีอยู่แล้วเป็น OCTAL

ตัวเลือกการล็อค:

--seccomp FD

โหลดและใช้กฎ seccomp จาก FD กฎต้องอยู่ในรูปแบบของโปรแกรม cBPF ที่คอมไพล์ ซึ่งสร้างโดย seccomp_export_bpf หากกำหนดตัวเลือกนี้มากกว่าหนึ่งครั้ง ระบบจะใช้ตัวเลือกสุดท้ายเท่านั้น ใช้ --add-seccomp-fd หากจำเป็นต้องใช้โปรแกรม seccomp หลายโปรแกรม

--add-seccomp-fd FD

โหลดและใช้กฎ seccomp จาก FD กฎต้องอยู่ในรูปแบบของโปรแกรม cBPF ที่คอมไพล์ ซึ่งสร้างโดย seccomp_export_bpf ตัวเลือกนี้สามารถทำซ้ำได้ ซึ่งในกรณีนี้โปรแกรม seccomp ทั้งหมดจะถูกโหลดตามลำดับที่กำหนด (โปรดทราบว่าเคอร์เนลจะประเมินค่าเหล่านั้นในลำดับย้อนกลับ ดังนั้นโปรแกรมสุดท้ายในบรรทัดคำสั่ง bwrap จะได้รับการประเมินก่อน) ทั้งหมด ยกเว้นสุดท้าย ต้องอนุญาตให้ใช้ PR_SET_SECCOMP prctl ไม่สามารถรวมตัวเลือกนี้กับ --seccomp

--exec-label LABEL

Exec Label จากแซนด์บ็อกซ์ ในระบบ SELinux คุณสามารถระบุบริบท SELinux สำหรับกระบวนการแซนด์บ็อกซ์ได้

--file-label LABEL

ป้ายกำกับไฟล์สำหรับเนื้อหาแซนด์บ็อกซ์ชั่วคราว ในระบบ SELinux คุณสามารถระบุบริบท SELinux สำหรับเนื้อหาแซนด์บ็อกซ์ได้

--block-fd FD

ปิดกั้นแซนด์บ็อกซ์ในการอ่านจาก FD จนกว่าจะมีข้อมูลบางส่วน

--userns-block-fd FD

อย่าเริ่มต้นเนมสเปซผู้ใช้ แต่รอ FD จนกว่าจะพร้อม สิ่งนี้ทำให้กระบวนการภายนอก (เช่น newuidmap/newgidmap) ตั้งค่าเนมสเปซผู้ใช้ก่อนที่กระบวนการแซนด์บ็อกซ์จะใช้มัน

--info-fd FD

เขียนข้อมูลในรูปแบบ JSON เกี่ยวกับแซนด์บ็อกซ์ไปยัง FD

--json-status-fd 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 อื่นๆ อาจเพิ่มก่อนหรือหลังออบเจ็กต์ปัจจุบัน ดังนั้นผู้อ่านต้องละเว้นสมาชิกและออบเจ็กต์ที่พวกเขาไม่เข้าใจ

--new-session

สร้างเทอร์มินัลเซสชันใหม่สำหรับแซนด์บ็อกซ์ (เรียก setid()) สิ่งนี้จะตัดการเชื่อมต่อแซนด์บ็อกซ์ออกจากเทอร์มินัลการควบคุม ซึ่งหมายความว่าแซนด์บ็อกซ์ไม่สามารถแทรกอินพุตเข้าไปในเทอร์มินัลได้

หมายเหตุ: ในแซนด์บ็อกซ์ทั่วไป หากคุณไม่ได้ใช้ --new-session ขอแนะนำให้ใช้ seccomp เพื่อยกเลิกการอนุญาต TIOCSTI ioctl มิฉะนั้น แอปพลิเคชันสามารถป้อนอินพุตจากแป้นพิมพ์ไปยังเทอร์มินัลได้

--die-with-parent

ตรวจสอบให้แน่ใจว่ากระบวนการลูก (COMMAND) ตายเมื่อพาเรนต์ bwraps ตาย ฆ่า (SIGKILL) กระบวนการแซนด์บ็อกซ์ bwrap ทั้งหมดในลำดับจากพาเรนต์ไปยังลูก รวมถึงกระบวนการ COMMAND เมื่อพาเรนต์ bwrap หรือ bwraps ตาย ดู prctl, PR_SET_PDEATHSIG

--as-pid-1

อย่าสร้างกระบวนการด้วย PID=1 ในแซนด์บ็อกซ์เพื่อเก็บเกี่ยวกระบวนการลูก

--cap-add CAP

เพิ่มความสามารถที่ระบุเมื่อทำงานในฐานะผู้ใช้ที่มีสิทธิ์ ยอมรับค่าพิเศษ ALL เพื่อเพิ่มตัวพิมพ์ใหญ่ที่อนุญาตทั้งหมด

--cap-drop CAP

ลดความสามารถที่ระบุเมื่อทำงานในฐานะผู้ใช้ที่มีสิทธิ์ ยอมรับค่าพิเศษ ALL เพื่อทิ้งตัวพิมพ์ใหญ่ทั้งหมด ตามค่าเริ่มต้น จะไม่มีตัวพิมพ์ใหญ่เหลืออยู่ในกระบวนการแซนด์บ็อกซ์ ตัวเลือก --cap-add และ --cap-drop จะถูกประมวลผลตามลำดับที่ระบุไว้ในบรรทัดคำสั่ง โปรดระวังตามลำดับที่ระบุไว้

สิ่งแวดล้อม

HOME

ใช้เป็น cwd ในแซนด์บ็อกซ์หากไม่ได้ระบุ --chdir ไว้อย่างชัดเจน และไม่มี cwd ปัจจุบันอยู่ในแซนด์บ็อกซ์ สามารถใช้ตัวเลือก --setenv เพื่อแทนที่ค่าที่ใช้ที่นี่

ออกจากสถานะ

คำสั่ง bwrap จะส่งคืนสถานะการออกของกระบวนการสมัครเริ่มต้น (pid 2 ในแซนด์บ็อกซ์)

หมายเหตุ

1. รูปแบบ "บรรทัด JSON": https://jsonlines.org/