Saya sedang mengerjakan proyek yang mengimplementasikan simulasi terdistribusi: kode arbitrer dieksekusi pada banyak node dan hasilnya kemudian dikumpulkan dan dikumpulkan.
Setiap node adalah turunan dari mesin virtual Ubuntu Linux dan menjalankan proses master yang mengurus meneruskan kode yang akan dieksekusi ke sejumlah proses pekerja (1 untuk setiap inti).
Pertanyaan ini adalah tentang bagaimana memastikan bahwa setiap pekerja beroperasi di lingkungan berpasir tanpa menggunakan mesin virtual untuk masing-masing pekerja. Persyaratan pasti untuk pekerja adalah:
- fs : tidak ada izin menulis, izin hanya-baca terbatas pada satu direktori (dan sub-folder)
- net : hanya komunikasi lokal yang diizinkan (IPC, TCP, apa pun ...)
- mem : tutup penggunaan memori (tidak ada memori swap) membunuh jika melebihi batas mem
- cpu : hanya 1 inti yang diizinkan, bunuh jika melebihi batas waktu
Tidak ada batasan lain yang harus dipaksakan: pekerja harus dapat memuat pustaka dinamis (dari folder read-only), menelurkan utas atau proses baru, fungsi sistem panggilan, ecc ecc tetapi batas-batas harus diwariskan oleh entitas spawned / loaded dan harus diterapkan dengan cara yang bijaksana (misalnya kita tidak dapat memiliki pekerja menelurkan dua utas yang menggunakan 800MB masing-masing adalah batas memori untuk pekerja tersebut adalah 1GB).
Tak perlu dikatakan bahwa seharusnya tidak ada cara bagi pekerja untuk meningkatkan haknya.
Saya menghabiskan banyak waktu meninjau alternatif yang tersedia (SELinux, AppArmor, cgroups, ulimit, ruang nama Linux, LXC, Docker, ...) untuk solusi paling sederhana yang memenuhi persyaratan saya tetapi pengalaman saya di lapangan terbatas.
Pemahaman saat ini: LXC dan Docker sedikit di sisi berat untuk kasus penggunaan saya dan tidak sepenuhnya aman 1 . AppArmor lebih disukai daripada SELinux karena konfigurasi yang lebih mudah, gunakan untuk pembatasan fs dan net; cgroups lebih disukai daripada ulimit (yang beroperasi pada satu proses tunggal), menggunakannya untuk pembatasan mem dan cpu.
Apakah ini cara paling sederhana untuk mencapai tujuan saya? Bisakah saya menggunakan AppArmor atau cgroup secara eksklusif? Apakah ada lubang keamanan yang jelas dalam model saya? Pedoman harus "pekerja diizinkan untuk menjatuhkan dirinya sendiri tetapi tidak ada yang lain" .