Wie kann man die Ausführung von Befehlen in einem bestimmten Verzeichnis über SUDOERS einschränken?

13

Ich kann sudo (über die sudoers-Datei) so konfigurieren, dass ein Benutzer die Befehle chownund chmodfür eine beliebige Datei oder ein beliebiges Verzeichnis im System ausführen kann. Ich möchte jedoch nur einem Benutzer die Berechtigung erteilen, diese Befehle für Dateien auszuführen, die sich unterhalb des /var/www/htmlVerzeichnisses befinden.

Wie kann ich privilegierte Befehle so einschränken, dass der Benutzer sie nur in einem vorgegebenen Verzeichnis ausführen kann?

Beispiel: Mit dem folgenden Befehl werden 777 Berechtigungen für die index.htmlDatei erteilt .

sudo chmod 777 /var/www/html/index.html

Jetzt möchte ich zwei Aktionen ausführen

  1. Schränken Sie sudoso ein, dass der Benutzer nur chmodund chownvon innen ausführen kann/var/www/html

  2. Der Benutzer darf diese Befehle nicht an anderer Stelle im System ausführen (z. B. können die Befehle nicht in /var/wwwoder ausgeführt werden /var/ftp).

PrashantB
quelle
1
Bitte nicht crossposten - superuser.com/questions/456662/…
Ulrich Dangel
7
Ist das wirklich der richtige Weg? Wie wärs mit einer www-dataGruppe , die die Notwendigkeit zur Beseitigung chmod/ chownalles?
Sr_
Cool. Auf diese Weise bekommen Sie ziemlich einfach Wurzel. Es ist eine sehr schlechte Idee, etwas zu verschenken chown. Abgesehen davon sehe ich keinen Grund, warum chmodals root ausgeführt werden muss.
Nils

Antworten:

13

Was Sie fragen, ist schwierig, wenn nicht unmöglich. Selbst wenn Sie die Anwendung von chownund chmodauf Dateien in einem bestimmten Verzeichnis beschränken würden, könnte jemand einen symbolischen Link übergeben und so Dateien an jeder beliebigen Stelle beeinflussen.

Glücklicherweise ist es sehr wahrscheinlich, dass das, was Sie versuchen, nicht die richtige Lösung für Ihr eigentliches Problem ist, und es gibt eine andere Methode, die funktioniert.

Normalerweise werden Benutzer, die zusätzliche Berechtigungen zum Erstellen und Ändern von Dateien benötigen /var/www, einer Gruppe hinzugefügt (häufig www-dataoder Sie haben möglicherweise unterschiedliche Gruppen für verschiedene Teile der Site). Sie können die Verzeichnisse group owner und setgid verwenden: Damit chgrp www-data /var/www/html; chmod g+ws /var/www/htmlkann jeder in der www-dataGruppe in das /var/www/htmlVerzeichnis schreiben , und die in diesem Verzeichnis erstellten Dateien gehören der www-dataGruppe anstelle der primären Gruppe des Benutzers, der die Datei erstellt hat. Dies ist jedoch nicht sehr flexibel.

Was Sie wahrscheinlich tun sollten, ist Zugriffssteuerungslisten für Dateien unter einzurichten /var/www. Stellen Sie zunächst sicher, dass ACLs aktiviert sind: Das Dateisystem, das aktiviert /var/wwwist, muss mit der aclOption bereitgestellt werden. Weitere Informationen hierzu finden Sie unter Alle neuen Dateien in einem Verzeichnis für eine Gruppe zugänglich machen . Installieren Sie auch die ACL-Dienstprogramme ( getfaclund setfacl). Geben Sie /var/www/htmldann den Benutzern, die sie haben sollen , zusätzliche Berechtigungen für den Baum unter . Sie können Benutzer-ACLs festlegen, aber es ist oft einfacher, Benutzer, die die gleichen Rechte für einen Teil des Dateisystems haben sollen, in eine Gruppe aufzunehmen und ACLs für diese Gruppe festzulegen. Wenn die Benutzer in der Gruppe html-writersbeispielsweise Lese- und Schreibzugriff auf den Baum haben sollen, gehen Sie wie folgt vor /var/www/html:

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html
Gilles 'SO - hör auf böse zu sein'
quelle
In Bezug auf "dies ist nicht sehr flexibel" (am Ende von Absatz 3) - warum nicht? Liegt es daran, dass die Leute in einer bestimmten Gruppe sein müssen? (Ich weiß kaum etwas über Berechtigungen und ACL und verwandte Dinge.)
KajMagnus
3
@KajMagnus Es ist unflexibel, da root Gruppen verwalten muss und Dateien nur zu einer einzigen Gruppe gehören können. Mit der Zugriffssteuerungsliste kann jeder Benutzer auswählen, wer auf die Dateien zugreifen darf. In einer Zugriffssteuerungsliste können mehrere Benutzer und Gruppen aufgeführt werden.
Gilles 'SO - hör auf böse zu sein'
2

