Чому Linux дозволяє "init = / bin / bash"?


51

Нещодавно я дізнався, що якщо я редагую GRUB перед завантаженням і додаю, rw init=/bin/bashя закінчую кореневою оболонкою.

Перебуваючи в стані, що я хочу зрозуміти все, що я хотів би знати, чому це відбувається. Я маю на увазі це помилка? це особливість? це там, щоб допомогти адміністраторам виправити речі, оскільки це працює лише за наявності фізичного доступу до комп'ютера?

Чи надає це GRUB або власне ядро?


12
Якщо ви хочете "виправити" це, заблокуйте GRUB та ваш BIOS паролем та поставте спочатку ваш жорсткий диск у порядку завантаження. Якщо хтось має фізичний доступ і може перенести (незашифрований) жорсткий диск на інший комп'ютер, ви все одно втратили
jofel

Відповіді:


44

Ця функція використовується для підтримання системи: вона дозволяє системному адміністратору відновити систему з заблокованих файлів ініціалізації або змінити забутий пароль.

Цей пост у списку розсилки Red Hat пояснює деякі речі:

У системах, схожих на Unix, init - це перший процес, який запускається, і кінцевий пращур усіх процесів, що коли-небудь запускаються. Він відповідає за виконання всіх сценаріїв init.

Ви говорите ядро ​​Linux запускати / bin / bash як init, а не систему init. [...]

Таким чином, ви нічого не використовуєте, ви просто використовуєте стандартну функцію ядра.

Крім того, як зазначено в коментарі, rwпрапор є окремим від init=, він просто повідомляє системі змонтувати кореневу файлову систему як читання-запис (так ви можете, наприклад, відредагувати неправильно налаштований файл або змінити пароль).


2
Також rwповністю відокремлений від init=. Перший просто каже ядру монтувати кореневу файлову систему читання-запису.
Алексіос

19

У вашій системі є механізми запуску та налагодження (наприклад, параметр init), і, ймовірно, є механізми захисту, щоб запобігти небажаним користувачам користуватися ними. Це функції, а не помилки.

Запуск завантажувача відповідає за запуск ОС. Безпека ОС очевидно не застосовується в цей момент. Ви можете просто завантажити інше ядро, initrd, root fs або встановити різні параметри (наприклад, init path). Якщо ви хочете перешкодити користувачам робити це, це потрібно зробити в завантажувачі.

Ваша система (можливо, ПК, так що BIOS) завантажує завантажувач і тому, очевидно, безпека завантажувача не застосовується до неї. Якщо ви хочете перешкодити користувачам робити біозавантаження з USB чи іншого, вам потрібно зробити це на цьому рівні.

Можливо, ваша система десь знаходиться на столі. Якщо ви хочете перешкодити користувачам відкривати комп’ютер і перемикати hdd на один із своїх або вилучати накопичувач, щоб встановити його на своїх машинах, вам потрібно зробити це на фізичному рівні. І це не завадить їм забрати цілий стіл і їхати в їхньому фургоні для втечі ...

Ось так і є безпека. Слони всю дорогу вниз.


Приємний підсумок. Можливо, ви хочете додати до нього шифрування hdd як можливу відповідь проти фургона.
MvG

11

Коли комп'ютер запускається, він запускає програму під назвою "init", яка зазвичай знаходиться в /bin/initабо /sbin/init. Ця програма відповідає за весь запуск системи та створення сприятливого середовища.

Вказівка init=/bin/bashвказує ядру працювати /bin/bashзамість цього (що є оболонкою). Вказівка rwповідомляє ядру завантажуватися з жорсткого диска в режимі читання-запису замість режиму лише для читання. Традиційно ядро ​​починається з диска в режимі лише для читання, а процес пізніше перевіряє цілісність диска перед переключенням на читання-запис.


6

Складено разом з 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

Це особливість ядра: воно дозволяє «його абоненту», тобто завантажувачу, отримати велику гнучкість. Grub надає вам засоби для використання цієї гнучкості під час завантаження, але також надає вам засоби для обмеження цього виду . Це має особливий сенс у тих випадках, коли сторонні користувачі можуть отримати процес завантаження, але в іншому випадку їм заборонено доступ до самого жорсткого диска.


1

init=може взяти будь-який виконуваний файл

init=може приймати будь-який виконуваний файл, включаючи сценарії оболонки .

Ось, наприклад, я демонструю, як створити довільний мінімальний компільований С init: Як створити спеціальний дистрибутив Linux, який запускає лише одну програму і більше нічого?

То чому б він не прийняв /bin/bashусіх речей, що є звичайним виконуваним файлом і може бути корисним? :-)

Далі вам слід також спробувати зрозуміти, які будуть компроміси з вашими звичайними, initтакими як systemd або Busybox '.

В основному, із сирим /bin/bash, ви:

Контроль за роботою можна відновити на init Busybox та інших подібних inits з провідним -в inittab:

tty3::respawn:-/bin/sh

Більш нормальні inittabзаписи, які використовують логін та зберігають нерестові оболонки, якщо ви робите Ctrl + D, це:

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

які використовують gettyвиконуваний файл, але TODO: Я не зміг сам нерестувати їх без Busybox init: getty запускати з командного рядка?

Ви можете використовувати цю програму, щоб пограти з нею і дійти до вищенаведених висновків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.