Bir tür sanal alanda bash betiği çalıştırmak mümkün müdür?


13

Ürünümüzün belirli bir hedefe ulaşmak için hassas bir sunucuda bilinmeyen bir bash betiği çalıştırma ihtiyacı vardır. Bu bash betiği kullanıcı tarafından sağlanır. Yalnızca belirli komutlara izin verilmesini ve diğer tüm komutlara izin verilmemesini istiyoruz. Ayrıca, bazı komutları diğerleriyle değiştirmeniz gerekir.

Örneğin, betiği yürütmek ve aşağıdaki komutlara izin vermek istiyoruz: echo cat awk

Ancak başka bir komuta izin vermeyin (burada belirli bir liste sağlamak istemiyoruz).

Ayrıca, komut dosyası cp komutunu içeriyorsa, onu yakalamak ve farklı bir komuta (diğer ad kullanılarak yapılabilir) yönlendirmek istiyoruz.

Bunun nasıl yapıldığına dair bir fikrin var mı?

Yanıtlar:


9

En kolay yol, yalnızca komut dosyasının çalışmasını istediğiniz komutları içeren bir chroot hapishanesi kullanmaktır . Daha sonra komut dosyasını chrootdizini çağıran ve daha sonra komut dosyasını yürüten bir sarıcı aracılığıyla çalıştırın.


17

Komut dosyasını sanal bir makinede çalıştırmak için% 100 güvenli bir kısa devre yoktur, bu da komut dosyasının hedefine ulaşmasını engelleyecektir. Ancak size yardımcı olabilecek iki özellik var. Komut dosyasının kötü niyetli bir kişi tarafından yazıldığından endişeleniyorsanız, bu özellikler yeterli değildir; ancak betiğin sisteminize kötü şeyler yapabileceğinden endişe ediyorsanız, dikkatsiz bir programcı tarafından veya farklı hedefler düşünülerek yazılmışsa, bu iki özellikten her ikisi de iyi bir kum havuzu ortamı sağlar.

  • Bash öğesini çağırarak kısıtlı bir kabuk çalıştırabilirsiniz bash -r. Ayrıntılı bir açıklama için bash kılavuzuna başvuruyorum; temel fikir, komut dosyasının içinde olmayan $PATH, değiştirilemeyen $PATH, bir dosyaya veya dosyadan yönlendirme yapamayan komutları çağıramaması ve birkaç kısıtlama olmasıdır. Bu, kurulumu oldukça basittir, ancak bilinmeyen komut dosyası incelemek için çok karmaşıksa, sınırlı bir kabukta yasaklanmış birçok şey kullanması muhtemeldir.

  • Bir chroot hapishanesi ayarlayabilirsiniz . Fikir, bir dizin ağacı oluşturmak /some/rootve komut dosyasını /some/roottüm dosya sistemi olduğuna inanan bir ortamda çalıştırmaktır ( chrootdeğişiklik kökü kısadır). Dizin ağacı kurulduktan sonra, komut dosyasını (kopyalanan /some/root/myscript) olarak çalıştırın chroot /some/root /bin/bash /myscript. Örneğin, /some/root/binizin vermek istediğiniz komutları içeren bir dizin kurarsınız ve chrooted program bu dizini olarak görür /bin. Programın chroot içinde yürütülmesi için gereken her şeyi kopyalamanız gerekir: kütüphaneler, veri dosyaları, bashbetiğin kendisi, vb. Betiğin /proc, chroot'un içine monte edilmesi gerekebilir ; bunu gibi bir komutla yapabilirsiniz mount -t proc proc /proc.

    Dizin ağacının tamamını bir komut dosyası için kullanılabilir hale getirmeniz gerekiyorsa, örneğin /var/example, birkaç seçeneğiniz vardır. Altında bir kopyasını yapabilirsiniz /some/root. Sabit bağlantılar yapabilirsiniz (uygulamanız için çalışıyorsa ve chroot aynı dosya sisteminde ise). Linux'ta, chroot'un içindeki mount --bind /var/example /some/root/var/example"aşılamayı" yapabilirsiniz /var/example. Bağlantının hedefi kroot içinde belirlendiğinden sembolik bir bağın çalışamayacağını unutmayın.

    Chroot'un, özellikle kök olarak çalışan işlemlere karşı mutlak güvenlik sağlamadığını unutmayın. Örneğin, bir kök işlemi, chroot içinde bir aygıt dosyası oluşturabilir ve tüm diske bu dosyadan erişebilir. Köklü bir işlem yine de ağ bağlantıları yapabilir (kroke herhangi bir ağ programı dahil etmeyerek ve güvenilmeyen programın bir dosya oluşturamamasını ve yürütülebilir olmasını veya varolan bir yürütülebilir dosyanın üzerine yazmasını engelleyerek bunu engelleyebilirsiniz).


Gereken her şeyi kopyalamanız gerekecek, kopyalamak yerine sembolik veya sabit bağlantılar yapabilir miyim?
kyb

1
@kyb Sabit bağlantı: evet. Sembolik bağlantı: hayır, sembolik bir bağlantı yalnızca görebileceğiniz bir dosyayı gösterebilir, bir chroot'tan kaçmanıza izin vermez. Sabit bağlantılar bunun için ve zor bir şekilde kullanmak zordur: dosyayı değiştirirseniz koparlar, krootun içinde yazılabilir olması durumunda orijinal kopyayı ortaya çıkarırlar. Bir ağacın tamamını kullanılabilir hale getirmek istiyorsanız, onu kopyalayın veya salt okunur bir ciltleme bağlantısı yapın.
Gilles 'SO- kötü olmayı bırak'

Ben gibi mevcut ortak komutları yapmak gerekir grep, awk, unitselle her bin dosyası ve tüm dependancies kopyalamak veya utils chroot çalışmak gerektiğini açıkça söylemek bazı kullanışlı kesmek yoktur vb Yaparım gerek?
kyb
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.