วิธีการ“ คุก” กระบวนการโดยไม่ต้องรูท?


26

เมื่อฉันรูตฉันสามารถสร้างผู้ใช้ / กลุ่มจำลองตั้งสิทธิ์การใช้ไฟล์ตามนั้นและดำเนินการตามกระบวนการในฐานะผู้ใช้นั้นได้ อย่างไรก็ตามฉันไม่ได้ดังนั้นจะมีวิธีการที่จะบรรลุสิ่งนี้โดยไม่ต้องเป็นราก?


1
@alex: ฉันมีสคริปต์ที่ทำงานหลายแบบจำลอง (ในไดเรกทอรีที่แตกต่างกัน) และต้องการให้แน่ใจว่าการเขียนโปรแกรมไม่ดีเพียงใดพวกเขาสามารถเข้าถึงไฟล์ในไดเรกทอรีของตัวเองและไม่ได้ตั้งใจแก้ไขเช่นผลลัพธ์ของแบบจำลองอื่น ๆ
Tobias Kienzler

2
@Tobias: ฉันเข้าใจคุณแล้ว chrootจะเข้าที่นั่นตามธรรมชาติ แต่แล้วคุณก็ไม่รูทอีก
alex

1
ฉันคิดว่า selinux ผู้ครอบครองและความมั่นคงปลอดภัยอาจทำได้ แต่ฉันไม่แน่ใจ แต่ถ้าหากผู้ดูแลระบบ sys ไม่สามารถใช้งานหรือกำหนดค่าได้
xenoterracide

4
คำถามเช่นนี้เป็นสิ่งที่ฉันสงสัยมาหลายปีแล้ว ดูเหมือนว่าจะเป็นความปรารถนาตามธรรมชาติ: โดยไม่ต้องรูทเพื่อให้สามารถเรียกใช้กระบวนการที่มีการอนุญาตของผู้ใช้ของคุณถูกยกเลิกนั่นคือจะสามารถ จำกัด กระบวนการให้กับผู้ใช้ที่ติดตั้ง "คุก" ซึ่งจะทำให้กระบวนการ สิทธิ์น้อยกว่าที่ผู้ใช้ของคุณมี เป็นเรื่องที่น่าเสียดายที่ Unices ปกติไม่ได้เสนอแบบนี้!
imz - Ivan Zakharyaschev

2
ลองถามผู้ดูแลระบบของคุณเพื่อสร้างบัญชีผู้ใช้ที่สองให้คุณ
LawrenceC

คำตอบ:


23

Qs ที่คล้ายกันมากขึ้นพร้อมคำตอบที่ควรค่าแก่การเอาใจใส่:

หมายเหตุ:คำตอบบางข้อนั้นชี้ไปยังโซลูชันเฉพาะที่ยังไม่ได้กล่าวถึงที่นี่

อันที่จริงมีค่อนข้างเครื่องมืองูไม่กี่กับการดำเนินการที่แตกต่างกัน แต่หลายคนอาจจะยังไม่ปลอดภัยจากการออกแบบ (เช่นfakeroot, LD_PRELOAD-based) หรือไม่สมบูรณ์ (เช่นfakeroot-ng, ptrace-based) หรือจะต้องมีราก ( chrootหรือplashกล่าวถึงในตอนfakechroot ป้ายคำเตือน )

นี่เป็นเพียงตัวอย่าง ฉันคิดว่ารายชื่อพวกเขาทุกด้านโดยด้านที่มีข้อบ่งชี้ของ 2 คุณสมบัติเหล่านี้ ( "สามารถเชื่อถือได้?", "ต้องมีรากที่จะตั้งขึ้น?") บางทีอาจเป็นเพราะระบบปฏิบัติการระดับการใช้งานการทำงานแบบเสมือน

โดยทั่วไปคำตอบนั้นครอบคลุมช่วงความเป็นไปได้ที่อธิบายไว้ทั้งหมดและอีกมากมาย:

เครื่องเสมือน / OS

ส่วนขยายเคอร์เนล (เช่น SELinux)

  • (กล่าวถึงในความคิดเห็นที่นี่)

chroot

Chroot-based helpers (ซึ่งจะต้องเป็น setUID root เนื่องจากchrootต้องการ root หรืออาจchrootทำงานใน namespace ที่แยกได้ - ดูด้านล่าง):

[เพื่อเล่าเพิ่มเติมเกี่ยวกับพวกเขา!]

เครื่องมือแยกตาม chroot ที่รู้จัก:

  • ได้ด้วยคำสั่งhsh-runและ hsh-shell( Hasherถูกออกแบบมาสำหรับการสร้างซอฟต์แวร์ในลักษณะที่ปลอดภัยและทำซ้ำได้)
  • schrootกล่าวถึงในคำตอบอื่น
  • ...

ptrace

