Sorunuzun birçok ayrıntısının avahi-daemon
, son zamanlarda baktığım gibi aynı derecede geçerli olabileceğini düşünüyorum . (Gerçi farklı bir ayrıntı kaçırmış olabilir). Avahi-daemon'un bir krootta çalıştırılmasının birçok avantajı vardır, avahi-daemon'un tehlikeye girmesi durumunda. Bunlar:
- herhangi bir kullanıcının giriş dizinini okuyamaz ve özel bilgileri genişletemez.
- / tmp dosyasına yazarak diğer programlardaki hataları kullanamaz. Bu tür hataların en az bir kategorisi vardır. Örneğin https://www.google.co.uk/search?q=tmp+race+security+bug
- diğer cinlerin dinlediği ve mesajları okuyabileceği, kök dışında olan herhangi bir unix soket dosyasını açamaz.
Nokta 3, dbus veya benzeri bir şey kullanmadığınızda özellikle güzel olabilir ... Bence avahi-daemon dbus kullanıyor, bu yüzden sistem dbus'a bile krobin içinden erişmeyi sürdürüyor. Sistem dbus'ına mesaj gönderme yeteneğine ihtiyacınız yoksa, bu yeteneğin reddedilmesi oldukça güzel bir güvenlik özelliği olabilir.
systemd birim dosyası ile yönetme
Avahi-daemon yeniden yazıldıysa, güvenlik için systemd'ye güvenmeyi ve ör ProtectHome
. Bu korumaları fazladan bir katman olarak eklemek için avahi-daemon'da bir değişiklik önerdim, bunun yanında chroot tarafından garanti edilmeyen bazı ek korumalar da önerdim. Burada önerdiğim seçeneklerin tam listesini görebilirsiniz:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Avahi-cin yaptıysam kullanmış olabilir daha kısıtlamalar vardır gibi görünüyor değil sözü bunlardan bazıları chroot kendisini kullanın mesajı işlemek. Bunun ne kadar geçerli olduğundan emin değilim.
Unutmayın, kullandığım korumalar, arka plan programının unix soket dosyalarını açmasını kısıtlamazdı (yukarıdaki 3. nokta).
Başka bir yaklaşım SELinux kullanmak olacaktır. Ancak, uygulamanızı Linux dağıtımlarının bu alt kümesine bağlıyorsunuz. SELinux'u burada olumlu olarak düşünmemizin nedeni, SELinux'un süreçlerin dbus üzerindeki erişimini ince bir şekilde kısıtlamasıdır. Örneğin, sık sık systemd
:-) mesaj göndermek için gereken otobüs isimleri listesinde olmayacağını bekleyebilirsiniz düşünüyorum .
"Systemd sandboxing'i chroot / setuid / umask / ... 'dan daha güvenli kullanıyorsanız merak ediyordum."
Özet: neden ikisi de olmasın? Yukarıda biraz çözelim :-).
3. noktayı düşünürseniz, chroot kullanmak daha fazla sınırlama sağlar. ProtectHome = ve arkadaşları kroot kadar kısıtlayıcı olmaya bile çalışmazlar. (Örneğin, adlandırılmış sistemd seçeneklerinden hiçbiri, /run
unix soket dosyaları koyma eğiliminde olduğumuz kara listelerdir ).
chroot, dosya sistemi erişimini kısıtlamanın çok güçlü olabileceğini, ancak Linux'taki her şeyin bir dosya olmadığını gösteriyor :-). Dosya olmayan diğer şeyleri kısıtlayabilen systemd seçenekleri vardır. Bu, programın tehlikeye girmesi durumunda, içindeki bir güvenlik açığından yararlanmaya çalışabileceği çekirdek özelliklerini azaltabilirsiniz. Örneğin avahi-daemon'un bluetooth yuvalarına ihtiyacı yoktur ve sanırım web sunucunuz da :-). Bu yüzden AF_BLUETOOTH adres ailesine erişim izni vermeyin. Sadece RestrictAddressFamilies=
seçeneği kullanarak AF_INET, AF_INET6 ve belki AF_UNIX'i beyaz listeye ekleyin .
Lütfen kullandığınız her seçenek için dokümanları okuyun. Bazı seçenekler diğerleriyle birlikte daha etkilidir ve bazıları tüm CPU mimarilerinde kullanılamaz. (CPU kötü olduğu için değil, bu CPU'nun Linux portu o kadar iyi tasarlanmadığı için.
(Burada genel bir ilke vardır. Reddetmek istediklerinize değil, izin vermek istediklerinizin listesini yazabiliyorsanız daha güvenlidir. Bir chroot tanımlamak size erişmenize izin verilen dosyaların listesini verir ve bu daha sağlamdır engellemek istediğini söylemekten daha /home
).
Prensip olarak, setuid () yönteminden önce aynı kısıtlamaları kendiniz uygulayabilirsiniz. Tüm bunlar sadece systemd'den kopyalayabileceğiniz bir kod. Ancak, systemd birim seçeneklerinin yazılması çok daha kolay olmalı ve standart biçimde olduklarından okunması ve gözden geçirilmesi daha kolay olmalıdır.
Bu nedenle man systemd.exec
, hedef platformunuzdaki korumalı alan bölümünü okumanızı şiddetle tavsiye ederim . Ancak mümkün olan en güvenli tasarımı istiyorsanız, programınızda da denemek chroot
(ve sonra root
ayrıcalık bırakmak ) için korkmazdım . Burada bir ödünleşme var. Kullanımı genel tasarımınıza bazı kısıtlamalar getirir. Zaten chroot kullanan bir tasarımınız varsa ve ihtiyacınız olanı yapıyor gibi görünüyorsa, kulağa harika geliyor.chroot