Jak korzystać z polecenia chroot w systemie Linux

Polecenie chroot może wysłać cię do więzienia, odizolować środowisko programistyczne lub testowe, albo po prostu poprawić bezpieczeństwo systemu. Pokażemy ci najłatwiejszy sposób korzystania z niego.

Co to jest chroot?

Jeśli chcesz ocenić użyteczność polecenia, musisz wziąć pod uwagę funkcjonalność, jaką zapewnia, oraz łatwość użycia. Jeśli jest to zbyt skomplikowane dla użytkowników lub zbyt rozwlekłe, by chcieli z niego skorzystać, funkcjonalność może być znikoma. Jeśli nikt go nie używa, nie zapewnia żadnej funkcjonalności.

W dyskusjach z użytkownikami Linuksa, zarówno osobiście, jak i na forach, wydaje się, że polecenie chroot jest uznawane za trudne w użyciu lub zbyt skomplikowane w konfiguracji. Wygląda na to, że to wspaniałe narzędzie nie jest używane tak często, jak mogłoby być.

Za pomocą chroot możesz skonfigurować i uruchamiać programy lub powłoki interaktywne takie jak Bash w hermetyzowanym systemie plików, który nie może wchodzić w interakcje z Twoim zwykłym systemem plików. Wszystko w środowisku chroot jest zapisane i zawarte. Nic w środowisku chroot nie może wyjść poza swój własny, specjalny katalog główny bez eskalacji do uprawnień roota. Dzięki temu środowisko to zyskało przydomek „więzienia chroot”. Nie należy mylić terminu „więzienie” z poleceniem FreeBSD jail, które tworzy środowisko chroot, które jest bezpieczniejsze niż zwykłe środowisko chroot.

Ale w rzeczywistości istnieje bardzo prosty sposób korzystania z chroot, przez który przejdziemy. Użyjemy standardowych poleceń Linuksa, które będą działać na wszystkich dystrybucjach. Niektóre dystrybucje Linuksa mają dedykowane narzędzia do konfigurowania środowisk chroot, takie jak debootstrap dla Ubuntu, ale tutaj jesteśmy agnostykami.

Kiedy należy używać chroota?

Środowisko chroot zapewnia funkcjonalność podobną do maszyny wirtualnej, ale jest lżejszym rozwiązaniem. System captive nie wymaga instalacji i konfiguracji hiperwizora, takiego jak VirtualBox lub Menedżer maszyny wirtualnej. Nie musi mieć jądra zainstalowanego w systemie captive; udostępnia Twoje istniejące jądro.

W pewnym sensie środowiska chroot są bliższe kontenerom, takim jak LXC, niż do maszyn wirtualnych. Są lekkie, szybkie do wdrożenia, a ich tworzenie i uruchamianie można zautomatyzować. Podobnie jak w przypadku kontenerów, jednym wygodnym sposobem ich skonfigurowania jest zainstalowanie systemu operacyjnego w ilości wystarczającej do wykonania wymaganego zadania. Na pytanie „co jest wymagane” można odpowiedzieć, patrząc na to, jak zamierzasz używać środowiska chroot.

Niektóre typowe zastosowania to:

  • Rozwój oprogramowania i weryfikacja produktów: Programiści piszą oprogramowanie, a zespół weryfikujący produkt (PV) je testuje. Czasami PV znajduje problemy, których nie można odtworzyć na komputerze dewelopera. Chroot pozwala programistom mieć na swoim komputerze zwykłe, waniliowe środowisko, w którym mogą testować oprogramowanie przed przekazaniem go do PV.
  • Zmniejszanie ryzyka rozwoju: Deweloper może stworzyć dedykowane środowisko programistyczne, aby nic, co się w nim dzieje, nie zepsuło jego rzeczywistego komputera.
  • Uruchamianie wycofanego oprogramowania: Czasami wystarczy mieć uruchomioną starą wersję aplikacji. Chroot pozwala na uruchomienie oprogramowania, które miałoby problemy z kompatybilnością z bieżącym systemem.
  • Odzyskiwanie i aktualizacje systemu plików: Jeśli instalacja Linuksa przestanie działać, możesz użyć chroot, aby zamontować uszkodzony system plików w punkcie montowania na Live CD.
  • Aplikacje Ringfencing: Uruchamianie serwera FTP lub innego urządzenia podłączonego do Internetu w środowisku chroot ogranicza szkody, jakie może wyrządzić osoba atakująca z zewnątrz.

Tworzenie środowiska chroot

Potrzebujemy katalogu, który będzie działał jako katalog główny środowiska chroot. Abyśmy mogli w skrócie odnosić się do tego katalogu, utworzymy zmienną i zapiszemy w niej nazwę katalogu. Ustawiamy zmienną do przechowywania ścieżki do katalogu „testroot”. Nie ma znaczenia, czy ten katalog jeszcze nie istnieje, wkrótce go utworzymy. Jeśli katalog istnieje, powinien być pusty.

chr=/home/dave/testroot

Jeśli katalog nie istnieje, musimy go utworzyć. Możemy to zrobić za pomocą tego polecenia. Opcja -p (rodzice) zapewnia, że wszystkie brakujące katalogi nadrzędne są tworzone w tym samym czasie:

mkdir -p $chr

Musimy utworzyć katalogi do przechowywania części systemu operacyjnego, których będzie wymagało nasze środowisko chroot. Skonfigurujemy minimalistyczne środowisko Linuksa, które używa Bash jako interaktywnej powłoki. Uwzględnimy również polecenia touch, rm i ls. Pozwoli nam to na użycie wszystkich wbudowanych poleceń Basha oraz touch, rm i ls. W tym prostym przykładzie to wszystko.

