Warum ist es riskant, sudo vim für normale Benutzer zugänglich zu machen?

30

Ich möchte einen neuen Benutzer erstellen und ihm sudo-Zugriff gewähren. Um genau zu sein, möchte ich, dass er sudo vimhttpd.conf verwendet und bearbeitet. Ich habe das in sudoers geschrieben:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Ich habe jedoch gehört, dass dies riskant sein könnte. Warum ist das problematisch? Wie ernst ist das Problem?

mi0pu
quelle
16
Zum einen gewährt Ihr Befehl dem Benutzer Lese- und Schreibzugriff auf alle Dateien auf dem Computer. Einmal drin vim, kann der Benutzer jede beliebige Datei öffnen und in diese schreiben.
John1024
4
Nebenbei können Sie eine neue Gruppe erstellen, um jeden Benutzer hinzuzufügen, auf den Zugriff erforderlich ist /etc/httpd/confs/httpd.conf. Verwenden Sie dann chgrp [OPTION] GROUPNAME FILE, um die Gruppeneigentümerschaft von zu ändern /etc/httpd/confs/httpd.conf. So etwas wie groupadd vimportantdas Erstellen einer neuen Gruppe und chgrp -v vimportant /etc/httpd/confs/httpd.confdas Ändern der Gruppeneigentümerschaft. yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin
4
Beachten Sie, dass sudo aufgrund all der in den Antworten genannten Probleme die Möglichkeit bietet, Benutzern das Bearbeiten von Dateien mit einem Editor zu ermöglichen, der mit ihren eigenen Berechtigungen ausgeführt wird. Suchen Sie in der sudoersManpage nach "Sichere Bearbeitung" .
Michał Politowski
2
(Ich bin mir nicht sicher, ob das, was ich sage, richtig ist.) Da Sie sudovim Zugriff gewähren , kann der Benutzer vim als root verwenden. In Vim können Sie UNIX - Befehle (run Wie laufen Unix - Befehle aus Vim? ) So ein Benutzer zu tun , wäre in der Lage , was wie useradd <myuser>, rm -rf /oder viele andere Dinge.
Fedorqui
6
Dies ist eine falsche Frage. Wenn Sie in Erwägung ziehen, erhöhte Rechte jeglicher Art zu gewähren, möchten Sie nicht denken: "Ich werde dies tun, es sei denn, ich denke an einen Grund, warum dies gefährlich ist." Sie möchten denken: "Ich werde das nicht tun, es sei denn, ich kann mir selbst beweisen, dass es sicher ist."
Nate Eldredge

Antworten:

60

Obwohl Sie die Befehlszeilenargumente einschränken, hindert nichts den Benutzer daran, vim zu verwenden , um beliebige Dateien zu öffnen, zu bearbeiten und zu überschreiben, sobald sie als root ausgeführt werden.

Der Benutzer kann sudo vim /etc/httpd/conf/httpd.conf und dann ausführen

  • Löschen Sie den gesamten Text aus dem Bearbeitungspuffer
  • dann aus
    :r /etc/sudoers Gründen der Benutzerfreundlichkeit eine vorhandene Datei (obwohl dies nicht einmal erforderlich ist): zum Beispiel die sudo-Konfiguration HINWEIS: Sofern SELinux keine Einschränkungen vorsieht, kann der Benutzer jede Datei auf diese Weise lesen !
  • Gewähren Sie sich mehr Sudo-Privilegien user ALL=(ALL) NOPASSWD: ALL
  • überschreibe die alte Konfiguration :w /etc/sudoers

Ich kann mir Dutzende ähnlicher Möglichkeiten vorstellen, wie Ihr Benutzer jetzt auf Ihr System zugreifen, es ändern oder es zerstören kann.

Sie haben nicht einmal einen Audit-Trail, welche Dateien auf diese Weise geändert wurden, da Sie nur sehen, wie er Ihre Apache-Konfiguration in den Sudo-Protokollmeldungen bearbeitet. Dies ist ein Sicherheitsrisiko bei der Vergabe von sudoBerechtigungen an einen Editor.

