Wiederherstellung vom Setzen der root-Shell auf eine fehlerhafte Datei

23

Angenommen, ich habe etwas Dummes getan, beispielsweise 'chsh', um die Shell des Root-Benutzers in einen ungültigen Dateipfad zu ändern. Zukünftige Anmeldungen beim Root-Konto schlagen abrupt fehl, wenn / bin / was auch immer nicht gefunden wird, und Sie kehren zum Anmeldebildschirm zurück. Welche Möglichkeiten habe ich, um mein System zurückzugewinnen, wenn ich einen Wiederherstellungsmodus verweigere oder eine Live-CD zum Bearbeiten von / etc / passwd einlege? Nehmen wir auch (zum Spaß?) An, dass sich keine anderen Benutzer im Rad befinden. Gedanken?

Noffle
quelle
Ist dies eine hypothetische Situation, die Sie vorschlagen?
Chris Down
Ich hatte in der Tat genau das auf einer (relativ frischen) FreeBSD-Installation gemacht. Es wurde seitdem neu installiert, also ist es vermutlich etwas hypothetisch, aber ich bin gespannt, was der beste Weg zur Wiederherstellung gewesen wäre, wenn tatsächlich ein vollständiges System vorhanden gewesen wäre.
Noffle
War dort, hab das gemacht, hab das T-Shirt bekommen. Infolgedessen verwalte ich auf jedem Computer, den ich verwalte, für alle Fälle ein Backup-Root-Konto.
Mark D

Antworten:

30

Hängen Sie beim Booten init=/bin/bash(oder einen Pfad zu einer anderen funktionalen Shell) an Ihre Boot-Optionen an - Sie werden direkt zu einer einzelnen Benutzer-Shell weitergeleitet. Möglicherweise müssen Sie dies tun, mount -o remount,rw /bevor Sie den /etc/passwdEintrag in dieser Umgebung ändern können. Danach einfach neu starten oder ausführen exec /sbin/init 3. Nur nicht nicht geben exitoder drücken Sie Strg + D, da diese in der Kernel - Panik * führen würde.

Bei einigen Systemen, die im zweistufigen Modus geladen sind (mit einem initrd-Image), ist möglicherweise eine zusätzliche Variante dieser Methode erforderlich. Wenn Sie , dass die Boot - Optionen bemerken enthalten init=und, was am wichtigsten ist , real_init=und dann die Stelle zu setzen /bin/bashsollte dieser Parameter (dh real_init=/bin/bash).

* Dies liegt daran, dass in dieser Umgebung die Shell vom Kernel als das Init-Programm angesehen wird - das ist der einzige Prozess, den der Kernel kennt - und ein laufendes System darstellt, das sich unter dem Auge des Kernels befindet. Das plötzliche Beenden dieses Prozesses, ohne dass der Kernel angewiesen wird, das System herunterzufahren, muss zu einer Kernel-Panik führen. (Würdest du nicht in Panik geraten, wenn plötzlich alles um dich herum schwarz und still würde?)

rozcietrzewiacz
quelle
Schön für die exec, aber ich denke, es ist besser, vorher nicht zu viel mit Mount-Punkten zu verwechseln.
Stéphane Gimenez
2
@ Stéph Sie haben zu tun , dass , wenn Ihr Kernel read-write nicht root montieren. Andernfalls können Sie keine Dateien (einschließlich /etc/passwd) ändern .
rozcietrzewiacz
Guter Einfall! Ich hatte es geschafft, in den Einzelbenutzermodus zu gelangen, aber es traf mich nicht, dass ich / als Lese- / Schreibzugriff erneut einhängen musste, um / etc / passwd zu ändern. Vielen Dank!
Noffle
@roz Sicher, ich habe versucht zu sagen, dass ich mich darum kümmern würde, dass alles andere (außer /) gemountet wird, bevor init ausgeführt wird.
Stéphane Gimenez
@Steph Es sollte keine Probleme mit Reittieren geben. Beachten Sie, dass /bin/bashes genau zu dem Zeitpunkt /sbin/initausgeführt wird, an dem es beim normalen Start ausgeführt wird. Daher kann das System zu diesem Zeitpunkt keine möglichen Aktionen ausführen.
Rozcietrzewiacz
10

