Wie deaktiviere ich unheimliche Terminalbefehle?

82

Wie deaktiviere ich unheimliche Terminalbefehle?

Ich benutzte SSH, um auf einen entfernten Ubuntu-Server zuzugreifen, ohne auf den physischen Server zuzugreifen. Ich dachte, ich tippe ' shutdown' in den NoSQL-Server, der auf dem Ubuntu-Betriebssystem läuft, aber eigentlich habe ich den Ubuntu-Server angewiesen, herunterzufahren. Dann musste ich dem Serveradministrator mitteilen, was ich getan habe, damit er den physischen Server für mich starten konnte. Das war peinlich

Wie kann ich das verhindern?

MelodiousFires
quelle
100
Dies wurde ausführlich erörtert, wobei in der Regel das Verhältnis rmschlimmer ist als das der Nebenwirkungen shutdown. Fazit: Wenn Sie weiterhin zufällige Befehle als root ausführen, können Sie auf keinen Fall verhindern, dass etwas Schlimmes passiert.
Dmitry Grigoryev
5
Wie andere Leute in Bezug auf Aliasing angemerkt haben, kann dies dazu führen, dass sich die Leute "daran gewöhnen, dass ein Befehl auf eine nicht standardisierte Art und Weise arbeitet". Scheint es jemand anderem schlecht, dass der alberne NoSQL-Server diesen Befehl verwendet?
bmb
Der von mir verwendete NoSQL-Server ist Redis.
MelodiousFires
60
Arbeite einfach nicht unter dem Root-Account.
alk
12
Ich wage zu behaupten, Sie haben die Lektion gelernt, müssen also keinen Befehl mehr deaktivieren. Ich möchte auch hinzufügen, dass Sie kein dummes GNU / Linux sind, sondern nur besser als der Dummkopf.

Antworten:

204

Die Standardantwort lautet "Nicht als root anmelden". Alle Befehle, die als root ausgeführt werden, sind beängstigend. Wenn dies keine Option ist, können Sie einige Alias-Befehle hinzufügen .bashrc, um Befehle zu deaktivieren, die Ihnen besonders unheimlich erscheinen. Zum Beispiel:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

Wenn Sie dann shutdown eingeben, wird die folgende Meldung angezeigt:

If you really want to do that, type: /sbin/shutdown

( Stellen Sie sicher, dass Ihr .bashrcComputer zuerst geladen wurde, bevor Sie dies auf einem Produktionsserver versuchen. )

Beenden Sie Ihre aktuelle sshSitzung und . ~/.bashrcmelden Sie sich erneut an oder verwenden Sie sollte .bashrc laden / ausführen. Versuchen Sie möglicherweise, rmohne Argumente auszuführen, um sicherzustellen, dass Ihr Server das automatische Laden .bashrcvon Anmeldungen oder Ähnlichem nicht deaktiviert hat .

Beachten Sie, dass Sie, wenn Sie hauptsächlich mit dem Anhalten und Herunterfahren befasst sind, die Installation von molly-guard in Betracht ziehen könnten , wodurch Sie den Hostnamen eingeben müssen, bevor Sie den Computer herunterfahren. Dies ist nützlicher, wenn Sie regelmäßig ganze Betriebssysteme über die Befehlszeile herunterfahren, aber sicherstellen möchten, dass Sie das richtige herunterfahren.

Sie können dies auch mit einem weniger beängstigenden Befehl wie Abmelden oder Beenden testen.

gmatht
quelle
70
Melden Sie sich nicht als root an : Dies hilft nicht, wenn Sie den Computer, auf dem Sie angemeldet sind, verwirren. Ich würde vorschlagen , die Eingabeaufforderung in etwas zu ändern , das Ihnen einen visuellen Hinweis gibt.
Isanae
145
Das Aliasing von "beängstigenden" Befehlen für ein "sicheres" Verhalten ist nach meiner Erfahrung eine schlechte Idee. Dies liegt daran, dass die Leute sich an die Gewohnheit gewöhnen, Befehle auf eine nicht standardmäßige Art und Weise auszuführen, die sie dazu bringen kann, einige sehr bedauerliche Dinge zu tun, wenn sie sich in einem Vanille-System befinden. Eine einfache Antwort ist, sehr vorsichtig zu handeln, wenn Sie als root angemeldet sind.
TimGJ
22
@isanae Die Verknüpfung, die ich zum Öffnen eines Terminals mit ssh zum Produktionsserver verwendet habe, ließ den Hintergrund des Terminals rot leuchten. Das hat mich aufmerksam gemacht.
Peter A. Schneider
6
sourceist ein Alias ​​für .und wird nicht von allen Shells unterstützt.
Gronostaj
4
Beachten Sie auch , dass , während Debian und durch die Erweiterung, Ubuntu die defaullt hat ~/.bash_profileQuelle .bashrc, das ist nicht das Standardverhalten ist und auf den meisten Systemen .bashrcnicht lesen , wenn via ssh anmelden, so dass dies keinen Unterschied machen. Es ist weitaus besser, die Aliase zu ~/.profileoder ~/.bash_profilestattdessen hinzuzufügen .
Terdon
73

