sandboxing ที่ปลอดภัยที่สุดที่เป็นไปได้ง่ายที่สุด (ต้องการทรัพยากรที่ จำกัด )


15

ฉันกำลังทำงานในโครงการที่ใช้การจำลองแบบกระจาย: โค้ดโดยพลการถูกดำเนินการบนหลายโหนดและผลลัพธ์จะถูกรวบรวมและรวมในภายหลัง

แต่ละโหนดเป็นอินสแตนซ์ของเครื่องเสมือน 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 หรือกลุ่มเฉพาะได้ไหม รุ่นของฉันมีช่องโหว่ที่ชัดเจนหรือไม่? แนวทางที่ควรจะเป็น"คนงานที่ได้รับอนุญาตให้นำมาลงเอง แต่ไม่มีอะไร"


2
ถ้าขีด จำกัด [วัน] ทรัพยากรเป็นเป้าหมายของคุณคุณจะทำมากขึ้นกว่าแขกอูบุนตู(หรือจริงๆใด ๆ Debian ตราสารอนุพันธ์สำหรับเรื่องที่) ในกรณีใด ๆ คุณอาจต้องการลินุกซ์โหมดผู้ใช้และ / หรือ(กับเมล็ดล่าสุด) namespace ผู้ใช้
mikeserv

2
LXC ดูเหมือนสิ่งที่คุณต้องการ ทำไมคุณถึงคิดว่าหนักหนาและไม่มั่นคง? (แน่นอนว่ามันเป็นแมลง แต่มีอะไรที่คุณอาจจะใช้)
Gilles 'ดังนั้นหยุดความชั่วร้าย'

การนำเสนอที่เชื่อมโยง (เป็นที่ยอมรับจาก 2011) และส่วนความปลอดภัยของเอกสาร Ubuntu LXC ที่พูดถึง 'การรั่วไหลของ namespaces' นั้นไม่ได้รับความมั่นใจมากนัก ดูเหมือน LXC ซึ่งขึ้นอยู่กับเนมสเปซและกลุ่ม cg เป็นตัวเลือกที่ดีที่สุดในตอนนี้ ฉันพบLinux-Sandboxingการอ่านที่น่าสนใจ
StephQ

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

ในขณะที่ LXC อาจ 'หนัก' ในลักษณะที่เหมือนกับเครือข่าย VM แต่มันง่ายมากที่จะสร้างมันขึ้นมา โซลูชันบางตัวในขณะที่ 'เบา' อาจต้องใช้การกำหนดค่าจำนวนมาก ด้วย LXC คุณอาจไม่จำเป็นต้องกำหนดค่าสิ่งต่าง ๆ เช่นการเขียนเนื่องจากแอปเดียวจะมีทั้งคอนเทนเนอร์
MikeP

คำตอบ:


1

ใช่คุณสามารถใช้ cgroups และ SELinux / AppArmor เพื่อตรวจสอบและควบคุมรหัสโดยพลการที่คุณจะเรียกใช้

ด้วย cgroups คุณสามารถทำสิ่งต่อไปนี้:

  1. จำกัด การใช้งาน CPU core ที่ 1 CPU กับcpusetระบบย่อย
  2. ตั้งค่าขีด จำกัด การใช้หน่วยความจำด้วยmemoryระบบย่อยติดตามแม้กระทั่งส้อม ดูhttps://github.com/gsauthof/cgmemtimeสำหรับตัวอย่าง
  3. การเข้าถึงเครือข่ายการป้องกันไม่ให้อะไรที่ไม่ได้อยู่loกับnet_prioระบบย่อย

และด้วย SELinux / AppArmor คุณสามารถ จำกัด การเข้าถึงการอ่าน / เขียนของกระบวนการ

หมายเหตุ: ฉันไม่คุ้นเคยกับ AppArmor แต่เป็นระบบควบคุมการเข้าถึง (MAC) ซึ่งหมายความว่าการป้องกันการเขียนและการอ่านเป็นหน้าที่ของมัน

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

โชคดี!


1

ฉันจะทิ้งSELinuxสำหรับAppArmorเท่านั้นถ้าผมใช้อูบุนตู (ค่อนข้างยากจริงๆ)