Dies ist mehr oder weniger derselbe Grund, warum das Gewähren von Rechten auf Sudo-Root-Ebene für Befehle wie tarund unziphäufig unsicher ist. Nichts hindert Sie daran, Ersetzungen für Systembinärdateien oder Systemkonfigurationsdateien in das Archiv aufzunehmen.


Ein zweites Risiko, auf das viele andere Kommentatoren hingewiesen haben, besteht darin, vimdass Shell-Escapes möglich sind , bei denen Sie eine Sub-Shell aus vim heraus starten können, mit der Sie beliebige Befehle ausführen können . In Ihrer sudo vim-Sitzung werden diese als root ausgeführt, zum Beispiel als Shell-Escape:

  • :!/bin/bash gibt Ihnen eine interaktive Root-Shell
  • :!/bin/rm -rf / wird für gute Geschichten in der Kneipe sorgen.

Was ist stattdessen zu tun?

Sie können weiterhin verwenden sudo, um Benutzern das Bearbeiten von Dateien, die sie nicht besitzen, auf sichere Weise zu ermöglichen.

In Ihrer sudoers-Konfiguration können Sie einen speziellen reservierten Befehl festlegen, sudoeditgefolgt vom vollständigen Pfadnamen (Platzhalter) zu den Dateien, die ein Benutzer bearbeiten darf:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

Der Benutzer kann dann die -eOption in seiner sudo-Befehlszeile verwenden oder den folgenden sudoeditBefehl verwenden:

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

Wie in der Manpage erklärt :

Die -e (edit)Option gibt an, dass der Benutzer eine oder mehrere Dateien bearbeiten möchte, anstatt einen Befehl auszuführen. Anstelle eines Befehls wird bei der Abfrage der Sicherheitsrichtlinie die Zeichenfolge "sudoedit" verwendet.
Wenn der Benutzer durch die Richtlinie autorisiert ist, werden die folgenden Schritte ausgeführt:

  • Temporäre Kopien der zu bearbeitenden Dateien werden erstellt, wobei der Eigentümer auf den aufrufenden Benutzer festgelegt ist.
  • Der in der Richtlinie angegebene Editor wird ausgeführt, um die temporären Dateien zu bearbeiten. Die sudoers-Richtlinie verwendet die Umgebungsvariablen SUDO_EDITOR, VISUAL und EDITOR (in dieser Reihenfolge). Wenn SUDO_EDITOR, VISUAL oder EDITOR nicht gesetzt sind, wird das erste in der sudoersOption editor (5) aufgeführte Programm verwendet.
  • Wenn sie geändert wurden, werden die temporären Dateien an ihren ursprünglichen Speicherort zurückkopiert und die temporären Versionen werden entfernt.
    Wenn die angegebene Datei nicht existiert, wird sie erstellt.
    Beachten Sie, dass im Gegensatz zu den meisten von sudo ausgeführten Befehlen der Editor mit unveränderter Umgebung des aufrufenden Benutzers ausgeführt wird. Wenn sudo aus irgendeinem Grund eine Datei nicht mit der bearbeiteten Version aktualisieren kann, erhält der Benutzer eine Warnung und die bearbeitete Kopie verbleibt in einer temporären Datei.

Das sudoersHandbuch enthält auch einen ganzen Abschnitt, wie es mit den Optionen und einen begrenzten Schutz gegen Shell-Flucht bieten kann.RESRICTNOEXEC

restrict Vermeiden Sie es, Benutzern Zugriff auf Befehle zu gewähren, mit denen der Benutzer beliebige Befehle ausführen kann. Viele Editoren haben einen eingeschränkten Modus, in dem Shell-Escape-Befehle deaktiviert sind, obwohl sudoedit eine bessere Lösung ist, um Editoren über sudo auszuführen. Aufgrund der großen Anzahl von Programmen, die Shell-Escape-Funktionen anbieten, ist es oft nicht praktikabel, Benutzer auf Programme zu beschränken, die nicht funktionieren.

und