Sie können sueine Shell verwenden und angeben, die ausgeführt werden soll (ich bin mir nicht sicher, ob dies mit Ihrer Notiz, dass sich keine anderen Benutzer in der Shell befinden, nicht möglich ist wheel):

su -c /bin/bash

Andernfalls könnten Sie etwas Ähnliches tun, wenn Ihr ssh-Daemon die Anmeldung als root zulässt:

ssh root@localhost /bin/bash

Sie können beispielsweise auch eine Shell als Init in Ihrem Bootloader init=/bin/kshoder Ähnliches festlegen .

Chris Down
quelle
1
Gute Ideen. =) Wie Sie vermutet haben, können keine anderen Benutzer 'su' verwenden. Bei sshd ist auch die Root-Anmeldung deaktiviert.
Noffle
6

Wenn Ihr Bootloader so konfiguriert ist, dass die Kernelparameter live bearbeitet werden können, können Sie einen Neustart durchführen und eine Shell als Initialisierungsprozess verwenden, z init=/bin/bash. Montieren Sie dann alles, was von Hand montiert werden muss, und bearbeiten Sie es /etc/passwd. syncund wieder mit dem üblichen booten init.

Stéphane Gimenez
quelle
Wow, ich habe gerade bemerkt, dass du die gleiche Antwort in der gleichen Minute wie ich gepostet hast :-)
rozcietrzewiacz
6

Wenn der Kern Ihrer Frage darin besteht, dass Sie alle Wege ausgesperrt haben, um root zu werden, können Sie per Definition nicht root werden.

Es ist üblich, drei Möglichkeiten zuzulassen, um auf einem Unix-System root zu werden:

  • Melden Sie sich als root an, indem Sie rootan einer Anmeldeaufforderung das root-Kennwort eingeben. Dadurch wird die root-Shell ausgeführt.
  • Melden Sie sich als normaler Benutzer an und werden Sie root, suindem Sie das root-Passwort ausführen und eingeben. Auf einigen Systemen muss man sich in einer bestimmten Gruppe befinden (oft genannt wheel). Auf anderen Systemen kann jeder, der das root-Passwort kennt, root werden. Systeme, die PAM zur Authentifizierung verwenden pam_wheel, verwalten die Radgruppe, falls vorhanden. Wenn Sie einen Befehl mit angeben su -c, wird dieser über die root-Shell ausgeführt.
  • Melden Sie sich als normaler Benutzer an sudound melden Sie sich als root an, indem Sie Ihr eigenes Passwort eingeben. Dem Benutzerkonto müssen von einem Administrator Sudo-Berechtigungen erteilt worden sein. Sofern in der sudoersDatei keine Einschränkungen bestehen , können Sie jeden Befehl ausführen, unabhängig von der Shell von root.

Ein traditioneller Weg, um zu verhindern, dass die Root-Shell nicht verfügbar ist, besteht darin, ein anderes Konto mit der UID 0 und einer anderen Shell ( toorein traditioneller Name) zu definieren. Wenn beispielsweise die Shell von root eine dynamisch verknüpfte ausführbare Datei ist (eine gute Idee, um Speicherplatz zu sparen) und ein Bibliotheks-Upgrade fehlschlägt, ist die Shell von root möglicherweise unbrauchbar. Das alternative Root-Konto verfügt über eine statisch verknüpfte ausführbare Datei, möglicherweise mit integrierten Dienstprogrammen wie BusyBox .

Gilles 'SO - hör auf böse zu sein'
quelle
5

Die obigen Antworten sind großartig und ich habe durch das Lesen gelernt. Wenn Sie sich nicht an die Details dieser Ansätze erinnern und einen Neustart nicht stören, können Sie Ihr System immer mit einer Live-CD-Distribution starten, die / -Partition mounten und dann / etc / passwd bearbeiten und neu starten. Nicht so elegant wie die obigen Lösungen, aber leichter zu merken.

Joe
quelle
Sie sollten auf die Risiken hinweisen, die mit der manuellen Bearbeitung der /etc/passwdDatei verbunden sind. Abgesehen davon, guter Punkt - ich wollte meiner Antwort nur den gleichen Vorschlag hinzufügen.
Rozcietrzewiacz