Kök olmadan bir süreci nasıl “hapse” edebilirim?


26

Kök oldum, basit bir kullanıcı / grup oluşturabilir, dosya izinlerini buna göre ayarlayabilir ve işlemi o kullanıcı olarak yürütebilirdim. Ancak ben değilim, bu yüzden kök olmadan bunu başarmanın bir yolu var mı?


1
@alex: Birden fazla simülasyon yürüten bir betiğim var (farklı dizinlerde) ve programlamanın ne kadar kötü olursa olsun, sadece kendi dizinlerindeki dosyalara erişebildiklerinden ve diğer simülasyonların çıktısını yanlışlıkla değiştiremediklerinden emin olmak istiyorum
Tobias Kienzler

2
@ Tobias: Amacını anladım. chrootdoğal olarak oraya sığacaktı, ama sonra yine kök değilsin.
alex

1
O selinux, AppArmor ve grsecurity, düşünmek olabilir bunu yapmak mümkün, ama emin değilim. ama o zaman bu sistemler sys yöneticisi tarafından bulunmuyorsa veya yapılandırılmamışsa, siz bunu çözersiniz.
xenoterracide

4
Böyle bir soru, yıllardır merak edeceğim bir şeydi. Bu çok doğal bir dilek gibi görünüyor: kök olmadan, atılan bazı kullanıcı izinleriyle işlem yürütebilme, yani işlemi bile verecek bir kullanıcı kurulum "hapishanesi" ile sınırlayabilmeniz. Kullanıcınızdan daha az hak. Her zamanki Unices bu standart olarak teklif vermedi yazık!
imz - Ivan Zakharyaschev

2
Sistem yöneticinizden sizi ikinci bir kullanıcı hesabı yapmasını istemeyi deneyin.
LawrenceC

Yanıtlar:


23

Dikkat edilmesi gereken daha fazla cevabı olan daha benzer sorular:

NOT: Buradaki cevapların bazıları, burada henüz belirtilmeyen özel çözümlere işaret etmektedir.

Aslında, farklı uygulanması ile epeyce jailing araçları var, ama bunların çoğu ya tasarım gereği güvenli değildir (gibi fakeroot, LD_PRELOADtabanlı), ya da değil tamamlandı (gibi fakeroot-ng, ptracetabanlı) veya (kök gerektirecektir chrootya plashda belirttiğimiz fakechroot uyarı etiketi ).

Bunlar sadece örnek; Bunların hepsini yan yana listelemeyi düşündüm, bu 2 özelliğin ("güvenilir olabilir mi?", "Kök kurulumu gerekiyor mu?") Göstergesiyle, belki de İşletim sistemi düzeyinde sanallaştırma Uygulamalarında .

Genel olarak, buradaki cevaplar açıklanan tüm olasılıkları ve hatta daha fazlasını kapsar:

sanal makineler / işletim sistemi

çekirdek uzantısı (SELinux gibi)

  • (burada yorumlarda belirtilen),

chroot

Chroot tabanlı yardımcılar (bunun için setUID kökü olması gerekir, çünkü chrootkök gerektirir; veya belki de chrootyalıtılmış bir ad alanında çalışabilir - aşağıya bakın):

[onlar hakkında biraz daha fazla şey anlatmak için!]

Bilinen chroot tabanlı izolasyon araçları:

  • onun hsh-runve hsh-shellkomutları ile hasher . ( Hasher yazılımı güvenli ve tekrarlanabilir bir şekilde oluşturmak için tasarlanmıştır.)
  • Başka bir cevapta belirtilen schroot
  • ...

ptrace

(Yanı sıra başka güvenilir izolasyon çözüm bir seccompmerkezli bir ) üzerinden tam syscall-durdurma olacaktır ptraceiçin manpage açıklandığı gibi, fakeroot-ng:

