Czy można uruchomić skrypt bash w piaskownicy?

13

Nasz produkt musi wykonać nieznany skrypt bash na delikatnym serwerze, aby osiągnąć określony cel. Ten skrypt bash jest dostarczany przez użytkownika. Zależy nam na tym, aby dozwolone były tylko określone polecenia, a inne nie. Ponadto musimy zastąpić niektóre polecenia innymi.

Na przykład chcielibyśmy wykonać skrypt i zezwolić na następujące polecenia: echo cat awk

Ale nie zezwalaj na żadne inne polecenia (nie chcemy tutaj podawać konkretnej listy).

Ponadto, jeśli skrypt zawiera polecenie cp, chcielibyśmy go przechwycić i przekierować do innego polecenia (które można wykonać za pomocą aliasu).

Wiesz, jak to się robi?

Tam
źródło

Odpowiedzi:

9

Najłatwiejszym sposobem jest użycie więzienia chroot zawierającego tylko polecenia, które skrypt może uruchomić. Następnie uruchom skrypt przez opakowanie, które wywołuje chrootkatalog, a następnie wykonuje skrypt.

Ignacio Vazquez-Abrams
źródło
17

Nie ma stuprocentowo bezpiecznego uruchomienia skryptu na maszynie wirtualnej, co prawdopodobnie uniemożliwiłoby skryptowi osiągnięcie jego celu. Ale są dwie funkcje, które mogą ci pomóc. Jeśli obawiasz się, że skrypt został napisany przez złośliwą osobę, te funkcje nie są wystarczające; ale jeśli martwisz się tylko, że skrypt może zrobić coś złego w twoim systemie, ponieważ został napisany przez nieostrożnego programistę lub z myślą o różnych celach, każda z tych dwóch funkcji zapewnia przyzwoite środowisko piaskownicy.

  • Możesz uruchomić ograniczoną powłokę , wywołując bash jako bash -r. Szczegółowy opis odsyłam do podręcznika bash. podstawową ideą jest to, że skrypt nie może wywoływać poleceń, których nie ma, nie $PATHmoże się zmieniać $PATH, nie może przekierowywać do lub z pliku, a także kilka innych ograniczeń. Jest to dość proste do skonfigurowania, ale jeśli nieznany skrypt jest zbyt skomplikowany, abyś mógł go sprawdzić, prawdopodobnie użyje wielu rzeczy, które są zabronione w ograniczonej powłoce.

  • Możesz założyć więzienie chroot . Chodzi o skonfigurowanie drzewa katalogów /some/rooti uruchomienie skryptu w środowisku, które uważa, że /some/rootjest to cały system plików ( chrootskrót od zmiany root). Po skonfigurowaniu drzewa katalogów uruchom skrypt (skopiowany do /some/root/myscript) jako chroot /some/root /bin/bash /myscript. Na przykład utworzyłbyś katalog /some/root/binz poleceniami, na które chcesz zezwolić, a program chrootowałby ten katalog jako /bin. Będziesz musiał skopiować wszystko, co jest potrzebne do wykonania programu wewnątrz chroot: biblioteki, pliki danych, bashsam skrypt itp. Skrypt może wymagać /proczamontowania wewnątrz chroota; możesz to zrobić za pomocą polecenia takiego jak mount -t proc proc /proc.

    Jeśli chcesz udostępnić skryptowi całe drzewo katalogów, powiedzmy /var/example, że masz kilka możliwości. Możesz zrobić kopię pod /some/root. Możesz tworzyć twarde linki (jeśli działają dla twojej aplikacji, a chroot jest w tym samym systemie plików). W systemie Linux można zrobić mount --bind /var/example /some/root/var/example„przeszczepienie” /var/examplewewnątrz chroota. Zauważ, że dowiązanie symboliczne nie może działać, ponieważ cel łącza jest określony w chroot.

    Zauważ, że chroot nie zapewnia absolutnego bezpieczeństwa, szczególnie przed procesami działającymi jako root. Na przykład proces root może utworzyć plik urządzenia wewnątrz chroot i uzyskać dostęp do całego dysku za jego pośrednictwem. Proces chrootowany może nadal nawiązywać połączenia sieciowe (możesz tego zabronić, nie włączając w to żadnego programu sieciowego i upewniając się, że niezaufany program nie może utworzyć pliku i spowodować, że będzie wykonywalny lub zastąpi istniejący plik wykonywalny).

Gilles „SO- przestań być zły”
źródło
Musisz skopiować wszystko , co potrzebne , czy mogę tworzyć dowiązania symboliczne lub twarde zamiast kopiować?
Kyb
1
@kyb Twardy link: tak. Dowiązanie symboliczne: nie, dowiązanie symboliczne może wskazywać tylko na plik, który widzisz, nie pozwala ci uciec od chroota. Twarde linki są trudne do użycia i kłopotliwe: pękają, jeśli zastąpisz plik, ujawniają oryginalną kopię, na wypadek, gdyby można ją było zapisać w chroot. Jeśli chcesz udostępnić całe drzewo, skopiuj je lub wykonaj podłączenie tylko do odczytu.
Gilles „SO- przestań być zły”,
Muszę zrobić dostępne polecenia wspólne jak grep, awk, unitsitp muszę kopiować każdy plik bin i wszystkie dependancies ręcznie czy istnieje jakiś poręczny Hack powiedzieć wyraźnie, co utils powinien pracować w środowisku chroot?
kyb