sudoexistiert aus einem Grund - benutze es. Wenn Ihr Befehl (in diesem Fall eine interaktive CLI) beendet ist, kehren Sie zu Ihrer Shell auf Benutzerebene zurück, nicht zu einer Root-Shell. Es gibt nur sehr wenige Gründe, sich in einer Root-Shell zu befinden. (Ich bin überrascht, dass dies nicht bereits eine Antwort ist ...)

Having said that, nicht ein Muppet sein , die verwendet sudofür alles . Verstehen Sie, was Sie tun, und verstehen Sie, warum Root-Rechte erforderlich sind.


Zusätzlich können Sie Ihre Eingabeaufforderung für Root- / User-Shells differenzieren. Dies macht es auch offensichtlicher, dass Sie wieder an der Shell-Eingabeaufforderung und nicht an einer " anderen CLI " sind. Meins ist sehr farbenfroh und enthält viele nützliche Informationen (z. B. den Hostnamen). Dadurch ist es sehr einfach zu ermitteln, auf welchem ​​Host der Befehl ausgeführt wird, und es ist einfacher, in Ihrem Verlauf nach Eingabeaufforderungen zu suchen - einem Stammverzeichnis Shell verwendet die Standardeingabeaufforderung.

Meine PS1

Dies ist besser für " Ihr " Konto geeignet , aber wenn Sie Sicherheit / Systemadministration ernst nehmen, werden Sie keine Kennwörter / Konten freigeben und nicht in einer Root-Shell sitzen, ohne sich dessen voll bewusst zu sein.


Wie die Leute immer und immer wieder sagten, " Aliasing-Befehle zur Schaffung einer sicheren Umgebung sind eine schlechte Idee ". Sie werden es sich in Ihrer sicheren Umgebung gemütlich machen, indem Sie diese 'beängstigenden' Befehle eingeben, wo Sie es nicht sollten. Dann werden Sie eines Tages den Job wechseln oder sich auf einer neuen Maschine anmelden und dann " whoopsy, ich wollte nicht, es tut mir leid " boomen ...

Attie
quelle
2
Hätte er nicht das gleiche Problem sudo shutdown? Wenn er es auf dem falschen Computer ausführt, wird es immer noch eine Katastrophe sein.
Barmar
2
@Barmar Versteht NoSQL den Befehl sudo?
Taemyr
2
@Taemyr sudoist ein Shell-Befehl, der nichts mit der Datenbank zu tun hat.
Barmar
4
@Barmar: Eigentlich wollte das OP es in ein NoSQL-cmdline-Programm schreiben, nicht in Bash. Sie hätten also nicht getippt sudo shutdown, da ich davon ausgehe , dass sudoes sich nicht um einen NoSQL-Befehl handelt. Nicht in einer Root-Shell zu sein, hätte dieses Problem völlig gelöst und wäre eine sehr gute Idee gewesen. Also würde man sich die Eingabeaufforderung genau ansehen, bevor man wichtige Befehle ausführt.
Peter Cordes
44

Das Paket 'molly-guard' (zumindest auf von Debian abgeleiteten Systemen) installiert einen Wrapper zum Herunterfahren, Anhalten, Ausschalten und Neustarten. Wenn festgestellt wird, dass es sich um ein entferntes Terminal handelt, wird der Name des Hosts abgefragt. Wenn es nicht übereinstimmt, wird der Befehl abgebrochen.

CSM
quelle
4
Was ist mit anderen (wohl beängstigenderen) Dingen wie rm -rf /?
Marcellothearcane
9
@marcellothearcane set -ukönnte in einigen Fällen dabei helfen, beispielsweise beim Schreiben rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Alex Hall
4
@marcellothearcane Bei allem, was einem modernen Linux-System ähnelt, ist --no-preserve-rootes unwahrscheinlich , dass Sie es versehentlich eingeben .
ein
3
Wer ist Molly, ich frage mich ... wahrscheinlich jemandes Katze.
the0ther
7
@ the0ther, ein 2 Jahre altes Kind, das zweimal am selben Tag den SCRAM-Schalter an einer Dinosaurier-Maschine auslöste. Die Leute im Raum haben eine Abdeckung am Schalter angebracht. catb.org/jargon/html/M/molly-guard.html
CSM
4

