Восстановление после установки оболочки root на плохой файл

23

Допустим, я пошел и сделал глупую вещь, такую ​​как использование chsh, чтобы изменить оболочку пользователя root на неверный путь к файлу. Последующие входы в систему с учетной записью root будут внезапно завершены с ошибкой, с указанием / bin / что-либо еще не найдено, и вы вернетесь к экрану входа. За исключением режима восстановления или вставки LiveCD для редактирования / etc / passwd, каковы мои варианты возврата моей системы? Давайте также предположим (для удовольствия?), Что в колесе нет других пользователей. Мысли?

noffle
источник
Это гипотетическая ситуация, которую вы предлагаете?
Крис Даун
Я действительно сделал именно это на (относительно новой) установке FreeBSD. С тех пор он был переустановлен, поэтому я полагаю, что теперь он несколько гипотетичен, но мне любопытно, каким был бы лучший путь к восстановлению, если бы у меня действительно была полная система.
Ноффл
Был там, сделал это, получил футболку. Но в результате на каждой машине, которую я администрирую, я на всякий случай сохраняю резервную корневую учетную запись.
Марк Д

Ответы:

30

При загрузке добавьте init=/bin/bash(или путь к любой другой функциональной оболочке) к своим параметрам загрузки - вы попадете прямо в однопользовательскую оболочку. Возможно, вам придется сделать это mount -o remount,rw /перед изменением /etc/passwdзаписи в этой среде. После этого просто перезагрузите или сделайте exec /sbin/init 3. Только не печатайте exitи не нажимайте Ctrl + D, так как это приведет к панике ядра *.

В некоторых системах, загружаемых в двухэтапном режиме (с образом initrd), может потребоваться еще один вариант этого метода. Если вы заметили, что параметры загрузки содержат init=и, что наиболее важно, real_init=то место для размещения /bin/bashдолжно быть последним параметром (т.е. real_init=/bin/bash).

* Это потому, что в этой среде оболочка рассматривается ядром как программа init - единственный процесс, который знает ядро ​​- она ​​представляет работающую систему под глазом ядра. Внезапное завершение этого процесса без указания ядра на выключение системы должно привести к панике ядра. (Не паникуете ли вы, если вдруг все вокруг станет черным и тихим?)

rozcietrzewiacz
источник
Nice для exec, но я предполагаю , что это лучше не портить слишком много с заранее точки монтирования.
Стефан Гименес
2
@ Stéph Это нужно сделать, если ваше ядро ​​не монтирует root для чтения и записи. В противном случае вы не сможете изменить какие-либо файлы (в том числе /etc/passwd).
rozcietrzewiacz
Хорошая мысль! Мне удалось войти в однопользовательский режим, но меня не поразило, что мне пришлось перемонтировать / как чтение / запись для изменения / etc / passwd. Благодарность!
Ноффл
@roz Конечно, я пытался сказать, что позабочусь о том, чтобы размонтировать все остальное, возможно, было смонтировано (кроме /) перед выполнением init.
Стефан Гименес
@ Stéph Не должно быть проблем с креплениями. Обратите внимание, что /bin/bashвыполняется точно в точке, а затем /sbin/initбудет выполняться при нормальной загрузке. Таким образом, в это время система не может предпринять никаких действий.
rozcietrzewiacz
10

Вы можете использовать suи указать оболочку для выполнения (я не уверен, что если вы пытаетесь наказать, что это невозможно, если вы заметили, что других пользователей нет wheel):

su -c /bin/bash

В противном случае вы можете сделать нечто подобное, если ваш демон ssh разрешает вход в систему с правами root:

ssh root@localhost /bin/bash

Вы также можете установить оболочку как ваш init в вашем загрузчике, например, init=/bin/kshили аналогичном.

Крис Даун
источник
1
Хорошие идеи. =) Как вы и подозревали, другие пользователи не могут использовать 'su'. У sshd также отключен root-логин.
Ноффл
6

Если ваш загрузчик настроен так, чтобы разрешить оперативное редактирование параметров ядра, решение состоит в том, чтобы перезагрузить компьютер и использовать оболочку в качестве процесса инициализации, например init=/bin/bash. Затем смонтируйте все, что нужно, вручную, и отредактируйте /etc/passwd. syncи загрузитесь снова со своим обычным init.

Стефан Хименес
источник
Ничего себе, я только что заметил, что вы отправили тот же ответ в ту же минуту, что и я :-)
rozcietrzewiacz
6

Если суть вашего вопроса заключается в том, что вы заблокировали все способы стать пользователем root, то по определению вы не можете стать пользователем root.

Обычно в системе Unix разрешено три способа получения прав root:

  • Войдите в систему как пользователь root, введя rootприглашение для входа в систему и введя пароль root. Это запускает оболочку root.
  • Войдите в систему как обычный пользователь, затем войдите в систему как root, запустив suи введя пароль root. В некоторых системах это требует нахождения в определенной группе (часто называемой wheel); в других системах любой, кто знает пароль root, может стать пользователем root. Системы, использующие PAM для аутентификации, используют pam_wheelдля управления группой колес, если они есть. Если вы укажете команду с помощью su -c, она будет выполнена через оболочку root.
  • Войдите в систему как обычный пользователь, затем войдите в систему как root, запустив sudoи введя свой собственный пароль. Учетная запись пользователя должна быть наделена полномочиями sudo администратором. Если не ограничено в sudoersфайле, вы можете запустить любую команду, независимо от оболочки root.

Традиционным способом защиты от недоступности оболочки root является определение другой учетной записи с UID 0 и другой оболочки ( toorэто традиционное имя). Например, если оболочка root представляет собой динамически связанный исполняемый файл (хорошая идея для экономии памяти) и обновление библиотеки происходит неправильно, оболочка root может оказаться непригодной для использования. У альтернативной учетной записи root будет статически связанный исполняемый файл, возможно, со встроенными общими утилитами, такими как BusyBox .

Жиль "ТАК - перестань быть злым"
источник
5

Приведенные выше ответы великолепны, и я узнал, прочитав их Если вы не помните подробности этих подходов и не возражаете против перезагрузки, вы всегда можете загрузить свою систему, используя дистрибутив live CD, смонтировать раздел /, а затем отредактировать / etc / passwd и перезагрузиться. Не так элегантно, как приведенные выше решения, но легче запомнить.

Джо
источник
Вы должны указать на риски, связанные с ручным редактированием /etc/passwdфайла. Помимо этого, хороший момент - я просто хотел добавить то же предложение в мой ответ.
rozcietrzewiacz