Wypisz katalogi, które musisz utworzyć w rozszerzeniu nawiasów.

mkdir -p $chr/{bin,lib,lib64}

Teraz zmienimy katalog na nasz nowy katalog główny.

cd $chr

Skopiujmy pliki binarne, których potrzebujemy w naszym minimalistycznym środowisku Linuksa, ze zwykłego katalogu „/bin” do naszego katalogu chroot „/bin”. Opcja -v (gadatliwa) sprawia, że cp mówi nam, co robi, wykonując każdą akcję kopiowania.

cp -v /bin/{bash,touch,ls,rm} $chr

Pliki są kopiowane:

Te pliki binarne będą miały zależności. Musimy odkryć, czym one są i skopiować te pliki do naszego środowiska, w przeciwnym razie bash, touch, rm i ls nie będą w stanie działać. Musimy to zrobić po kolei dla każdego z naszych wybranych poleceń. Najpierw zrobimy Bash. Polecenie ldd wypisze zależności dla nas.

ldd /bin/bash

Zależności są identyfikowane i wyświetlane w oknie terminala:

Musimy skopiować te pliki do naszego nowego środowiska. Wybieranie szczegółów z tej listy i kopiowanie ich pojedynczo będzie czasochłonne i podatne na błędy.

Na szczęście możemy to częściowo zautomatyzować. Ponownie wymienimy zależności i tym razem utworzymy listę. Następnie przejdziemy przez listę, kopiując pliki.

Tutaj używamy ldd do wypisywania zależności i przesyłania wyników przez potok do egrep. Używanie egrep jest tym samym, co używanie grep z opcją -E (rozszerzone wyrażenia regularne). Opcja -o (tylko dopasowanie) ogranicza wyjście do pasujących części linii. Szukamy pasujących plików biblioteki, które kończą się liczbą [0-9].

list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"

Zawartość listy możemy sprawdzić za pomocą echa:

echo $list

Teraz, gdy mamy listę, możemy przejść przez nią za pomocą następującej pętli, kopiując pliki pojedynczo. Używamy zmiennej i do przewijania listy. Dla każdego elementu listy kopiujemy plik do naszego katalogu głównego chroot, który jest wartością przechowywaną w $ chr.

Opcja -v (gadatliwa) powoduje, że cp ogłasza każdą kopię w trakcie jej wykonywania. Opcja –parents zapewnia, że wszystkie brakujące katalogi nadrzędne zostaną utworzone w środowisku chroot.

for i in $list; do cp -v --parents "$i" "${chr}"; done

A to jest wynik:

Użyjemy tej techniki do uchwycenia zależności każdego z pozostałych poleceń. Dobra wiadomość jest taka, że musimy tylko dokonać niewielkiej edycji polecenia, które zbiera zależności.

Możemy pobrać polecenie z naszej historii poleceń, naciskając kilka razy klawisz strzałki w górę, a następnie dokonując edycji. Polecenie kopiowania w pętli wcale nie musi się zmieniać.

Tutaj użyliśmy klawisza strzałki w górę, aby znaleźć polecenie i zmieniliśmy je, aby powiedzieć „touch” zamiast „bash”.

list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"

Możemy teraz powtórzyć dokładnie to samo polecenie pętli, co poprzednio:

for i in $list; do cp -v --parents "$i" "${chr}"; done

Możemy teraz edytować wiersz poleceń listy dla ls:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Ponownie użyjemy tego samego polecenia pętli. Działa na ślepo poprzez listę kopiowania plików za nas.

for i in $list; do cp -v --parents "$i" "${chr}"; done

Zależności dla ls są kopiowane:

Po raz ostatni edytujemy wiersz poleceń listy, aby działał dla rm:

list="$(ldd /bin/rm | egrep -o '/lib.*.[0-9]')"

Ostatni raz używamy zapętlonego polecenia kopiowania:

for i in $list; do cp -v --parents "$i" "${chr}"; done

Ostatnia z naszych zależności jest kopiowana do naszego środowiska chroot. W końcu jesteśmy gotowi do użycia polecenia chroot. To polecenie ustawia katalog główny środowiska chroot i określa, która aplikacja ma być uruchamiana jako powłoka.

sudo chroot $chr /bin/bash

Nasze środowisko chroot jest teraz aktywne. Zmienił się znak zachęty okna terminala, a powłoka interaktywna jest obsługiwana przez powłokę bash w naszym środowisku.

Możemy wypróbować polecenia, które wprowadziliśmy do środowiska.

ls
ls /home/dave/Documents

Polecenie ls działa zgodnie z oczekiwaniami, gdy używamy go w środowisku. Kiedy próbujemy uzyskać dostęp do katalogu poza środowiskiem, polecenie kończy się niepowodzeniem.

Możemy użyć dotyku, aby utworzyć plik, ls, aby go wyświetlić, i rm, aby go usunąć.

touch sample_file.txt
ls
rm sample_file.txt
ls

Oczywiście możemy również użyć wbudowanych poleceń, które zapewnia powłoka Bash. Jeśli wpiszesz help w wierszu poleceń, Bash wyświetli je za Ciebie.

help

Użyj wyjścia, aby opuścić środowisko chroot:

exit

Jeśli chcesz usunąć środowisko chroot, możesz je po prostu usunąć:

rm -r testroot/

Spowoduje to rekurencyjne usunięcie plików i katalogów w środowisku chroot.

Automatyzacja dla wygody

Jeśli myślisz, że środowiska chroot mogą być dla Ciebie przydatne, ale są nieco skomplikowane w konfiguracji, pamiętaj, że zawsze możesz odciążyć się i uniknąć ryzyka związanego z powtarzalnymi zadaniami, używając aliasów, funkcji i skryptów.


newsblog.pl