Die Verwendung von CmndAlias ALL
wird niemals sicher sein
Es gibt 1000 Möglichkeiten, service network restart
ohne es zu tun sudo service network restart
. Hier ist ein Beispiel, was ein ungezogener Benutzer versuchen könnte:
$ echo "service network restart" > /tmp/hax
$ chmod a+x /tmp/hax
$ sudo /tmp/hax
Wenn Sie Benutzern den ALL
Befehlsalias bereitstellen und dann versuchen, eine schwarze Liste zu erstellen, können sie sich immer daran orientieren. Blacklist Bash, und sie werden Python verwenden. Blacklist Python, und sie werden Perl verwenden. Blacklist Perl, und sie werden PHP verwenden. Niemand will das!
Wenn Sie nicht wirklich jemand etwas tun wollen, sollten Sie tun , wie Thomas sagt, und erstellen Sie eine weiße Liste von Dingen , die sie sind erlaubt zu tun.
Einrichten einer Whitelist mit einer Ausnahme
Ein Beispiel für eine kleine Whitelist mit einem Ausschluss befindet sich unten in man sudoers
:
pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
The user pete is allowed to change anyone's password except for root on the HPPA
machines. Note that this assumes passwd(1) does not take multiple user names
on the command line.
(Tatsächlich ist dieses Beispiel auf der Manpage unsicher und kann ausgenutzt werden, um das root-Passwort zu ändern. Siehe die Kommentare unten für wie.)
Wir können versuchen, dies an Ihren Fall anzupassen, um der Stabgruppe alle service
Befehle anzubieten , aber die Sie betreffenden Befehle ausschließenservice network
:
%staff ALL = /usr/sbin/service *, \
! /usr/sbin/service *network*, \
! /usr/sbin/service *NetworkManager*
(Die ALL
in dieser Position bezieht sich auf die Host_Alias, nicht die Cmnd_Alias - verwirrend, nicht wahr?)
Der Benutzer kann sudo bash
oder sudo tee
oder sudo wget
oder nicht ausführen sudo /path/to/malicious_script
. Sie können weitere Administrationsbefehle für Ihre Benutzer auf die Positivliste setzen, wenn Sie vorsichtig sind. Sei einfach konkret!
Hinweis: Ich habe das *
vor dem network
obigen Wort hinzugefügt , nur für den Fall, dass dem service
Tool in Zukunft jemals ein harmloses Flag hinzugefügt wird. Stellen wir uns vor, dass --verbose
in Zukunft ein Flag hinzugefügt wurde, dann könnten die Benutzer Folgendes ausführen:
$ sudo service --verbose network restart
Wir müssen also *
alle Flags vor dem Dienstnamen konsumieren. Der einzige Nachteil ist , dass diese andere Dienste blockieren könnten , die Sie eigentlich gar nicht genannt Benutzer ausgeführt wird , zB ein Dienst dagegen safe-network
oder network-monitor
auch abgelehnt werden würde.
Ermöglichen Sie Benutzern das Bearbeiten einer Datei mit Gruppenberechtigungen
Im Folgenden finden Sie verschiedene Versuche, mit rnano
Hilfe sudo
von eine oder mehrere Dateien zu bearbeiten. Aber in Wirklichkeit sind sie komplexer und gefährlicher als sie sein sollten.
Eine viel einfachere und sicherere Lösung besteht darin, die Gruppenberechtigungen für die spezifischen Dateien zu ändern, für die Sie Bearbeitungsrechte öffnen möchten. Hier einige Beispiele:
### Give steve the ability to edit his nginx config:
$ chgrp steve /etc/nginx/sites-available/steves_dodgy_project
$ chmod g+rw /etc/nginx/sites-available/steves_dodgy_project
### Let all members of the staff group edit the group_website config:
$ chgrp staff /etc/nginx/sites-available/group_website
$ chmod g+rw /etc/nginx/sites-available/group_website
Wenn Sie eine differenziertere Steuerung benötigen (z. B. Zugriff für nur 3 Benutzer, aber nicht alle Mitarbeiter), können Sie mit dem addgroup
Befehl eine neue Gruppe erstellen und dieser nur wenige Benutzer hinzufügen.
Lassen Sie Benutzer eine Datei bearbeiten sudo
Der Rest dieser Antwort wurde zu einer Untersuchung darüber, wie einfach es ist, Lücken in Ihrer sudo
Konfiguration zu hinterlassen, wenn Sie Ihren Benutzern Flexibilität bieten möchten. Folgendes würde ich nicht empfehlen!
Wenn Sie Ihren Benutzern den Zugriff zum Bearbeiten einer bestimmten Datei gewähren möchten, können Sie versuchen, Folgendes zu verwenden rnano
:
%staff ALL = /bin/rnano /etc/nginx/sites-available/host
rnano
Lässt sie nur die angegebene Datei bearbeiten. Dies ist wichtig, um zu verhindern, dass ein böswilliger Benutzer beispielsweise einen anderen Startdienst bearbeitet /etc/init.d/urandom
und eine Zeile hinzufügt, die ausgeführt wird service network restart
.
Leider habe ich keinen Weg gefunden, um rvim
ausreichend einzuschränken (der Benutzer kann noch jede Datei mit öffnen :e
), so dass wir bei stecken bleiben nano
.
Leider ist es viel schwieriger, Benutzern das Bearbeiten mehrerer Dateien zu ermöglichen ...
Lassen Sie die Benutzer mehrere Dateien bearbeiten (viel schwieriger als es sein sollte)
1. Unsichere Ansätze
Passen Sie auf Wildcards auf! Wenn Sie zu viel Flexibilität bieten (oder eine beliebige Flexibilität), kann dies ausgenutzt werden:
%staff ALL = /bin/rnano /etc/nginx/sites-available/* # UNSAFE!
In diesem Fall kann ein böswilliger Benutzer ein beliebiges anderes Skript für den Upstart-Dienst bearbeiten und dann ausführen:
$ sudo rnano /etc/nginx/sites-available/../../../any/file/on/the/system
(Sudo verhindert .
und ..
erweitert den Befehl, aber leider nicht die Argumente.)
Ich hatte gehofft, dass so etwas funktioniert, aber es ist immer noch unsicher:
%staff ALL = /bin/rnano /etc/nginx/sites-available/[A-Za-z0-9_-]* # UNSAFE!
Da sudo
derzeit nur Glob- Muster angeboten werden , *
die zu nichts passen, handelt es sich nicht um einen regulären Ausdruck!
(Edit: Ich habe darüber nachgedacht, ob Sie in Ihrer Situation mit dem oben Gesagten durchkommen könnten , da sich keine Unterordner darunter befinden sites-available
. Wir haben verlangt, dass ein Zeichen nach dem Ordner abgeglichen wird und /..
nach einem Dateinamen fehlschlägt. Dies ist jedoch kein praktikable Lösung, da rnano
mehrere Argumente akzeptiert werden. Und im Allgemeinen wäre dies in einem Ordner mit Unterordnern immer noch unsicher !)
Selbst wenn wir keine Unterordner haben und alle Zeilen ausschließen /../
, die einen *
Glob enthalten , kann die Regel, die einen Glob anbietet, dennoch ausgenutzt werden, da rnano
mehrere Argumente akzeptiert werden (durchlaufen <C-X>
, und das Leerzeichen wird vom *
Glob gerne akzeptiert .
$ rnano /etc/nginx/sites-available/legal_file /then/any/file/on/the/system
2. Schieben des Umschlags (auch letztendlich unsicher)
Was ist, wenn wir Zeilen ablehnen, die Leerzeichen enthalten, oder versuchen zu erreichen /..
? Dann könnte eine endgültige praktikable Lösung sein:
# I tried hard to make this safe, but in the end I failed again.
# Please don't use this unless you are really smart or really stupid.
%staff ALL = /bin/rnano /etc/nginx/sites-available/*, \
! /bin/rnano */..*, \
! /bin/rnano /etc/nginx/sites-available/, \
! /bin/rnano */., \
! /bin/rnano * *
# CONCLUSION: It is still NOT SAFE if there are any subfolders, due to
# the bug in rnano described below.
Wir nehmen alles „unter“ dem Ordner , aber wir lehnen auch alle Anrufe an , rnano
wenn /..
oder /.
oder
weitergegeben werden, oder wenn der Ordner direkt angestrebt. (Technisch /.
macht der /..
Ausschluss den Ausschluss überflüssig, aber ich habe beide aus Gründen der Klarheit belassen.)
Ich habe den Ordner gefunden, und die /.
Ausschlüsse wurden benötigt, da der Benutzer sonst auf den Ordner selbst abzielen könnte. Jetzt könnten Sie denken, rnano
würde blockieren, wenn auf einen Ordner verwiesen, aber Sie wären falsch. Tatsächlich startet meine Version (2.2.6-1ubuntu1) mit einer milden Warnung und einer leeren Datei, und <C-X>
fordert mich dann auf , einen beliebigen Dateinamen einzugeben, unter dem ich speichern möchte. Dadurch wird ein neuer Angriffsvektor geöffnet! Nun, zumindest hat es sich geweigert, eine vorhandene Datei zu überschreiben (in dem einen Test, den ich durchgeführt habe). Wie auch immer, da es keine Möglichkeit gibt, Unterordner mit sudo auf die schwarze Liste zu setzen, müssen wir den Schluss ziehen, dass dieser Ansatz erneut unsicher ist. Sorry Benutzer!
Diese Entdeckung ließ mich an der Gründlichkeit des nano
"eingeschränkten" Modus zweifeln . Sie sagen, eine Kette sei nur so stark wie ihr schwächstes Glied. Ich fange an, die Kombination von sudo
schwarzer Magie zu spüren und bin rnano
vielleicht nicht sicherer als eine Kette von Gänseblümchen.
3. Sichere, aber begrenzte Ansätze
Globs sind sehr eingeschränkt - sie lassen uns nicht mehrere Male mit einer Charakterklasse übereinstimmen. Sie können mehrere Dateibearbeitungen anbieten, wenn alle Dateinamen dieselbe Länge haben (in diesem Fall host
gefolgt von einer einzelnen Ziffer):
%staff ALL = /bin/rnano /etc/nginx/sites-available/host[0-9] # SAFE
Wenn Sie dem Benutzer jedoch den Zugriff zum Bearbeiten verschiedener Dateien gewähren möchten, müssen Sie möglicherweise jede einzelne Datei explizit angeben:
%staff ALL = /bin/rnano /etc/nginx/sites-available/hothost \
/bin/rnano /etc/nginx/sites-available/coldhost \ # SAFE
/bin/rnano /etc/nginx/sites-available/wethost \
/bin/rnano /etc/nginx/sites-available/steves_dodgy_project
Seien Sie zu*
keinem Zeitpunkt versucht , azu verwenden. Lesen Sie in den Abschnitten 1. und 2. nach, warum! Denken Sie daran: Ein kleiner Fehler kann das gesamte Superuser-Konto und das gesamte System gefährden.
4. Schreiben Sie Ihren eigenen Argumentationsprüfer (Sicherheit liegt jetzt in Ihrer Verantwortung)
Ich hoffe, dass sie in Zukunft die Unterstützung für reguläre Ausdrücke erweitern sudo
werden. es könnte eine Menge Probleme lösen, wenn es richtig verwendet wird. Möglicherweise müssen wir aber auch die Eigenschaften von Argumenten überprüfen können (um nur Dateien, nur Ordner oder nur bestimmte Flags zuzulassen).
Es gibt jedoch eine Alternative, um in sudo Flexibilität zu schaffen. Übergeben Sie das Geld:
%staff ALL = /root/bin/staffedit *
Schreiben Sie dann ein eigenes staffedit
Skript oder eine ausführbare Datei, um zu überprüfen, ob die vom Benutzer übergebenen Argumente zulässig sind, und führen Sie die Anforderung nur aus, wenn dies der Fall ist.
networking
undnetwork-manager
? Warum haben Ihre Benutzersudo
Zugriff? Sie sollten es nicht tun, es sei denn, Sie möchten, dass sie über vollständige Root-Berechtigungen verfügen.