จนถึงตอนนี้สิ่งที่ฉันสามารถรวบรวมได้คือ fakeroot ถูกใช้เพื่อให้ความเป็นเจ้าของไฟล์ที่ต้องรูทเมื่อ unzip / tar'ed คำถามของฉันคือทำไมคุณไม่ทำอย่างนั้นกับ chown?
เนื่องจากคุณไม่สามารถทำเช่นนั้นchown
ได้อย่างน้อยก็ไม่ใช่ผู้ใช้ที่ไม่ใช่รูท (และถ้าคุณทำงานในฐานะรูทคุณไม่ต้องการfakeroot
) นั่นคือประเด็นทั้งหมดfakeroot
: เพื่ออนุญาตให้โปรแกรมที่คาดว่าจะทำงานเป็น root เพื่อให้ทำงานในฐานะผู้ใช้ปกติในขณะที่แสร้งว่า
โดยทั่วไปจะใช้เมื่อสร้างแพคเกจเพื่อให้กระบวนการติดตั้งของแพ็คเกจที่กำลังติดตั้งสามารถดำเนินการต่อได้โดยไม่มีข้อผิดพลาด (แม้ว่าจะรันchown root:root
หรือinstall -o root
ฯลฯ ) fakeroot
จดจำความเป็นเจ้าของปลอมที่แกล้งทำเป็นให้ไฟล์ดังนั้นการดำเนินการในภายหลังจึงดูที่ความเป็นเจ้าของดูสิ่งนี้แทนที่จะเป็นของจริง สิ่งนี้อนุญาตให้มีการtar
รันตัวอย่างเช่นภายหลังเพื่อจัดเก็บไฟล์ตามที่รูทเป็นเจ้าของ
fakeroot หยุดการเพิ่มระดับสิทธิพิเศษที่ไม่พึงประสงค์บน Linux อย่างไร หาก fakeroot สามารถหลอก tar ให้สร้างไฟล์ที่ root เป็นเจ้าของได้ทำไมไม่ทำอะไรที่คล้ายกับ SUID ล่ะ
fakeroot
ไม่หลอกtar
ให้ทำอะไรมันรักษาการเปลี่ยนแปลงที่บิลด์ต้องการทำโดยไม่ปล่อยให้การเปลี่ยนแปลงเหล่านั้นมีผลกับระบบที่โฮสต์บิลด์ คุณไม่จำเป็นต้องfakeroot
สร้าง tarball ที่มีไฟล์เป็นของ root และ suid; หากคุณมีไบนารี่ที่evilbinary
ทำงานอยู่tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
ในฐานะผู้ใช้ปกติจะสร้าง tarball ที่ประกอบด้วยevilbinary
root และ suid อย่างไรก็ตามคุณจะไม่สามารถดึง tarball นั้นและรักษาสิทธิ์เหล่านั้นได้เว้นแต่ว่าคุณจะเป็น root: ไม่มีการเพิ่มระดับสิทธิ์ที่นี่ fakeroot
เป็นสิทธิ์เดอ-escalation tool: ช่วยให้คุณสามารถรันบิลด์ในฐานะผู้ใช้ทั่วไปในขณะที่รักษาเอฟเฟกต์บิลด์ไว้ถ้ามันถูกเรียกใช้ในฐานะรูท การใช้เอฟเฟ็กต์“ for real” นั้นต้องการสิทธิ์รูทเสมอ fakeroot
ไม่ได้ให้วิธีการในการรับพวกเขา
เพื่อให้เข้าใจการใช้งานfakeroot
โดยละเอียดยิ่งขึ้นให้พิจารณาว่าโครงสร้างการกระจายทั่วไปเกี่ยวข้องกับการดำเนินการดังต่อไปนี้
- ติดตั้งไฟล์ที่ root เป็นเจ้าของ
- ...
- เก็บถาวรไฟล์เหล่านั้นยังคงเป็นของรูทดังนั้นเมื่อไฟล์ถูกแตกมันจะเป็นของรูท
ส่วนแรกล้มเหลวถ้าคุณไม่รูท อย่างไรก็ตามเมื่อทำงานภายใต้fakeroot
ในฐานะผู้ใช้ปกติกระบวนการจะกลายเป็น
- ติดตั้งไฟล์ที่ root เป็นเจ้าของ - สิ่งนี้ล้มเหลว แต่
fakeroot
แกล้งทำสำเร็จและจดจำความเป็นเจ้าของที่เปลี่ยนแปลง
- ...
- เก็บถาวรไฟล์เหล่านั้นยังคงเป็นของรูท - เมื่อ
tar
(หรือสิ่งที่ใช้งานผู้เก็บถาวร) ถามระบบว่าไฟล์เป็นเจ้าของอะไร, fakeroot
เปลี่ยนคำตอบเพื่อให้ตรงกับความเป็นเจ้าของที่บันทึกไว้ก่อนหน้านี้
ดังนั้นคุณสามารถเรียกใช้แพ็คเกจบิลด์โดยไม่ต้องรูทในขณะที่รับผลลัพธ์เดียวกันกับที่คุณจะได้รับหากคุณรันเป็นรูท การใช้fakeroot
ปลอดภัยยิ่งขึ้น: ระบบยังไม่สามารถทำสิ่งใด ๆ ที่ผู้ใช้ของคุณไม่สามารถทำได้ดังนั้นกระบวนการติดตั้งที่หลอกลวงไม่สามารถทำลายระบบของคุณได้ (นอกเหนือจากการสัมผัสไฟล์ของคุณ)
ในเดสร้างเครื่องมือที่ได้รับการปรับปรุงเพื่อที่จะไม่ต้องใด ๆ นี้มากขึ้นและคุณสามารถสร้างแพคเกจโดยไม่ต้อง fakeroot
นี่คือการสนับสนุนdpkg
โดยตรงกับRules-Requires-Root
คำสั่ง (ดูrootless-builds.txt
)
เพื่อให้เข้าใจถึงวัตถุประสงค์fakeroot
และด้านความปลอดภัยของการรันในฐานะรูทหรือไม่นั้นอาจช่วยในการพิจารณาวัตถุประสงค์ของการบรรจุภัณฑ์ เมื่อคุณติดตั้งซอฟต์แวร์จากแหล่งข้อมูลเพื่อใช้กับระบบคุณจะดำเนินการดังนี้:
- สร้างซอฟต์แวร์ (ซึ่งสามารถทำได้โดยไม่มีสิทธิ์)
- ติดตั้งซอฟต์แวร์ (ซึ่งจำเป็นต้องทำในฐานะรูทหรืออย่างน้อยผู้ใช้ที่ได้รับอนุญาตให้เขียนไปยังตำแหน่งระบบที่เหมาะสม)
เมื่อคุณจัดทำแพคเกจซอฟต์แวร์คุณกำลังทำการหน่วงเวลาส่วนที่สอง แต่การทำเช่นนั้นสำเร็จคุณยังต้อง“ ติดตั้ง” ซอฟต์แวร์ลงในแพ็คเกจแทนที่จะเข้าสู่ระบบ ดังนั้นเมื่อคุณแพ็กเกจซอฟต์แวร์กระบวนการจะกลายเป็น:
- สร้างซอฟต์แวร์ (ไม่มีสิทธิ์พิเศษ)
- แกล้งทำเป็นติดตั้งซอฟต์แวร์ (อีกครั้งโดยไม่มีสิทธิ์พิเศษ)
- จับภาพการติดตั้งซอฟต์แวร์เป็นแพ็คเกจ (เหมือนกัน)
- ทำให้แพ็คเกจพร้อมใช้งาน (เหมือนกัน)
ตอนนี้ผู้ใช้ทำกระบวนการให้เสร็จสมบูรณ์โดยการติดตั้งแพคเกจซึ่งจำเป็นต้องทำในฐานะผู้ใช้ (หรืออีกครั้งผู้ใช้ที่มีสิทธิ์ที่เหมาะสมในการเขียนไปยังตำแหน่งที่เหมาะสม) นี่คือที่รับรู้กระบวนการที่ล่าช้าพิเศษและเป็นเพียงส่วนหนึ่งของกระบวนการที่ต้องการสิทธิ์พิเศษ
fakeroot
ช่วยในขั้นตอนที่ 2 และ 3 ข้างต้นโดยให้เราเรียกใช้กระบวนการติดตั้งซอฟต์แวร์และจับพฤติกรรมของพวกเขาโดยไม่ต้องทำงานเป็นรูต