อีกวิธีที่น่าเชื่อถือแยก (นอกเหนือจากชั่นหนึ่ง ) จะเป็นฉบับสมบูรณ์ syscall สกัดกั้นผ่านตามที่อธิบายไว้ใน manpage สำหรับ:seccompptracefakeroot-ng

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

แม้ว่ามันจะเป็นไปได้ในทางทฤษฎี แต่ก็ยังไม่ได้ทำ Fakeroot-ng สันนิษฐานว่าสมมติฐาน "ประพฤติอย่างดี" บางอย่างเกี่ยวกับกระบวนการที่ถูกติดตามและกระบวนการที่ทำลายสมมติฐานเหล่านั้นอาจสามารถหากไม่รอดโดยสิ้นเชิงแล้วอย่างน้อยก็หลีกเลี่ยงสภาพแวดล้อม "ปลอม" บางอย่างที่กำหนดโดย fakeroot- งะ ดังนั้นคุณจึงได้รับคำเตือนอย่างยิ่งให้ใช้ fakeroot-ng เป็นเครื่องมือรักษาความปลอดภัย รายงานข้อผิดพลาดที่อ้างว่ากระบวนการสามารถจงใจหลบหนีการควบคุมของ root-ng โดยเจตนาจะถูกปิดเป็น "ไม่ใช่ข้อผิดพลาด" หรือทำเครื่องหมายว่ามีลำดับความสำคัญต่ำ

เป็นไปได้ว่านโยบายนี้จะมีการทบทวนอีกครั้งในอนาคต อย่างไรก็ตามในขณะนี้คุณได้รับคำเตือนแล้ว

ยังตามที่คุณสามารถอ่านได้fakeroot-ngตัวมันเองไม่ได้ออกแบบมาเพื่อจุดประสงค์นี้

(BTW ฉันสงสัยว่าทำไมพวกเขาเลือกที่จะใช้seccompวิธี -based สำหรับ Chromium มากกว่าptrace-based ... )

จากเครื่องมือที่ไม่ได้กล่าวถึงข้างต้นฉันสังเกตGeordiด้วยตัวเองเพราะฉันชอบที่โปรแกรมควบคุมนั้นเขียนใน Haskell

เครื่องมือแยก ptrace ที่รู้จักกันดี:

seccomp

วิธีการหนึ่งที่รู้จักกันเพื่อให้เกิดการแยกผ่านวิธีการ seccomp sandboxing ที่ใช้ใน Google โครเมี่ยม แต่วิธีนี้สมมติว่าคุณเขียนผู้ช่วยซึ่งจะดำเนินการบางอย่าง (คนที่ได้รับอนุญาต) ของการเข้าถึงไฟล์ "ดัก" และ syscalls อื่น ๆ และแน่นอนพยายาม "สกัดกั้น" syscalls และเปลี่ยนเส้นทางไปยังผู้ช่วย (บางทีมันอาจหมายถึงสิ่งต่าง ๆ เช่นการแทนที่ syscalls ที่ถูกดักจับในรหัสของกระบวนการควบคุมดังนั้นจึงไม่มีเสียง จะค่อนข้างง่ายถ้าคุณสนใจคุณควรอ่านรายละเอียดมากกว่าแค่คำตอบของฉัน)

ข้อมูลที่เกี่ยวข้องเพิ่มเติม (จาก Wikipedia):

(รายการสุดท้ายดูเหมือนจะน่าสนใจถ้าใครกำลังมองหาseccompโซลูชันที่ใช้งานทั่วไปนอก Chromium นอกจากนี้ยังมีโพสต์บล็อกที่มีมูลค่าการอ่านจากผู้เขียน "seccomp-nurse": SECCOMP เป็นวิธีแก้ปัญหา Sandbox? )

ภาพประกอบของวิธีการนี้จากโครงการ "seccomp-nurse" :

                      ป้อนคำอธิบายรูปภาพที่นี่

Seccomp "ยืดหยุ่น" เป็นไปได้ในอนาคตของ Linux?

มีเคยปรากฏในปี 2009 ยังมีข้อเสนอแนะในการแก้ไขเคอร์เนล Linuxเพื่อให้มีความยืดหยุ่นมากขึ้นในseccompโหมด - เพื่อให้ "กายกรรมจำนวนมากที่เราต้องการในปัจจุบันสามารถหลีกเลี่ยงได้" ( "กายกรรม" หมายถึงภาวะแทรกซ้อนของการเขียนที่มีผู้ช่วยในการดำเนินการหลาย syscalls อาจจะเป็นผู้บริสุทธิ์ในนามของกระบวนการตัดสินจำคุกและของแทน syscalls อาจจะเป็นผู้บริสุทธิ์ในกระบวนการตัดสินจำคุกเป็นได้.) บทความ LWNเขียนถึงประเด็นนี้:

