Saya pikir banyak detail pertanyaan Anda dapat berlaku sama avahi-daemon
, yang saya lihat baru-baru ini. (Saya mungkin melewatkan detail lain yang berbeda). Menjalankan avahi-daemon dalam chroot memiliki banyak keuntungan, seandainya avahi-daemon terganggu. Ini termasuk:
- itu tidak dapat membaca direktori home pengguna dan mengekstrak informasi pribadi.
- tidak dapat mengeksploitasi bug di program lain dengan menulis ke / tmp. Setidaknya ada satu kategori bug seperti itu. Misalnya https://www.google.co.id/search?q=tmp+race+security+bug
- itu tidak dapat membuka file soket unix yang berada di luar chroot, yang daemon lain mungkin mendengarkan dan membaca pesan.
Poin 3 bisa sangat bagus ketika Anda tidak menggunakan dbus atau serupa ... Saya pikir avahi-daemon menggunakan dbus, jadi pastikan untuk menjaga akses ke sistem dbus bahkan dari dalam chroot. Jika Anda tidak memerlukan kemampuan untuk mengirim pesan pada sistem dbus, menyangkal kemampuan itu mungkin fitur keamanan yang cukup bagus.
mengelolanya dengan file unit systemd
Perhatikan bahwa jika avahi-daemon ditulis ulang, itu berpotensi dapat memilih untuk mengandalkan systemd untuk keamanan, dan menggunakan mis ProtectHome
. Saya mengusulkan perubahan ke avahi-daemon untuk menambahkan perlindungan ini sebagai lapisan tambahan, bersama dengan beberapa perlindungan tambahan yang tidak dijamin oleh chroot. Anda dapat melihat daftar opsi lengkap yang saya usulkan di sini:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Sepertinya ada lebih banyak batasan yang bisa saya gunakan jika avahi-daemon tidak menggunakan chroot itu sendiri, beberapa di antaranya disebutkan dalam pesan commit. Saya tidak yakin seberapa banyak ini berlaku.
Catatan, perlindungan yang saya gunakan tidak akan membatasi daemon dari membuka file unix socket (poin 3 di atas).
Pendekatan lain adalah menggunakan SELinux. Namun Anda akan mengikat aplikasi Anda ke sub-set distribusi Linux. Alasan saya memikirkan SELinux secara positif di sini, adalah bahwa SELinux membatasi akses yang dimiliki proses pada dbus, dengan cara yang halus. Sebagai contoh, saya pikir Anda sering berharap bahwa systemd
tidak ada dalam daftar nama bus yang Anda butuhkan untuk dapat mengirim pesan ke :-).
"Aku bertanya-tanya, apakah menggunakan systemd sandboxing lebih aman daripada chroot / setuid / umask / ..."
Ringkasan: mengapa tidak keduanya? Mari kita decode sedikit di atas :-).
Jika Anda berpikir tentang poin 3, menggunakan chroot memberikan lebih banyak kurungan. ProtectHome = dan teman-temannya bahkan tidak berusaha seketat chroot. (Misalnya, tidak ada daftar nama sistemd opsi blacklist /run
, di mana kita cenderung meletakkan file socket unix).
chroot menunjukkan bahwa membatasi akses sistem file bisa menjadi sangat kuat, tetapi tidak semua Linux adalah file :-). Ada opsi systemd yang dapat membatasi hal-hal lain, yang bukan file. Ini berguna jika program ini dikompromikan, Anda dapat mengurangi fitur kernel yang tersedia untuknya, yang mungkin mencoba untuk mengeksploitasi kerentanan masuk. Misalnya avahi-daemon tidak memerlukan soket bluetooth dan saya kira server web Anda juga tidak :-). Jadi jangan berikan itu akses ke keluarga alamat AF_BLUETOOTH. Hanya daftar putih AF_INET, AF_INET6, dan mungkin AF_UNIX, menggunakan RestrictAddressFamilies=
opsi.
Silakan baca dokumen untuk setiap opsi yang Anda gunakan. Beberapa opsi menjadi lebih efektif dalam kombinasi dengan yang lain, dan beberapa tidak tersedia pada semua arsitektur CPU. (Bukan karena CPU buruk, tetapi karena port Linux untuk CPU itu tidak dirancang dengan baik. Saya pikir).
(Ada prinsip umum di sini. Lebih aman jika Anda dapat menulis daftar apa yang ingin Anda izinkan, bukan apa yang ingin Anda tolak. Seperti mendefinisikan chroot memberi Anda daftar file yang diizinkan untuk diakses, dan ini lebih kuat daripada mengatakan Anda ingin memblokir /home
).
Pada prinsipnya, Anda bisa menerapkan sendiri semua pembatasan yang sama sebelum setuid (). Itu semua hanya kode yang dapat Anda salin dari systemd. Namun, opsi unit systemd harus secara signifikan lebih mudah untuk ditulis, dan karena mereka berada dalam format standar, mereka harus lebih mudah dibaca dan ditinjau.
Jadi saya bisa sangat merekomendasikan hanya membaca bagian sandboxing man systemd.exec
pada platform target Anda. Tetapi jika Anda ingin desain yang paling aman mungkin, saya tidak akan takut untuk mencoba chroot
(dan kemudian menjatuhkan root
hak istimewa) dalam program Anda juga . Ada pengorbanan di sini. Penggunaan chroot
memberi beberapa kendala pada desain keseluruhan Anda. Jika Anda sudah memiliki desain yang menggunakan chroot, dan tampaknya melakukan apa yang Anda butuhkan, itu terdengar sangat hebat.