Önceki uygulamalardan farklı olarak, sahte uygulama, izlemeli işlemi sahte fırlatma işleminin "hizmetlerini" kullanıp kullanmayacağına ilişkin hiçbir seçenek bırakmayan bir teknoloji kullanır. Bir programı statik olarak derlemek, çekirdeği doğrudan çağırmak ve kendi adres alanlarını değiştirmek, işlem sırasında LD_PRELOAD tabanlı kontrolü atlamak için önemsizce kullanılabilecek ve sahte uygulama için geçerli olmayan tüm tekniklerdir. Teorik olarak, iz bırakma işlemi üzerinde tam kontrole sahip olacak şekilde sahte köklendirme yapmak mümkündür.

Teorik olarak mümkün olsa da henüz yapılmamıştır. Fakerooting, izlenmekte olan süreçle ilgili belirli "güzel davranışlı" varsayımları kabul eder ve bu varsayımları ihlal eden bir süreç, eğer tamamen kaçmazlarsa, en azından sahte tarafından çevrilen "sahte" ortamın bir kısmını dolaştırabilir. ng. Bu nedenle, sahte aracı bir güvenlik aracı olarak kullanmama konusunda şiddetle uyarılırsınız. Hata, bir sürecin kasten (istemeden aksine) kaçmasının sahte bir kökünden kaçabileceğini iddia ettiğini bildirir.

Bu politikanın gelecekte yeniden düşünülmesi mümkündür. Bununla birlikte, şu an için uyarıldısınız.

Yine de, okuyabileceğiniz gibi, fakeroot-ngkendisi bu amaç için tasarlanmamıştır.

(BTW, neden seccompChromium için- tabanlı bir yaklaşımı kullanmayı tercih ettiklerini merak ediyorum ptrace...)

Yukarıda belirtilmeyen araçlardan kendim için Geordi'ye dikkat çektim, çünkü kontrol programının Haskell'de yazılmasından hoşlandım.

Bilinen parça tabanlı izolasyon araçları:

Seccomp

İzolasyon elde etmenin bilinen bir yolu , Google Chromium'da kullanılan seccomp sanal alan yaklaşımından geçer . Ancak bu yaklaşım, "ele geçirilen" dosya erişiminin ve diğer sistem çağrılarının bazılarını (izin verilenleri) işleyecek bir yardımcı yazdığınızı varsayar; ve ayrıca, elbette, sistemlere "müdahale" etmek ve onları yardımcıya yönlendirmek için çaba harcamak (belki de, ele geçirilen sistemlerin kontrol edilen işlem kodunda değiştirilmesi gibi bir şey anlamına geleceği anlamına gelir; oldukça basit olmak gerekirse, eğer ilgileniyorsanız, sadece benim cevabımdan ziyade detayları okusanız iyi olur).

