Відновлення з встановлення оболонки кореня на поганий файл


23

Скажімо, я пішов і зробив безглузді речі, такі як використання 'chsh' для зміни оболонки кореневого користувача на поганий шлях до файлу. Майбутні входи до кореневого облікового запису різко завершаться, посилаючись на / bin / те, що не знайдено, і завантажують вас назад на екран входу. Заборонити режим відновлення або вставити LiveCD для редагування / etc / passwd, які мої варіанти повернення моєї системи? Припустимо також (для розваги?), Що немає інших користувачів за кермом. Думки?


Це гіпотетична ситуація, яку ви пропонуєте?
Кріс Даун

Я дійсно зробив саме це під час (відносно свіжої) установки FreeBSD. З тих пір він був перевстановлений, тому я вважаю, що це дещо гіпотетично, але мені цікаво, яким був би найкращий шлях до відновлення, якби я справді мав повну систему.
noffle

Побував там, зробив це, отримав футболку. Але в результаті на кожній машині, яку я адмініструю, я веду резервний кореневий обліковий запис, про всяк випадок.
Марк D

Відповіді:


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 - що є єдиним процесом, який ядро ​​знає - воно являє собою запущену систему під оком ядра. Раптово закінчивши цей процес, не кажучи ядру вимикати систему, повинно виникнути паніка ядра. (Ви б не панікували, якби раптом усе навколо вас стало чорним і тихим?)


Приємно для exec, але я думаю, що краще заздалегідь не зіпсуватись із точками кріплення.
Стефан Гіменез

2
@ Stéph Ви повинні це зробити, якщо ваше ядро ​​не змонтує root читання-запис. Інакше ви не зможете змінювати жодні файли (в тому числі /etc/passwd).
rozcietrzewiacz

Гарне мислення! Мені вдалося перейти в однокористувацький режим, але мене це не вразило, що мені довелося переробляти / як читати / писати, щоб змінити / etc / passwd. Спасибі!
noffle

@roz Звичайно, я намагався сказати, що я б подбав про відключення всього іншого, що могло бути встановлене (крім /), перш ніж виконувати init.
Стефан Гіменез

@ Stéph Не повинно бути проблем із кріпленнями. Зауважте, що /bin/bashвін запускається саме в точці, а потім /sbin/initвиконується при звичайному завантаженні. Тож система не може здійснити жодних можливих дій на той час.
rozcietrzewiacz

10

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

su -c /bin/bash

В іншому випадку ви можете зробити щось подібне, якщо ваш ssh демон дозволяє входу в корінь:

ssh root@localhost /bin/bash

Ви також можете встановити оболонку як ваш init у завантажувачі, наприклад, init=/bin/kshтощо.


1
Гарні ідеї. =) Як ви підозрювали, жоден інший користувач не може використовувати "su". У sshd також вимкнено вхід у систему.
noffle

6

Якщо ваш завантажувач налаштований так, щоб дозволяти редагувати параметри ядра в реальному часі, рішенням є перезавантаження та використання оболонки як ініціативного процесу, наприклад init=/bin/bash. Потім встановіть все, що потрібно встановити вручну, і відредагуйте /etc/passwd. syncі знову завантажтеся зі своїм звичним init.


Вау, я щойно помітив, що ви опублікували ту саму хвилину, що й я :-)
rozcietrzewiacz

6

Якщо суть вашого питання полягає в тому, що ви заблокували всі способи стати корінним, то за визначенням ви не можете стати корінним.

Загальнодоступним є можливість дозволити три способи укорінення в unix-системі:

  • Увійдіть як корінь, ввівши rootпідказку для входу та ввівши пароль кореня. Це запускає оболонку кореня.
  • Увійдіть як звичайний користувач, а потім станьте root, запустивши suта ввівши пароль root. Для деяких систем це вимагає перебування у певній групі (часто її називають wheel); в інших системах кожен, хто знає пароль root, може стати root. Системи, що використовують PAM для аутентифікації, використовують pam_wheelдля управління колесною групою, якщо вони є. Якщо ви вказали команду з su -c, вона виконується через оболонку кореня.
  • Увійдіть як звичайний користувач, а потім станьте root, запустивши sudoта ввівши власний пароль. Обліковий запис користувача повинен був наділений правами sudo адміністратором. Якщо sudoersфайл не обмежений , ви можете запустити будь-яку команду, незалежно від оболонки кореня.

Традиційний спосіб захисту від недоступності оболонки кореня - це визначення іншого облікового запису з UID 0 та іншою оболонкою ( toorце традиційна назва). Наприклад, якщо оболонка кореня є динамічно пов'язаним виконуваним файлом (хороша ідея для збереження пам'яті) і оновлення бібліотеки піде не так, оболонка кореня може бути непридатною. Замінний кореневий обліковий запис матиме статично пов'язаний виконуваний файл, можливо, з вбудованими загальними утилітами, такими як BusyBox .


5

Наведені вище відповіді чудові, і я навчився їх читати. Якщо ви не пам’ятаєте подробиці цих підходів і не заперечуєте про перезавантаження, ви завжди можете завантажувати систему за допомогою дистрибутива компакт-диска, встановити / розділ, а потім редагувати / etc / passwd та перезавантажувати. Не настільки елегантні, як наведені вище рішення, але простіше запам’ятати.


Вам слід вказати на ризики, пов’язані з редагуванням /etc/passwdфайлу вручну . Крім цього, хороший момент - я просто хотів додати ту саму пропозицію до своєї відповіді.
rozcietrzewiacz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.