noexec
Viele Systeme, die gemeinsam genutzte Bibliotheken unterstützen, können Standardbibliotheksfunktionen überschreiben, indem sie eine Umgebungsvariable (normalerweise LD_PRELOAD) auf eine alternative gemeinsam genutzte Bibliothek verweisen. Auf solchen Systemen kann die noexec-Funktionalität von sudo verwendet werden, um zu verhindern, dass ein von sudo ausgeführtes Programm andere Programme ausführt. Hinweis: ... ...
Um noexec für einen Befehl zu aktivieren, verwenden Sie das NOEXECim Abschnitt Benutzerspezifikation oben beschriebene Tag. Hier noch einmal das Beispiel:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Dies ermöglicht es dem Benutzer Aaron auszuführen /usr/bin/moreund /usr/bin/vinoexec zu aktivieren. Dadurch wird verhindert, dass diese beiden Befehle andere Befehle (z. B. eine Shell) ausführen.

HBruijn
quelle
Das wusste ich nicht sudo tarund sudo unzipverursache auch Probleme. Vielen Dank.
mi0pu
5
Gute Antwort. Es wäre sogar noch besser, wenn es auch das Entkommen aus dem Inneren in eine Hülle erwähnen würde. Sobald Sie sich in einer Shell befinden, ist sie kostenlos und in den Protokollen wird nur angezeigt, dass der Benutzer Ihre Apache-Konfigurationsdatei bearbeitet.
ein Lebenslauf vom
2
Zusätzlich? Wenn Sie vim verwenden, könnten Sie etwas Schreckliches tun, wie :!rm -rf /, whoops!
Wayne Werner
1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcUnd boom. Root-Zugriff auf tar ist eine Sicherheitslücke.
Qix
1
@ MichaelKjörling das ist die Antwort, die ich erwartet hatte :sh, dann Boom, Wurzelschale
Creek
5

Mit dieser Konfiguration kann der Benutzer diese Datei bearbeiten. Dazu startet er einen vimEditor mit Root-Rechten.

Sobald der vimBefehl gestartet wurde, kann der Benutzer mit diesem Editor nach Belieben arbeiten. - Er kann eine andere Datei öffnen oder sogar eine Shell aus vim heraus starten.

Daher kann der Benutzer jetzt beliebige Dateien anzeigen und bearbeiten und beliebige Befehle auf Ihrem System ausführen.

michas
quelle
Was meinen Sie mit "Diese Konfiguration ermöglicht es allen Benutzern, diese Datei zu bearbeiten"? Hat "Benutzer" eine besondere Bedeutung?
mi0pu
Hoppla, habe nicht aufgepasst. Die Antwort wurde korrigiert.
Michas
5

Sicherheitsschlösser

Einige Programme, wie zum Beispiel less, vi, vimund more, damit andere Programme von einem Shell - Befehl was laufen , wie Shell - Escape bekannt ist oder mit dem Kommandointerpreter entkommen. In diesen Fällen können Sie verwenden NOEXEC, um zu verhindern, dass einige Programme die Ausführung anderer Programmberechtigungen zulassen. Beispiel:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

Dies würde es dem Benutzer ermöglichen, Dateien auf dem System, auf dem vim und mehr ausgeführt wird, zu bearbeiten oder zu privilegieren, deaktiviert jedoch die Möglichkeit, andere Programme mit Privilegien über den Escape-Befehlsinterpreter auszuführen vim.

Wichtig sudobeinhaltet Sperren mehrere Sicherheits (Standard) , die gefährliche Aufgaben, wie Umleiten der Standardausgabe der Ausführung eines Programms ( verhindern STDOUT) auf Dateien außerhalb des Benutzers Home - Verzeichnis.

Wenn in der Datei definiert, /etc/sudoersdass ein Benutzer mit Berechtigungen ausgeführt werden kann /usr/bin/vim, z. B. wie folgt:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudoDamit kann der definierte reguläre Benutzer /usr/bin/vimauf folgende Arten ausgeführt werden:

sudo /usr/bin/vim
sudo vim

Es wird jedoch verhindert, dass vim folgendermaßen ausgeführt wird:

cd /usr/bin
sudo ./vim
Pawan Kumar
quelle
2
Soll dies eine Antwort oder ein Fehler beim Ausschneiden und Einfügen sein?
Jasonwryan
1
Das meiste davon hat nichts mit der Frage zu tun.
Hauke ​​Laging
4

Die einfache Antwort:

Folgendes ist ein Vim-Befehl:

:shell

Sie haben jetzt eine Wurzelschale.

Platzhalter
quelle
1

