ฉันคิดว่ารายละเอียดคำถามของคุณมากมายสามารถนำไปใช้ได้อย่างเท่าเทียมกันavahi-daemon
ซึ่งฉันได้ดูเมื่อเร็ว ๆ นี้ (ฉันอาจพลาดรายละเอียดอื่น ๆ ที่แตกต่างไป) การรัน avahi-daemon ใน chroot มีข้อดีหลายประการในกรณีที่ avahi-daemon ถูกบุกรุก เหล่านี้รวมถึง:
- มันไม่สามารถอ่านไดเรกทอรีบ้านของผู้ใช้และลบข้อมูลส่วนตัว
- มันไม่สามารถใช้ประโยชน์จากข้อบกพร่องในโปรแกรมอื่น ๆ โดยการเขียนไปที่ / tmp มีอย่างน้อยหนึ่งประเภททั้งหมดของข้อบกพร่องดังกล่าว เช่นhttps://www.google.co.uk/search?q=tmp+race+security+bug
- มันไม่สามารถเปิดไฟล์ซ็อกเก็ตยูนิกซ์ใด ๆ ที่อยู่นอก chroot ซึ่ง daemons อื่น ๆ อาจฟังและอ่านข้อความ
จุดที่ 3 อาจดีเป็นพิเศษเมื่อคุณไม่ได้ใช้ dbus หรือคล้ายกัน ... ฉันคิดว่า avahi-daemon ใช้ dbus ดังนั้นจึงมั่นใจได้ว่าจะสามารถเข้าถึงระบบ dbus ได้แม้จะอยู่ใน chroot หากคุณไม่ต้องการความสามารถในการส่งข้อความบนระบบ dbus การปฏิเสธความสามารถนั้นอาจเป็นคุณลักษณะด้านความปลอดภัยที่ดีทีเดียว
จัดการมันด้วยไฟล์ systemd unit
โปรดทราบว่าถ้า Avahi-ภูตถูกเขียนใหม่ก็อาจจะเลือกที่จะพึ่งพา systemd ProtectHome
สำหรับการรักษาความปลอดภัยและการใช้งานเช่น ฉันเสนอการเปลี่ยนแปลง avahi-daemon เพื่อเพิ่มการป้องกันเหล่านี้เป็นเลเยอร์พิเศษพร้อมกับการป้องกันเพิ่มเติมบางอย่างที่ไม่รับประกันโดย chroot คุณสามารถดูรายการตัวเลือกทั้งหมดที่ฉันเสนอได้ที่นี่:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
ดูเหมือนว่ามีข้อ จำกัด เพิ่มเติมซึ่งฉันสามารถใช้ได้หาก avahi-daemon ไม่ได้ใช้ chroot เองซึ่งบางอย่างถูกกล่าวถึงในข้อความยืนยัน ฉันไม่แน่ใจว่าสิ่งนี้ใช้
หมายเหตุการป้องกันที่ฉันใช้จะไม่ จำกัด daemon จากการเปิดไฟล์ซ็อกเก็ตยูนิกซ์ (จุดที่ 3 ด้านบน)
อีกวิธีคือการใช้ SELinux อย่างไรก็ตามคุณควรผูกแอปพลิเคชันของคุณไว้กับชุดย่อยของลินุกซ์ เหตุผลที่ฉันคิดว่า SELinux ในที่นี้คือ SELinux จำกัด การเข้าถึงที่โพรเซสมีบน dbus ในลักษณะที่ละเอียด ตัวอย่างเช่นฉันคิดว่าคุณมักจะคาดหวังว่าsystemd
จะไม่อยู่ในรายการชื่อรถบัสที่คุณต้องการเพื่อส่งข้อความไปยัง :-)
"ฉันสงสัยว่าถ้าใช้ systemd sandbox ที่ปลอดภัยกว่า chroot / setuid / umask / ... "
สรุป: ทำไมไม่ทั้งสอง ลองถอดรหัสข้างบนเล็กน้อย :-)
หากคุณคิดเกี่ยวกับจุดที่ 3 การใช้ chroot จะช่วย จำกัด ขอบเขตมากขึ้น ProtectHome = และเพื่อน ๆ ก็ไม่ได้พยายามเข้มงวดเท่า chroot (ตัวอย่างเช่นไม่มีบัญชีดำตัวเลือก systemd ตัวเลือกชื่อ/run
ที่เรามักจะใส่ไฟล์ซ็อกเก็ตยูนิกซ์)
chroot แสดงให้เห็นว่าการ จำกัด การเข้าถึงระบบไฟล์อาจมีประสิทธิภาพมาก แต่ไม่ใช่ทุกอย่างบน Linux ที่เป็นไฟล์ :-) มีตัวเลือก systemd ที่สามารถ จำกัด สิ่งอื่น ๆ ที่ไม่ใช่ไฟล์ สิ่งนี้มีประโยชน์หากโปรแกรมถูกบุกรุกคุณสามารถลดคุณสมบัติเคอร์เนลที่มีให้ซึ่งมันอาจพยายามใช้ช่องโหว่ในระบบตัวอย่างเช่น avahi-daemon ไม่ต้องการซ็อกเก็ตบลูทู ธ และฉันเดาว่าเว็บเซิร์ฟเวอร์ของคุณไม่ได้ :-) ดังนั้นอย่าให้สิทธิ์เข้าถึงตระกูลที่อยู่ AF_BLUETOOTH เพียงแค่รายการที่อนุญาต AF_INET, AF_INET6 และอาจ AF_UNIX โดยใช้RestrictAddressFamilies=
ตัวเลือก
โปรดอ่านเอกสารสำหรับแต่ละตัวเลือกที่คุณใช้ ตัวเลือกบางอย่างมีประสิทธิภาพมากขึ้นเมื่อรวมกับตัวเลือกอื่น ๆ และบางตัวเลือกนั้นไม่สามารถใช้ได้กับสถาปัตยกรรมซีพียูทั้งหมด (ไม่ใช่เพราะ CPU ไม่ดี แต่เนื่องจากพอร์ต Linux สำหรับ CPU นั้นไม่ได้ออกแบบมาอย่างดีฉันคิดว่า)
(มีหลักการทั่วไปที่นี่มีความปลอดภัยมากขึ้นถ้าคุณสามารถเขียนรายการสิ่งที่คุณต้องการอนุญาตไม่ใช่สิ่งที่คุณต้องการปฏิเสธเช่นเดียวกับการกำหนด chroot ให้รายชื่อไฟล์ที่คุณได้รับอนุญาตให้เข้าถึงและสิ่งนี้แข็งแกร่งกว่า กว่าจะบอกว่าคุณต้องการบล็อก/home
)
โดยหลักการคุณสามารถใช้ข้อ จำกัด เดียวกันทั้งหมดด้วยตัวคุณเองก่อน setuid () มันเป็นแค่โค้ดที่คุณสามารถคัดลอกจาก systemd อย่างไรก็ตามตัวเลือกหน่วย systemd ควรเขียนได้ง่ายกว่ามากและเนื่องจากอยู่ในรูปแบบมาตรฐานจึงควรอ่านและตรวจสอบได้ง่ายขึ้น
ดังนั้นฉันขอแนะนำอย่างยิ่งให้อ่านเฉพาะในส่วน sandboxing ของman systemd.exec
บนแพลตฟอร์มเป้าหมายของคุณ แต่ถ้าคุณต้องการการออกแบบที่ปลอดภัยที่สุดที่เป็นไปได้ฉันจะไม่กลัวที่จะลองchroot
(และแล้ววางroot
สิทธิพิเศษ) ในโปรแกรมของคุณได้เป็นอย่างดี มีการแลกเปลี่ยนที่นี่ การใช้chroot
ข้อ จำกัด บางอย่างกับการออกแบบโดยรวมของคุณ หากคุณมีการออกแบบที่ใช้ chroot และดูเหมือนว่าจะทำสิ่งที่คุณต้องการมันฟังดูดีมาก