LXCไม่ปลอดภัยด้วยตัวเองหากคุณต้องการความปลอดภัยคุณต้องใช้พวกเขาผ่านlibvirt (อ้างอิงจากSELinux MLS )

ปัญหาของคุณไม่มีที่สิ้นสุดดังนั้นอย่าพยายามหาทางออกจากชั้นวางและโดยไม่ จำกัด เวลาโปรดจำไว้ว่าแม้kernel.orgจะได้รับการเปิดเผยและเมื่อเร็ว ๆ นี้FBI ได้ประกาศว่ามีใครบางคนใช้ระบบของพวกเขาเป็นเวลาหลายปี

ฉันจะไปกับLXC / libvirtเพื่อความปลอดภัยที่ดีหรือฉันจะลอง " เคลียร์ " intel clear containerที่ใช้ VM ที่เบามากสำหรับคอนเทนเนอร์ของคุณด้วยการใช้DAX / KSMอย่างชัดเจน(ฉันไม่ได้ทดสอบพวกเขา แต่พวกเขาดูดีมาก สัญญาแน่นอน)

หากคุณกังวลเกี่ยวกับการใช้ประโยชน์จากเคอร์เนลgrsecurityคือโซลูชันของคุณ แต่คุณต้องรวมเข้ากับโซลูชันคอนเทนเนอร์ของคุณ (ปวดหัวอย่างแน่นอน)

แน่นอนว่าไม่ใช่เรื่องง่ายเลยLXC / libvirtนั้นประณีตมาก แต่อาจจะเป็นภาชนะที่ชัดเจน

เทียบท่า? ฉันไม่ได้ / จะไม่ใช้นักเทียบท่ามากกว่าการทดสอบในท้องถิ่นเมื่อไม่มีกล่องคนพเนจรพวกเขาต้องการวิธีการทำงานและชุมชนที่ดีขึ้น

แน่นอน systemd container ก็ดีเช่นกัน แต่ฉันคิดว่าคุณไม่ชอบ / ต้องการมันเพราะคุณไม่ได้พูดถึงมันและพวกเขาไม่ใช่ผู้ขายที่ไม่เชื่อเรื่องพระเจ้า

หากคุณต้องการบางสิ่งที่ "ง่าย" และมือสมัครเล่นมากกว่านี้คุณสามารถลองใช้firejailได้ฉันใช้มันกับ "แอป" และเดสก์ท็อปบางตัวและทำงานได้ (มันค่อนข้างง่ายในการสร้างเทมเพลตสำหรับแอปที่กำหนดเองของคุณใช้ "ส่วนตัว" เมานต์ที่ด้านบนของ dirs ของคุณและ จำกัด เครือข่ายสำหรับการใช้งานในท้องถิ่นเท่านั้นกระบวนการวางไข่สืบทอดสำหรับผู้ปกครองและไป ... )

ไชโยและสนุกโดยไม่โกรธ ;)


0

seccomp-bpf เป็นอีกตัวเลือกที่ใช้งานได้ดีสำหรับ OpenSSH, vsftpd และ Chromium มีเพียง exit (), sigreturn (), read () มันยังใช้ write () แม้ว่าจะอนุญาตให้กรองการเรียกระบบโดยใช้กฎ Berkeley Packet Filter ที่กำหนดค่าได้ มันสามารถใช้ร่วมกับ cgroups สำหรับหน่วยความจำ cpu ฯลฯ ...

https://wiki.mozilla.org/Security/Sandbox/Seccomp


0

คุณอาจต้องการดูระบบกริดคอมพิวติ้ง โดยเฉพาะอย่างยิ่ง BOINC ( http://boinc.berkeley.edu ) ตรวจสอบกล่องเกือบทั้งหมดของคุณ

ฉันเชื่อว่ามันทำงานกับพารามิเตอร์ของคุณเช่น:

fs: สามารถอ่าน / เขียนไปยังไดเรกทอรีของตัวเองไม่มีที่อื่น

net: สามารถกำหนดค่าให้อนุญาตการเข้าถึงเครือข่ายไปยังเซิร์ฟเวอร์ BOINC ของคุณเท่านั้น แต่ไม่ได้กำหนดค่าเริ่มต้นจากช่อง IIRC

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

cpu: ใช่สามารถพูดว่า "ไม่ทำงานหากคอมพิวเตอร์ไม่ได้ใช้งาน"

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