Eine mögliche inkrementelle Sicherheitsverbesserung besteht darin, Folgendes zu ersetzen:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

mit

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

und dann muss der Benutzer sudo rvim /etc/httpd/confs/httpd.confstattdessen ausgeführt werden.

Vim unterstützt einen eingeschränkten Modus, der mit der Befehlszeilenoption -Z oder durch Starten des Programms als rvim ausgelöst wird. Wenn der eingeschränkte Modus aktiviert ist, sind "alle Befehle, die eine externe Shell verwenden, deaktiviert". Dieser Ansatz würde den Benutzer nicht daran hindern, einen :split fileex-Befehl zum Öffnen anderer Dateien zu verwenden, sollte jedoch zumindest absichtlich böswillige Shell-Befehle wie verhindern :!rm -rf /.

Johann
quelle
1
Leider ist dies auch zu 100% unsicher. Wenn der Benutzer es schafft, / etc / sudoers zu bearbeiten, um sich auf dem System allmächtig zu machen, kann er jeden Befehl als root ausführen.
vurp0
0

Ich stimme HBruijns Antwort zu, dass das Ausführen von vim als root das System sehr weit öffnet und sudoedit eine sicherere Lösung wäre.

Aber selbst dann wäre Ihr System wahrscheinlich noch ziemlich offen. Zumindest unter der Annahme, dass ein Apache-Prozess mit Root-Rechten basierend auf dieser Konfiguration gestartet wird. Es gibt eine Million Möglichkeiten, Apache so zu konfigurieren, dass es externe Programme ausführt. Betrachten Sie als ein Beispiel das Pipe-Argument für die CustomLog- Direktive. Im Handbuch heißt es ausdrücklich:

Sicherheit:

Wenn ein Programm verwendet wird, wird es als der Benutzer ausgeführt, der gestartet hat httpd. Dies ist root, wenn der Server von root gestartet wurde. Stellen Sie sicher, dass das Programm sicher ist.

Wenn Ihre Benutzer die Konfiguration schreiben können, können sie das Programm natürlich nach Belieben ändern, z. B. durch Ausführen eines Shell-Skripts, um ihnen weitere Berechtigungen zu erteilen.

Aus diesem Grund habe ich kürzlich eine Möglichkeit gehackt, die Funktionen so zu nutzen, dass Apache die besondere Fähigkeit erhält, sich an einen privilegierten Port zu binden, obwohl er ansonsten als normaler Benutzer ausgeführt wird. Auf diese Weise können Benutzer die Konfiguration bearbeiten und sogar den Server starten und sind dennoch größtenteils sicher. Das einzige Problem ist, dass sie jeden Prozess an jede IP binden können. Ein gewisses Maß an Vertrauen bleibt bestehen, da sie möglicherweise einen Weg finden, das System sshd zum Absturz zu bringen, und dann ihre eigene Version starten, um das root-Passwort zu erhalten.

MvG
quelle
0

Es sollte beachtet werden, dass auch sudoedit {.../whatever.conf}ein Sicherheitsrisiko sein kann.

Erstellen Sie ein Shell-Skript /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

und rufen Sie dieses Skript in Ihrer Konfigurationsdatei auf. Ich kenne mehrere Beispiele, in denen dieser Ansatz funktioniert:

Befehl samba -> log nt token

log nt token command = /tmp/make_me_root.sh

syslog-ng -> Programm: Senden von Nachrichten an externe Anwendungen

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Ich nehme an, man kann diese Liste endlos erweitern.

Alles was Sie tun müssen, ist den Dienst neu zu starten. Sobald Sie root sind, werden Sie natürlich solche Konfigurationszeilen zurücksetzen, um Ihre Spuren zu verwischen.

Wernfried Domscheit
quelle
0

Natürlich ist es überhaupt nicht sicherer. Wie bereits erwähnt, ist sudoedit der einfachste und geeignetste Weg, dies zu tun.

Was ich hinzufügen möchte, ist, dass vim das Starten einer Shell zulässt, so dass nicht nur alle Systemdateien bearbeitet werden können, sondern auch das Starten einer Shell und das Ausführen, wo immer er möchte.

Versuche einfach ein vim zu starten und tippe: sh

Lauskin
quelle