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


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.