หนึ่งข้อเสนอแนะที่ออกมาคือการเพิ่ม "โหมด" ใหม่เพื่อ seccomp API ได้รับการออกแบบโดยมีแนวคิดว่าแอพพลิเคชั่นที่แตกต่างกันอาจมีข้อกำหนดด้านความปลอดภัยที่แตกต่างกัน มันมีค่า "โหมด" ซึ่งระบุข้อ จำกัด ที่ควรใส่ มีการใช้งานโหมดดั้งเดิมเท่านั้น แต่สามารถเพิ่มโหมดอื่น ๆ ได้อย่างแน่นอน การสร้างโหมดใหม่ที่อนุญาตให้กระบวนการเริ่มต้นระบุว่าการเรียกใช้ระบบใดที่จะได้รับอนุญาตจะทำให้เครื่องมืออำนวยความสะดวกมีประโยชน์มากขึ้นสำหรับสถานการณ์เช่น Chrome sandbox

Adam Langley (รวมถึง Google) ได้โพสต์แพตช์ซึ่งทำเช่นนั้น การนำไปใช้งาน "โหมด 2" ใหม่ยอมรับ bitmask ที่อธิบายว่าการเรียกของระบบใดที่สามารถเข้าถึงได้ หากหนึ่งในนั้นคือ prctl () ดังนั้นรหัส sandboxed สามารถ จำกัด การเรียกใช้ระบบของตัวเองเพิ่มเติมได้ (แต่ไม่สามารถเรียกคืนการเข้าถึงการเรียกใช้ระบบที่ถูกปฏิเสธ) ทั้งหมดบอกว่ามันดูเหมือนทางออกที่สมเหตุสมผลซึ่งจะทำให้ชีวิตของนักพัฒนากล่องทรายง่ายขึ้น

ที่กล่าวว่ารหัสนี้อาจไม่สามารถผสานเพราะการสนทนาได้ย้ายไปเป็นไปได้อื่น ๆ

"seccomp ที่ยืดหยุ่น" นี้จะนำความเป็นไปได้ของ Linux เข้ามาใกล้เพื่อมอบคุณสมบัติที่ต้องการในระบบปฏิบัติการโดยไม่จำเป็นต้องเขียนตัวช่วยที่ซับซ้อน