Daha fazla ilgili bilgi (Wikipedia'dan):

( seccompChromium'un dışında bir genel tabanlı bir çözüm arıyorsanız, son madde ilginç görünüyor . Ayrıca "seccomp-nurse" yazarından okunmaya değer bir blog yazısı var: Sandboxing çözümü olarak SECCOMP? )

"Seccomp-nurse" projesinden bu yaklaşımı gösteren örnek resim :

                      görüntü tanımını buraya girin

Linux'un geleceğinde "esnek" bir sekcomp.

Ayrıca 2009'da Linux çekirdeğini yamalama önerileri vardı, seccompböylece mod için daha fazla esneklik elde edildi - "şu anda ihtiyaç duyduğumuz akrobasi çoğundan kaçınılabilecekti". ( "Akrobasi" hapisteki sürecin adına ve hapisteki süreçte muhtemelen masum syscalls yerine birçok muhtemelen masum syscalls yürütmek zorunda olan bir yardımcı yazma komplikasyonlar ifade eder.) Bir LWN ürün bu noktaya yazdı:

Ortaya çıkan bir öneri seccomp'e yeni bir "mod" eklemek oldu. API, farklı uygulamaların farklı güvenlik gereksinimlerine sahip olabileceği düşüncesiyle tasarlanmıştır; yerine getirilmesi gereken kısıtlamaları belirten bir "mod" değeri içerir. Sadece orijinal mod şimdiye kadar uygulandı, ancak diğerleri kesinlikle eklenebilir. Hangi sistem çağrısına izin verileceğini belirten başlatma işlemine izin veren yeni bir mod oluşturmak, tesisi Chrome sanal alanı gibi durumlar için daha kullanışlı hale getirir.

Adam Langley (ayrıca Google) da bunu yapan bir yama yayınladı. Yeni "mod 2" uygulaması, hangi sistem çağrılarının erişilebilir olduğunu açıklayan bir bit maskesini kabul eder. Bunlardan biri prctl () ise, sanal alan kodu kendi sistem çağrılarını daha da kısıtlayabilir (ancak reddedilen sistem çağrılarına erişimi geri yükleyemez). Tüm bunlar, sanal alan geliştiricileri için hayatı kolaylaştırabilecek makul bir çözüme benziyor.

Bununla birlikte, bu kod asla birleştirilemez çünkü tartışma o zamandan beri başka olasılıklara geçti.

Bu "esnek sekonder", Linux'un OS'de istenen özelliği sağlamaya daha da zorlaştıracak, karmaşık olan yardımcıları yazmaya gerek kalmayacaktı.

(Temelde bu cevapla aynı içeriğe sahip bir blog yazısı: http://geofft.mit.edu/blog/sipb/33 .)

ad alanları ( unshare)

Ad alanlarını yalıtmak ( unsharetemelli çözümler ) - burada belirtilmemiş - örneğin, bağlantı noktalarını (FUSE ile birleştirmek) paylaştırmak belki de güvenilmeyen işlemlerinizin dosya sistemi erişimini sınırlandırmak istediğiniz için çalışan bir çözümün parçası olabilir.

Ad alanları hakkında daha fazlası, şimdi, uygulamaları tamamlandığı için (bu izolasyon tekniği aynı zamanda "Linux Containers" veya "LXC" adı altında da bilinir , değil mi? ..):

"Ad alanlarının genel hedeflerinden biri, hafif sanallaştırma (ve diğer amaçlar için) olan bir araç olan kapların uygulanmasını desteklemektir" .

Yeni bir kullanıcı ad alanı oluşturmak bile mümkündür, böylece "bir işlem, bir kullanıcı ad alanının dışında normal bir ayrıcalıklı kullanıcı kimliğine sahip olabilirken, aynı zamanda ad alanında 0 kullanıcı kimliğine sahip olabilir. Bu, işlemin tam kök ayrıcalıklarına sahip olduğu anlamına gelir. kullanıcı ad alanındaki işlemler için, ancak ad alanının dışındaki işlemler için ayrıcalıklı değil ".

Bunu yapmak için gerçek çalışma komutları için aşağıdaki cevaplara bakın:

ve özel kullanıcı alanı programlama / derleme

Ancak, elbette, istenen "hapis" garantileri, kullanıcı alanında programlama yapılarak uygulanabilir ( işletim sistemi kaynaklı bu özellik için ek bir destek olmadan ; belki de bu özellik işletim sistemlerinin tasarımında ilk sırada yer almamış olabilir). ); az ya da çok komplikasyonlu

Bahsedilen ptrace- veya seccomptemelli kum havuzu, "Unix programları" keyfi olarak "kara kutular" olarak değerlendirilecek olan diğer işlemlerinizi kontrol edecek bir kum kutusu yardımcı yazarak, garantilerin uygulanmasının bazı değişkenleri olarak görülebilir.

Başka bir yaklaşım, izin verilmeyen etkilerle ilgilenebilecek programlama tekniklerini kullanmak olabilir. (O zaman programları yazan kişi sen olmalısın; artık kara kutular değiller.) Birini söylemek gerekirse, saf bir programlama dili kullanarak (sizi yan etkiler olmadan programlamaya zorlar) Haskell gibi sadece tüm etkilerini yapar. programın açık olması, böylece programcının kolayca izin verilmeyen bir etkisi olmayacağından emin olabilirsiniz.

Sanırım, programlama için başka bir dilde, örneğin Java gibi, kum havuzu olanakları var.


Bu konuyla ilgili bilgi toplayan bazı sayfalar, oradaki cevaplara da işaret etti:


Rootless GoboLinux de bir seçenek olabilir ...
Tobias Kienzler

@tobias Ancak Rootless Gobolinux, kullanıcı tarafından yazılan bir programın dış ortama
erişemeyeceği garantisi veriyor

1
Gerçekten değil - bir şekilde, bir kişinin "yerel" bir kök kullanıcısı olmasına izin verecek olduğu gibi yanlış bir düşünceye kapılmıştım - bu durumda böyle bir işlem için basitçe sanal kullanıcılar yaratabiliyordu - ancak kullanımı muhtemelen mümkün olabilirdi chroot, gerçek kök ayrıcalıklar ...
Tobias Kienzler

8

Bu, unix izin modelinin temel bir sınırlamasıdır: sadece root yetki verebilir.

Sanal bir makine çalıştırmak için kök olmanıza gerek yok (tüm VM teknolojilerinde geçerli değil), ancak bu ağır bir çözüm.

Kullanıcı modu Linux nispeten hafif bir Linux on Linux sanallaştırma çözümüdür. Kurulması o kadar kolay değil; En az boot gereken minimum (birkaç dosyalarla (Bir dizindeki) Root bölümü doldurmak gerekir /etc, /sbin/initve kendisine bağlı bir giriş programı, bir kabuk ve yardımcı).


1

LD_PRELOADBazı dosyalara erişimi engellemede şansınız olabilir, ancak bu gerçekten zor olabilir.


Google Chromium'un gizli bilgisayar sanal alanı daha güvenilir bir şey yapar - etkin bir şekilde arayarak çağrıyı engelleme. - unix.stackexchange.com/questions/6433/…
imz - Ivan Zakharyaschev

Sadece bir şeyi engellemeye çalışmakla sanboxing arasındaki fark (Chromium'da olduğu gibi) izolasyonun garantisidir.
imz - Ivan Zakharyaschev 9:11

1
Geçiş yolu LD_PRELOADile güvenilemez (atlatılabilir), ancak geçme yolu ile eleptrace geçirilebilir .
imz - Ivan Zakharyaschev 9:11

1
Burada basit bir örnek, < joey.kitenet.net/blog/entry/fakechroot_warning_label > tarafından sunulan LD_PRELOADçözümlerin güvenlik önlemi olarak güvenilemeyeceğini göstermektedir.
imz - Ivan Zakharyaschev 12:11

0

Tam listeden ekleyeceğim sadece:

  • fakeroot (debian paket bakımcısından): "dost" araçlar kullanarak paket oluşturmayı hedefliyor. Bu tam bir yalıtım değildir, ancak farklı kullanıcılar ve sahte cihazlar ve diğer özel sahte dosyalar içeren paketler oluşturmaya yardımcı olur.

  • fakechroot (sahte kullanır). Bu programın birçok hatası var. Örneğin, "/ etc / hosts" glibc'de kodlanmıştır: bu araçla değiştiremezsiniz.

  • qemu: bir linux çekirdeği derlemeniz gerekiyor, ancak sonuç çok hızlı ve gerçek kök ayrıcalıklarına sahip "sahte" (yani sanal) bir makine. Herhangi bir önyükleme görüntüsü oluşturabilir ve monte edebilirsiniz.


0

Firejail, root erişimi olan veya olmayan birçok seçenekle çok esnek ve esnek bir yöntemdir:


2
İtfaiyenin nasıl kullanılacağına dair biraz daha ayrıntılı bilgi verilir. Bu bağlantı kesildikten sonra, cevap bilgileri içeriğiniz yalnızca yardımcı programların adına iner. (dağıtımlarda mevcut paketler varsa buraya ekleyin, nasıl kullanılacağı vb.).
Anthon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.