Sie können den Befehl, der von "myuser" verwendet werden soll, mit allen Argumenten in der /etc/sudoersDatei einschränken, indem Sie den folgenden Befehl eingeben visudo:

## Allows myuser to chmod the html dir and chmod 755 the html2 dir
myuser  ALL=NOPASSWD:/bin/chmod [0-7][0-5][0-5] /var/www/html/*,/bin/chown myuser:mygroup /var/www/html/*,/bin/chmod 755 /var/www/html2/myapp/*.txt 

Aktivieren Sie die Protokollierung für jeden Vorgang, indem Sie Folgendes hinzufügen:

Defaults logfile=/var/log/sudo.log

Beispielausgabe:

[root@myhost /]# su - myuser
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/index.html 
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/*
-sh-3.1$ sudo /bin/chmod 777 /var/www/html2/myapp/*.txt
Sorry, user myuser is not allowed to execute '/bin/chmod 777 /var/www/html2/myapp/*.txt' as root on myhost.mydomain.
-sh-3.1$ sudo /bin/chmod 755 /var/www/html2/myapp/*.txt 
-sh-3.1$ 

Wenn Sie sudo verwenden, sollte die Voraussetzung sein, dass "myuser" eine vertrauenswürdige Person ist. Seien Sie vorsichtig mit Dateiberechtigungen. Es gibt keine einfache Möglichkeit, einen böswilligen sudo-Benutzer daran zu hindern, eine Datei von einer externen Ressource aus zu verknüpfen und zu ändern.

Tombolinux
quelle
Ich habe es schon einmal versucht, aber es gab den Fehler: Sorry, Benutzer prashant darf '/ bin / chmod 777 / var / www / html / a' nicht als root auf prashant.xyz.com ausführen.
PrashantB
hast du den benutzer gewechselt mit su - prashantoder su prashant?
Tombolinux
Ja, ich führe ein Kommando eines Prashant-Benutzers aus. Ich lese Foren, sie sagen, Befehle werden systemweit ausgeführt. Niemand hat über ein solches Problem geschrieben.
PrashantB
Ich laufe es whooo :). Dies wird jedoch ein statischer Befehl sein. Können wir es verallgemeinern, damit ich jede Erlaubnis auf jede Datei unter / var / www / html anwenden kann?
PrashantB
3
Das ist völlig unsicher: sudo /bin/chmod 666 /var/www/html/../../../etc/passwdUnd wenn Sie das irgendwie in Ordnung bringen,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
Gilles 'SO auf, böse zu sein'
1

Es gibt eine relativ einfache Möglichkeit, dies zu tun, indem Sie ein Bash-Skript (oder eine Shell Ihrer Wahl) erstellen, um die an einer bestimmten Datei oder einem bestimmten Verzeichnis vorgenommenen Änderungen einzuschränken.

In Ihrem Beispiel würde das so aussehen:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Dann würden Sie die sudoers-Datei ändern, damit www-data / usr / local / bin / mychmod ausführen kann.

Beachten Sie jedoch, dass das Zulassen von Benutzereingaben (z. B. das Ändern der Datei oder des Verzeichnisses in diesem Bereich durch einen Benutzer) äußerst gefährlich ist und Sie wissen müssen, wie Sie Injektionsangriffe herausfiltern können, wenn Sie etwas Ähnliches tun möchten Das. Ein Angreifer kann auf diese Weise problemlos einen Befehl als root ausführen, wodurch die Sicherheit Ihres Systems beeinträchtigt wird.

Ernie
quelle
Das ist außergewöhnlich gefährlich und löst die Lösung nicht wirklich ...
SomeGuy