(บล็อกโพสต์ที่มีเนื้อหาเดียวกันกับคำตอบนี้: http://geofft.mit.edu/blog/sipb/33โดยพื้นฐาน)

เนมสเปซ ( unshare)

การแยกผ่านเนมสเปซ ( unshare-based solutions ) - ไม่ได้กล่าวถึงที่นี่ - เช่นการไม่แบ่งจุดเมานท์ (รวมกับ FUSE?) อาจเป็นส่วนหนึ่งของโซลูชันที่ทำงานได้สำหรับคุณที่ต้องการ จำกัด การเข้าถึงระบบไฟล์ของกระบวนการที่ไม่น่าเชื่อถือ

เพิ่มเติมเกี่ยวกับเนมสเปซตอนนี้เมื่อการดำเนินการเสร็จสิ้นแล้ว (เทคนิคการแยกนี้ยังเป็นที่รู้จักภายใต้ nme "Linux Containers" หรือ "LXC"ใช่ไหม? .. ):

"หนึ่งในเป้าหมายโดยรวมของ namespaces คือการสนับสนุนการดำเนินงานของภาชนะบรรจุเครื่องมือสำหรับการทำงานแบบเสมือนน้ำหนักเบา (เช่นเดียวกับวัตถุประสงค์อื่น ๆ )"

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

สำหรับคำสั่งที่ใช้งานได้จริงให้ทำสิ่งนี้ดูคำตอบได้ที่:

และการโปรแกรม / การคอมไพล์พื้นที่ผู้ใช้พิเศษ

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

ดังกล่าวptrace-หรือseccompsandboxing ชั่นสามารถมองเห็นเป็นบางสายพันธุ์ของการดำเนินการค้ำประกันโดยการเขียน Sandbox ผู้ช่วยที่จะควบคุมกระบวนการอื่น ๆ ของคุณซึ่งจะถือว่าเป็น "กล่องดำ" โปรแกรมระบบปฏิบัติการยูนิกซ์โดยพลการ

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

ฉันเดาว่ามีสิ่งอำนวยความสะดวกในการทำแซนด์บ็อกซ์สำหรับการเขียนโปรแกรมเหล่านั้นในภาษาอื่นเช่น Java

  • cf เลย "Sandboxed Haskell" ข้อเสนอโครงการ

  • NaCl - ไม่พูดถึงที่นี่ -เป็นของกลุ่มนี้ใช่ไหม


บางหน้าสะสมข้อมูลในหัวข้อนี้ก็ชี้ไปที่คำตอบที่นั่น:


GoboLinux ที่ไม่มีรูทอาจเป็นตัวเลือกเช่นกัน ...
Tobias Kienzler

@tobias แต่ Rootless Gobolinux รับประกันได้หรือไม่ว่าโปรแกรมที่เขียนโดยผู้ใช้จะไม่สามารถเข้าถึงสภาพแวดล้อมภายนอกได้หรือไม่ ..
imz - Ivan Zakharyaschev

1
ไม่จริง - ฉันอยู่ภายใต้การเข้าใจผิดว่าจะอนุญาตให้หนึ่งกลายเป็นผู้ใช้รูท "ท้องถิ่น" ซึ่งจากนั้นก็สามารถสร้างผู้ใช้เสมือนจริงสำหรับกระบวนการดังกล่าว - แม้ว่ามันอาจเป็นไปได้ที่จะใช้มันchrootแต่อาจจะยังคงต้องการ สิทธิ์ root จริง ...
โทเบียส KIENZLER

8

นี่เป็นข้อ จำกัด พื้นฐานของโมเดลการอนุญาตยูนิกซ์: รูทเท่านั้นที่สามารถมอบสิทธิ์

คุณไม่จำเป็นต้องรูทเพื่อใช้งานเครื่องเสมือน (ไม่จริงสำหรับเทคโนโลยี VM ทั้งหมด) แต่นี่เป็นโซลูชันเฮฟวี่เวท

User-mode Linuxเป็นโซลูชันการจำลองเสมือนแบบ Linux-on-Linux ที่มีน้ำหนักเบา ไม่ใช่เรื่องง่ายที่จะตั้งค่า คุณจะต้องเติมพาร์ติชั่นรูท (ในไดเรกทอรี) อย่างน้อยที่สุดก็จำเป็นต้องบูท (ไฟล์ไม่กี่ไฟล์/etc, /sbin/initและการพึ่งพา, โปรแกรมล็อกอิน, เชลล์และโปรแกรมอรรถประโยชน์)


1

ฉันเดาว่าคุณสามารถมีโชคกับLD_PRELOADการสกัดกั้นการเข้าถึงไฟล์บางอย่าง แต่นี่อาจเป็นเรื่องยุ่งยาก


การแซนด์บ็อกซ์ seccomp ของ Google Chromium นั้นน่าเชื่อถือกว่านั่นคือการสกัดกั้นแบบ syscall ได้อย่างมีประสิทธิภาพ - unix.stackexchange.com/questions/6433/…
imz - Ivan Zakharyaschev

ความแตกต่างระหว่างการพยายามสกัดกั้นบางสิ่งและการทำแซนด์บ็อกซ์ (เช่นในกรณีของ Chromium) คือการรับประกันการแยก
imz - Ivan Zakharyaschev

1
การสกัดกั้นผ่านLD_PRELOADไม่สามารถเชื่อถือได้ (สามารถหลีกเลี่ยงได้) แต่การสกัดกั้นผ่านptraceทำได้
imz - Ivan Zakharyaschev

1
ตัวอย่างง่าย ๆ แสดงไว้ที่นี่ < joey.kitenet.net/blog/entry/fakechroot_warning_label > ซึ่งแสดงให้เห็นว่าLD_PRELOADการแก้ปัญหาโดยใช้ไม่สามารถเชื่อถือได้เป็นมาตรการรักษาความปลอดภัย
imz - Ivan Zakharyaschev

0

จากรายการทั้งหมดฉันจะเพิ่ม:

  • fakeroot (จากผู้ดูแลแพคเกจเดเบียน): มุ่งสร้างแพ็คเกจด้วยเครื่องมือ "เป็นมิตร" นี่ไม่ใช่การแยกที่สมบูรณ์ แต่ช่วยสร้างแพ็คเกจกับผู้ใช้และอุปกรณ์ปลอมและไฟล์หลอกพิเศษอื่น ๆ

  • fakechroot (ซึ่งใช้ fakeroot) โปรแกรมนี้มีข้อบกพร่องมากมาย ตัวอย่างเช่น "/ etc / hosts" เป็นฮาร์ดโค้ดใน glibc: คุณไม่สามารถเปลี่ยนได้ด้วยเครื่องมือนี้

  • qemu: คุณต้องรวบรวมเคอร์เนล linux แต่ผลลัพธ์นั้นเร็วมากและนี่คือเครื่อง "ปลอม" (เช่นเสมือน) ที่มีสิทธิ์รูทจริง คุณสามารถสร้างและเมานต์อิมเมจสำหรับบูตได้


0

Firejail เป็นเครื่องมือที่ดีในการเข้าคุกกระบวนการใด ๆ ไม่ว่าจะมีการเข้าถึงรูทด้วยตัวเลือกมากมายและมีความยืดหยุ่นสูง:


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