Ich habe eine Antwort akzeptiert, die ich sehr mag. Wenn jedoch jemand anderes liest und eine einfachere Antwort möchte, ist dies meine.

Suchen Sie die .bashrc-Datei und fügen Sie sie als letzte Zeile ein:

alias shutdown=notforuse

Wenn Sie dann shutdown eingeben, erhalten Sie so etwas wie ~bash: notforuse is not a command

Das mag albern sein, ist aber einfach und funktioniert. Ich freue mich jedoch über Antworten mit besseren Möglichkeiten!

MelodiousFires
quelle
4
Hm, ich habe das immer gemacht, um rmLeute zu trollen -alias rm='echo "You can't use rm!" #'
MD XF
52
Ich halte das aus drei Gründen für eine schlechte Idee. Erstens ist es verwirrend für alle anderen, die Root-Zugriff auf die Maschine haben. Zweitens werden Sie darauf hingewiesen, dass es in Ordnung ist, "shutdown" einzugeben und die Eingabetaste zu drücken. Dies bedeutet, dass Sie wahrscheinlich den gleichen Fehler auf dem nächsten System machen, auf das Sie root-Zugriff haben. Drittens wird dies äußerst verwirrend, wenn jemals ein gültiger Befehl notforuseauf dem Pfad aufgerufen wird.
David Richerby
5
Ich bin mit @DavidRicherby in diesem Fall. Keine gute Idee.
Tico
Wenn Sie die Aliase wirklich verwenden möchten, können Sie zumindest alle diese Aliasnamen für erschreckende Befehle in eine Datei einfügen. Sagen wir, ~/.SaveMyReputationund fügen Sie als letzte Zeile Ihrer .bashrca-Zeile hinzu [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Möglicherweise möchten Sie eventuell eine zusätzliche Zeile echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"in diese Datei einfügen. Zumindest können Sie diese Alias-Datei auf einem anderen Computer mitbringen (dies sollte der Fall sein .bash_aliases, aber in diesem "veralteten" Fall ist es besser, einen anderen Namen zu verwenden).
Hastur
Wenn Sie dies tun, machen Sie es weniger verwirrend, indem Sie einen Namen wie verwenden alias shutdown=shutdown-disabled-by-an-alias. (Hiermit wird nur das dritte und geringfügigste Problem behoben, auf das @DavidRicherby hingewiesen hat.) Obwohl es wahrscheinlich nur 2 Sekunden dauern wird, bis die nächste Person vom Anzeigen notforuse is not a commandzum Ausführen type -a shutdownund Finden des Alias übergeht und dann die Aliaserweiterung sudo \shutdowndeaktiviert. (Vorausgesetzt, sie hatten eine sudoAlias-Beziehung, sudo='sudo 'so dass es Aliase in seinem ersten Argument erweitert).
Peter Cordes
1

Für shutdown( reboot, haltund damit verbundene): Ich habe eine Kopie mit mich fragen , ob ich wirklich sicher bin (und es tut nichts sowieso). Ich speichere solche Skripte in /usr/local/sbin. Unter Debian hat dies die Priorität other /sbin(es ist das erste Verzeichnis von PATH).

Systemskripte verwenden den vollständigen Pfad, so dass ein solcher Hack mich daran hindert, einen Remote-Server anstelle eines lokalen Computers anzuhalten (ein schlechtes Verhalten von Awesome WM), aber keine anderen indirekten Auswirkungen hat und ich sie weiterhin als / sbin / shutdown verwenden kann, wenn sie wirklich benötigt werden .

Giacomo Catenazzi
quelle
Eine solche Hacks funktionieren nur, wenn man sie auf jedem Computer anwenden jemals in du eingeloggt sein ... das oft ziemlich unpraktisch ist, und Sie werden herausfinden, nicht bis es zu spät ist: durch die Eingabe shutdownauf einem kritischen System , das sich nicht haben Ihre Hack.
Jpaugh
@jpaugh: Ja, es ist ein Hack, und ich verwende ihn nur für meine persönlichen Server, auf denen ich mich oft angemeldet habe und die Terminals zu lange offen bleiben. [Hinweis: Ich verwende auch verschiedene Farbaufforderungen für meine persönlichen Computer: Remote-Root, Remote-Benutzer, Local-Root, Local-Benutzer]. Bei echten Servern und Remotecomputern vermeide ich root und gehe so wenig wie möglich zu root, ohne zu vergessen, sie zu verlassen. Ich benutze nur meine Fernbedienungen als "Cloud" (vor dem Cloud-Hype, also auf die alte Art und Weise gehandhabt).
Giacomo Catenazzi
1

Die Sudoers-Datei ermöglicht eine viel feinere Granularität, als nur * 'sudo' * verwenden darf. Insbesondere können Sie Befehls-Aliase verwenden, um weiße Listen von Befehlsgruppen zu erstellen, auf die ein bestimmter Benutzer oder eine bestimmte Gruppe beschränkt ist. Ich habe mit Remote-Servern gearbeitet, die auf SSH-Zugriff beschränkt waren und passwortloses Sudo zuließen (wir benötigten passwortgeschützte SSH-Schlüssel). Es gibt einige gute Gründe dafür, aber es birgt Gefahren. Daher haben wir Befehls-Aliase verwendet, um uneingeschränkten Zugriff auf die zu erledigenden Aufgaben (Neustarten von Servern usw.) zu ermöglichen, ohne ihnen Berechtigungen für Dinge zu gewähren, die sie nicht getan haben.

Es gibt auch eine Syntax, die besagt , dass dieser Befehl nicht ausgeführt werden kann . Es kann umgangen werden, sollte also nicht als echte Sicherheitsmaßnahme verwendet werden, sondern würde für das von Ihnen beschriebene Szenario funktionieren.

Man Sudoers hat einige gute Beispiele, wie man das alles einrichtet.

Natürlich erfordert dies die Verwendung von sudo, aber das sollte selbstverständlich sein.

Tallus
quelle
1

Möglicherweise sind Sie Opfer einer neuen Dummheit von Ubuntu geworden.

Ubuntu hatte früher den normalen, klassischen shutdownBefehl, der ein obligatorisches Zeitargument benötigt.

Folgendes passiert unter Ubuntu 12, wenn ich schreibe shutdown, auch als normaler Benutzer:

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

Dann

$ shutdown +100
shutdown: need to be root.

Jetzt ist hier Ubuntu 16.10. Ich bin nicht root:

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

Ohne Argumente wird 60 Sekunden später ein Herunterfahren geplant, und selbst wenn Sie nicht als Root angemeldet sind - nur ein Konto, das mit Administratorrechten erstellt wurde.

Canonical die Schuld geben.

Kaz
quelle
6
/sbin/shutdown wirdsystemd-sysv standardmäßig als Paket bereitgestellt , es ist also keine Ubuntu-Dummheit, es ist eine systemdDummheit, und es kommt nicht von Ubuntu, sondern zumindest von Debian, was wiederum die ganze systemdBewegung von Red Hat zu übernehmen scheint . Wenn Sie beschuldigen, beschuldigen Sie die richtige Entität - nicht nur die, die Sie nicht mögen.
Ruslan
1
@ Ruslan Niemand, der diesen Mist in seine Distribution packt, entgeht der Schuld der Dummheit.
Kaz
0

Zum Herunterfahren gibt es Molly-Guard. Sie müssen es nur installieren und wenn Sie versuchen, über ssh herunterzufahren, werden Sie aufgefordert, den Hostnamen einzugeben.

Zum Löschen von Dateien gibt es Lösungen wie libtrash, die einen Papierkorb über eine LD_PRELOADBibliothek emulieren .

Und Sie können mit dem Programm maybe testen, welche Dateien Sie ändern / löschen / .... Das ist ziemlich cool, wenn man etwas testet.

allo
quelle
1
Diese maybeSache scheint vom Design her kaputt zu sein: Das Stoppen einiger Syscalls mit No-Ops wird jedes nicht-triviale Programm zum Absturz bringen, das auf diese Syscalls angewiesen ist, um erfolgreich zu sein.
Dmitry Grigoryev
-2

Versuchen Sie Folgendes: Wenn Sie sich auf einer Remote-Shell befinden, halten Sie jedes Mal, wenn Sie die "Return" -Taste eingeben, 5 Sekunden lang an, während Sie mit dem Finger auf die "Return" -Taste zeigen, und lesen Sie den Befehl, den Sie senden möchten, erneut. Ist es o.k? Bist du sicher?

Dies scheint hart zu sein, aber andererseits sollten wir nicht viel Zeit für Remote-Shells aufwenden. Wir sollten alle Möglichkeiten finden, um unsere Wartungsarbeiten so zu automatisieren, dass wir uns selten oder nie bei einem Remote-Server anmelden müssen.

xpmatteo
quelle
Versuchte das, nicht funktioniert. Ich trat ein shutdown, hielt für 5 Sekunden an, las den Befehl erneut (laut!) Und ich bin sicher, dass er korrekt war. Drücken Sie dann die Eingabetaste und der Befehl wird gerade ausgeführt. Ich fürchte, das hat die furchterregenden Befehle nicht deaktiviert. Ich werde mit diesem Finger schweben versuchen, vielleicht war der Abstand zu klein / groß.
wojciech_rak