Почему Linux разрешает init = / bin / bash?


51

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

Находясь в состоянии, когда я хочу понять все, я хотел бы знать, почему это происходит. Я имею в виду, это ошибка? это особенность? это поможет администраторам исправить положение вещей, поскольку оно работает только при наличии физического доступа к компьютеру?

Это предусмотрено GRUB или реальным ядром?


12
Если вы хотите «исправить» это, заблокируйте GRUB и ваш BIOS с помощью пароля и поместите ваш жесткий диск первым в порядке загрузки. Если кто-то другой имеет физический доступ и может вставить (не зашифрованный) жесткий диск в другой компьютер, вы все равно проиграли
jofel

Ответы:


44

Это функция, которая используется для обслуживания системы: она позволяет сисадмину восстанавливать систему из испорченных файлов инициализации или менять забытый пароль.

Этот пост в списке рассылки Red Hat объясняет некоторые вещи:

В Unix-подобных системах init - это первый запущенный процесс, и он является предком всех когда-либо запущенных процессов. Он отвечает за запуск всех сценариев инициализации.

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

Таким образом, вы ничего не используете, вы просто используете стандартную функцию ядра.

Кроме того, как отмечено в комментарии, этот rwфлаг отделен от него init=, он просто указывает системе монтировать корневую файловую систему в режиме «чтение-запись» (например, вы можете отредактировать неверно сконфигурированный файл или изменить пароль).


2
Кроме того, rwполностью отделен от init=. Первый просто говорит ядру смонтировать корневую файловую систему для чтения-записи.
Алексиос

19

Ваша система имеет механизмы для запуска и отладки (например, параметр init) и, вероятно, имеет механизмы безопасности, которые не позволяют нежелательным пользователям воспользоваться ими. Это особенности, а не ошибки.

Загрузчик отвечает за запуск ОС. Безопасность ОС явно не применяется в этот момент. Вы можете просто загрузить другое ядро, initrd, root fs или установить другие параметры (например, путь инициализации). Если вы хотите, чтобы пользователи не делали этого, это должно быть сделано в загрузчике.

Ваша система (вероятно, ПК, поэтому BIOS) загружает загрузчик, и, очевидно, безопасность загрузчика не распространяется на него. Если вы хотите помешать пользователям загружать биос с USB или тому подобное, вам нужно сделать это на этом уровне.

Ваша система может быть где-то на столе. Если вы хотите, чтобы пользователи не открывали компьютер и не переключали жесткий диск на свой собственный или не извлекали диск для установки его на своих машинах, вам нужно сделать это на физическом уровне. И это не помешает им взять весь стол и уехать на своем фургоне ...

Такова безопасность. Слоны все время вниз.


Хорошее резюме. Возможно, стоит добавить шифрование жесткого диска к этому, как возможный ответ против фургона.
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, вы:

Управление заданиями может быть восстановлено в Busybox 'init и других подобных устройствах с лидирующим -в inittab:

tty3::respawn:-/bin/sh

Более обычные inittabзаписи, которые используют логин и продолжают порождать оболочки при нажатии Ctrl + D:

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

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

Вы можете использовать эту настройку, чтобы поэкспериментировать с ней и прийти к вышеуказанным выводам.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.