Dlaczego Linux zezwala na „init = / bin / bash”?


51

Niedawno dowiedziałem się, że jeśli edytuję GRUB przed uruchomieniem i dodam, rw init=/bin/bashto skończę z rootem.

Będąc w stanie, że chcę zrozumieć wszystko, chciałbym wiedzieć, dlaczego tak się dzieje. To znaczy, czy to błąd? czy to jest funkcja? czy jest to po to, aby pomóc administratorom naprawić rzeczy, ponieważ działa to tylko wtedy, gdy masz fizyczny dostęp do komputera?

Czy jest dostarczany przez GRUBa czy faktyczne jądro?


12
Jeśli chcesz to „naprawić”, zablokuj GRUB i BIOS hasłem i najpierw ustaw dysk twardy w kolejności rozruchu. Jeśli ktoś ma fizyczny dostęp i może umieścić (nieszyfrowany) dysk twardy na innym komputerze, i tak przegrałeś
jofel

Odpowiedzi:


44

Jest to funkcja służąca do konserwacji systemu: pozwala administratorowi systemu odzyskać system z pomieszanych plików inicjujących lub zmienić zapomniane hasło.

Ten post na liście mailingowej Red Hat wyjaśnia kilka rzeczy:

W systemach uniksopodobnych init jest pierwszym uruchomionym procesem i ostatecznym przodkiem wszystkich uruchomionych procesów. Odpowiada za uruchamianie wszystkich skryptów inicjujących.

Mówisz jądro Linuksa, aby uruchamiało się / bin / bash jako init, a nie systemowy init. [...]

Zatem niczego nie wykorzystujesz, po prostu używasz standardowej funkcji jądra.

Poza tym, jak zauważono w komentarzu, rwflaga jest oddzielna od init=, po prostu mówi systemowi, aby zamontował główny system plików jako odczyt-zapis (abyś mógł np. Edytować źle skonfigurowany plik lub zmienić hasło).


2
Ponadto rwjest całkowicie oddzielny od init=. Pierwszy z nich mówi po prostu kernelowi, aby zamontował główny system plików do odczytu i zapisu.
Alexios

19

Twój system ma mechanizmy uruchamiania i debugowania (takie jak parametr init) i prawdopodobnie ma mechanizmy bezpieczeństwa, aby powstrzymać niechcianych użytkowników przed skorzystaniem z nich. To są funkcje, a nie błędy.

Program rozruchowy jest odpowiedzialny za uruchomienie systemu operacyjnego. Bezpieczeństwo systemu operacyjnego oczywiście nie ma wtedy zastosowania. Możesz po prostu załadować inne jądro, initrd, root fs lub ustawić różne opcje (np. Ścieżkę init). Jeśli chcesz powstrzymać użytkowników przed zrobieniem tego, musisz to zrobić przy bootloaderze.

Twój system (prawdopodobnie komputer PC, więc BIOS) ładuje program ładujący, a więc oczywiście zabezpieczenia programu ładującego nie mają do niego zastosowania. Jeśli chcesz powstrzymać użytkowników przed uruchomieniem systemu BIOS z USB lub podobnego, musisz to zrobić na tym poziomie.

Twój system może być gdzieś na biurku. Jeśli chcesz uniemożliwić użytkownikom otwieranie komputera przenośnego i zamianę dysku twardego na jeden z nich lub usunięcie napędu w celu zamontowania go na komputerze, musisz to zrobić na poziomie fizycznym. I to nie powstrzyma ich przed podniesieniem całego biurka i odjechaniem w ich furgonetce ...

Taki jest sposób bezpieczeństwa. Słonie na całej długości.


Ładne podsumowanie. Może chciałbym do tego dodać szyfrowanie dysku twardego, jako możliwą odpowiedź przeciwko furgonetce.
MvG,

11

Po uruchomieniu komputer uruchamia program o nazwie „init”, zwykle znajdujący się w /bin/initlub /sbin/init. Ten program jest odpowiedzialny za uruchomienie całego systemu i stworzenie użytecznego środowiska.

Podanie init=/bin/bashinformuje jądro, aby /bin/bashzamiast tego uruchomiło się (co jest powłoką). Podanie rwinformuje jądro, aby uruchomiło się z dyskiem twardym w trybie odczytu-zapisu zamiast w trybie tylko do odczytu. Tradycyjnie jądro uruchamia się z dyskiem w trybie tylko do odczytu, a później proces sprawdza integralność dysku przed przejściem do odczytu i zapisu.


6

Złożone razem z kernel.org :

KNL     Is a kernel start-up parameter.

init=   [KNL]
        Format: <full_path>
        Run specified binary instead of /sbin/init as init
        process.

rw      [KNL] Mount root device read-write on boot

1

Jest to cecha jądra: pozwala „wywołującemu”, tj. Programowi ładującemu, dużą elastyczność. Grub zapewnia ci możliwość skorzystania z tej elastyczności podczas uruchamiania, ale także umożliwia ograniczenie tego rodzaju manipulacji . Ma to szczególne znaczenie w przypadkach, w których nieautoryzowani użytkownicy mogą wziąć udział w procesie rozruchu, ale w innym przypadku odmawiają dostępu do samego dysku twardego.


1

init=może przyjąć dowolny plik wykonywalny

init=może pobierać dowolny plik wykonywalny, w tym skrypty powłoki .

Tutaj na przykład pokazuję, jak utworzyć dowolną skompilowaną minimalną kompilację C init: Jak stworzyć niestandardową dystrybucję Linuksa, która uruchamia tylko jeden program i nic więcej?

Dlaczego więc nie akceptuje /bin/bashwszystkich rzeczy, które są zwykłym plikiem wykonywalnym i mogą być przydatne? :-)

Następnie powinieneś również spróbować zrozumieć, jakie będą kompromisy ze swoim regularnym, inittakim jak systemd lub Busybox ”

Zasadniczo za pomocą raw /bin/bash:

Kontrola zadań może zostać przywrócona przy inicjalizacji Busybox i innych podobnych inicjacjach z wiodącym -w inittab:

tty3::respawn:-/bin/sh

Bardziej normalne inittabwpisy, które używają loginu i kontynuują odradzanie powłok, jeśli wykonasz Ctrl + D to:

::respawn:/sbin/getty -L ttyS0 0 vt100

które używają gettypliku wykonywalnego, ale DO ZROBIENIA: Nie byłem w stanie odrodzić ich sam bez Busybox init: getty start z linii poleceń?

Możesz użyć tego ustawienia, aby się z nim bawić i dojść do powyższych wniosków.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.