ฉันกำลังทำงานในโครงการที่ใช้การจำลองแบบกระจาย: โค้ดโดยพลการถูกดำเนินการบนหลายโหนดและผลลัพธ์จะถูกรวบรวมและรวมในภายหลัง
แต่ละโหนดเป็นอินสแตนซ์ของเครื่องเสมือน Ubuntu Linux และเรียกใช้กระบวนการหลักซึ่งดูแลการส่งต่อรหัสที่จะถูกดำเนินการไปยังกระบวนการของผู้ปฏิบัติงานจำนวนมาก (1 สำหรับแต่ละคอร์)
คำถามนี้เกี่ยวกับวิธีการตรวจสอบให้แน่ใจว่าผู้ปฏิบัติงานแต่ละคนทำงานในสภาพแวดล้อมแบบ sandbox โดยไม่ต้องหันไปใช้อินสแตนซ์ของเครื่องเสมือนสำหรับแต่ละคน ข้อกำหนดที่แน่นอนสำหรับคนงานคือ:
- fs : ไม่มีสิทธิ์ในการเขียนสิทธิ์แบบอ่านอย่างเดียวถูก จำกัด ไว้ที่ไดเรกทอรีเดียว (และโฟลเดอร์ย่อย)
- สุทธิ : อนุญาตการสื่อสารในท้องถิ่นเท่านั้น (IPC, TCP, อะไรก็ตาม ... )
- mem : ขีดสูงสุดในการใช้งานหน่วยความจำ (ไม่มีหน่วยความจำ swap) ฆ่าถ้าเกินขีด จำกัด mem
- cpu : อนุญาตให้ 1 คอร์เท่านั้น, ฆ่าถ้าเกินเวลาที่กำหนด
ไม่ควรมีข้อ จำกัด อื่น ๆ : ผู้ปฏิบัติงานควรสามารถโหลดไลบรารีไดนามิก (จากโฟลเดอร์แบบอ่านอย่างเดียว), วางไข่เธรดหรือกระบวนการใหม่, เรียกฟังก์ชันระบบ, ecc ecc แต่ข้อ จำกัด จะต้องสืบทอดโดยหน่วยงานที่วาง / โหลดแล้วและ ควรนำไปใช้ในวิธีผลรวม (ตัวอย่างเช่นเราไม่สามารถมีผู้ปฏิบัติงานที่วางไข่สองเธรดที่ใช้ 800MB แต่ละข้อ จำกัด หน่วยความจำสำหรับผู้ปฏิบัติงานดังกล่าวคือ 1GB)
มันไปโดยไม่บอกว่าไม่มีทางที่คนงานจะยกระดับสิทธิของตน
ฉันใช้เวลาค่อนข้างมากในการตรวจสอบทางเลือกที่มีอยู่ (SELinux, AppArmor, cgroups, ulimit, เนมสเปซลินุกซ์, LXC, Docker, ... ) สำหรับโซลูชันที่ง่ายที่สุดที่ตรงกับความต้องการของฉัน แต่ประสบการณ์ของฉันในพื้นที่ จำกัด
เข้าใจปัจจุบัน: LXC และหางบิตบนฝั่งหนักสำหรับกรณีการใช้งานของฉันและไม่ได้รับการรักษาความปลอดภัยอย่างสมบูรณ์1 AppArmor ที่นิยมกว่าใน SELinux เนื่องจากการกำหนดค่าที่ง่ายขึ้นให้ใช้สำหรับ fs และข้อ จำกัด สุทธิ กลุ่ม cg ที่ต้องการ ulimit (ซึ่งทำงานในกระบวนการเดียว), ใช้มันสำหรับข้อ จำกัด mem และ cpu
นี่เป็นวิธีที่ง่ายที่สุดในการบรรลุเป้าหมายหรือไม่? ฉันสามารถใช้ AppArmor หรือกลุ่มเฉพาะได้ไหม รุ่นของฉันมีช่องโหว่ที่ชัดเจนหรือไม่? แนวทางที่ควรจะเป็น"คนงานที่ได้รับอนุญาตให้นำมาลงเอง แต่ไม่มีอะไร"