Jak korzystać z polecenia chroot w systemie Linux

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

Co to jest chroot?

Jeśli spróbujesz zmierzyć użyteczność polecenia, musisz wziąć pod uwagę funkcjonalność, jaką zapewnia i łatwość użycia. Jeśli jest to zbyt skomplikowane dla ludzi w użyciu lub zbyt rozwlekłe, aby chcieli z niego skorzystać, funkcjonalność może równie dobrze wynosić zero. Jeśli nikt go nie używa, nie zapewnia żadnej funkcjonalności.

W dyskusjach z użytkownikami Linuksa – osobiście i na forach – wydaje się, że polecenie chroot jest takie, które jest trudne w użyciu lub zbyt trudne i żmudne 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 tego typu środowisko zyskało przydomek więzienia chroot. Nie należy mylić terminu „więzienie” FreeBSD jail polecenie, które tworzy środowisko chroot to jest bezpieczniejsze niż zwykłe środowisko chroot.

Ale w rzeczywistości istnieje bardzo prosty sposób korzystania z chroot, przez który przejdziemy. Używamy zwykłych 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 też mieć jądra zainstalowanego w systemie captive. System 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. Deweloper zainstalował na swoim komputerze programistycznym różnego rodzaju narzędzia i biblioteki, których przeciętny użytkownik – i PV – nie będzie miał. Często okazuje się, że nowe oprogramowanie, które działa dla programisty, ale nie dla innych, korzysta z zasobów na komputerze dewelopera, które nie zostały uwzględnione w testowej wersji oprogramowania. chroot pozwala programistom mieć na swoim komputerze zwykłe, waniliowe środowisko, w którym mogą zanurzyć oprogramowanie przed przekazaniem go do PV. Środowisko captive można skonfigurować z minimalnymi zależnościami wymaganymi przez oprogramowanie.

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ę czegoś. Jeśli stare oprogramowanie ma wymagania, które kolidowałyby lub były niekompatybilne z twoją wersją Linuksa, możesz chrootować środowisko dla oprogramowania powodującego problem.

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. Pozwala to na pracę w uszkodzonym systemie i próbę naprawienia go tak, jakby był zamontowany normalnie w katalogu głównym /. Oznacza to, że do oczekiwanych ścieżek plików w uszkodzonym systemie będą się poprawnie odwoływać z katalogu głównego, a nie z punktu podłączenia Live CD. Podobną technikę wykorzystano w artykule opisującym migrację systemu plików Linuksa z ext2 lub ext3 do ext4.

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. Może to być cenny krok w zwiększaniu bezpieczeństwa Twojego systemu.

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. Tutaj 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

chr = / home / dave / testroot w oknie terminala

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

mkdir -p $ chr w oknie terminala

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. Będziemy mogli tworzyć, wyświetlać i usuwać pliki oraz używać Bash. I – w tym prostym przykładzie – to wszystko.

Wypisz katalogi, które musisz utworzyć w {} rozszerzenie nawiasów.

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

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

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

cd $chr

cd $ chr w oknie terminala

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

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

Pliki są dla nas kopiowane:

wyjście z cp, gdy pliki są kopiowane w oknie terminala

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 będzie wypisz zależności dla nas.

ldd /bin/bash

ldd / bin / bash w oknie terminala

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

Zależności Bash wymienione 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]')"

list =

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

echo $list

echo $ list w oknie terminala

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 członka 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

dla i w $ list;  do cp -v --parents

A to jest wynik:

wyjście z pętli cp w oknie terminala

Użyjemy tej techniki do uchwycenia zależności każdego z pozostałych poleceń. I użyjemy techniki pętli, aby wykonać faktyczne kopiowanie. 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ć dotyk zamiast bash.

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

list =

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

dla i w $ list;  do cp -v --parents

A nasze pliki są dla nas kopiowane:

foutput pętli cp kopiującej zależności dotykowe w oknie terminala

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

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

list =

Ponownie użyjemy tego samego polecenia pętli. Nie obchodzi go, jakie pliki znajdują się na liście. Działa na ślepo poprzez listę kopiowania plików za nas.

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

dla i w $ list;  do cp -v --parents

Zależności dla ls są dla nas kopiowane:

Wyjście z pętli cp kopiującej zależności ls w oknie terminala

Po raz ostatni edytujemy wiersz poleceń listy, dzięki czemu działa dla rm:

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

list =

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

sudo chroot $ chr / bin / bash w oknie terminala

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.

Aktywne środowisko chroot w oknie terminala

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

ls
ls /home/dave/Documents

Aktywne środowisko chroot w oknie terminala

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

dotknij przykładowy_plik.txt w oknie terminala

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

Wyjście polecenia pomocy w oknie terminala

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

exit

użycie wyjścia do opuszczenia środowiska chroot w oknie terminala

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

rm -r testroot/

rm -r testroot / w oknie terminala

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.