Verwenden Sie find mit sudo sicher

10

Auf einem Linux-Server muss ich Root-Berechtigungen von einer Gruppe von Benutzern entfernen. Diese Benutzer haben jedoch berechtigte Gründe, das Dienstprogramm "Suchen" verwenden zu können, um nach Dateien zu suchen, die auf Dateinamen, Änderungsdaten und anderen Metadaten basieren.

Auf dem Server sind Dateinamen nicht vertraulich, der Dateiinhalt jedoch möglicherweise.

Ich möchte sudo verwenden, damit die Benutzer überall auf dem Server nach Dateien suchen können. Das Dienstprogramm "find" ist großartig, erlaubt jedoch alle Arten von Nebenwirkungen, z. B. die Verwendung von "-exec", um beliebige Befehle zu erzeugen.

Kann ich findmit meinen Einschränkungen arbeiten?

Troels Arvin
quelle
14
Normalerweise möchten Sie nicht, dass die Suchergebnisse für Dateinamenmuster Dateien enthalten, auf die Sie nicht zugreifen können. In dieser Hinsicht ist Ihre Anforderung etwas seltsam.
HBruijn
2
Niemand zwingt Sie, sich auf die Frage einzulassen. Ich denke, einer der Zwecke von Server Fault ist es, als Forum für seltsame Situationen zu dienen.
Troels Arvin
2
Server Fault ist kein Forum, und Versuche der umgekehrten Psychologie ändern nichts an der Gültigkeit von HBruijns Beobachtung (die sicher gestellt wurde, um Ihnen zu helfen).
Leichtigkeitsrennen im Orbit

Antworten:

19

Was ist mit lokalisieren ?

find liest eine oder mehrere von updatedb (8) vorbereitete Datenbanken und schreibt Dateinamen, die mindestens einem der MUSTER mit der Standardausgabe entsprechen, einen pro Zeile. Wenn --regex nicht angegeben ist, können PATTERNs Globbing-Zeichen enthalten. Wenn ein MUSTER keine Globbing-Zeichen enthält, verhält sich die Suche so, als wäre das Muster MUSTER .

Standardmäßig prüft find nicht, ob in der Datenbank gefundene Dateien noch vorhanden sind. Suchen kann niemals Dateien melden, die nach der letzten Aktualisierung der entsprechenden Datenbank erstellt wurden.

Oder vielleicht sogar aufschlitzen :

Secure Locate bietet eine sichere Möglichkeit, Dateien auf Ihrem System zu indizieren und schnell zu suchen. Es verwendet inkrementelle Codierung, genau wie GNU locate, um seine Datenbank zu komprimieren, um die Suche zu beschleunigen. Es speichert jedoch auch Dateiberechtigungen und Eigentumsrechte, sodass Benutzer keine Dateien sehen, auf die sie keinen Zugriff haben.

Diese Handbuchseite dokumentiert die GNU-Version von slocate. slocate Ermöglicht Systembenutzern das Durchsuchen ganzer Dateisysteme, ohne nicht autorisierte Dateien anzuzeigen.

Lenniey
quelle
Gute Idee. Ich weiß nicht, warum ich nicht daran gedacht habe. Aber ich befürchte, dass der "-d" -Parameter irgendwie zum Einlesen in beliebige Dateien verwendet werden könnte, wenn der Benutzer nach den Sudo-Regeln einen Befehl zum Suchen ausführen kann.
Troels Arvin
2
@TroelsArvin: locatebraucht nicht sudo; Nur für seine updatedbArbeit sind besondere Berechtigungen erforderlich. Ihre Benutzer sollten daher niemals ausgeführt werden oder ausgeführt werden können sudo locate.
Jwodder
1
@jwodder: Auf einem RHEL 7-Server: Angenommen, Benutzer u hat keinen Zugriff auf / data / foo. In / data / foo befindet sich eine Datei "somefile.csv". Wenn Sie nun "lokalisieren somefile.csv" ausführen, enthält die Ausgabe von "lokalisieren" nicht /data/foo/somefile.csv - es sei denn, Benutzer u führt "suchen" über sudo aus. (Die Verwendung des Arguments "--nofollow" hilft nicht.)
Troels Arvin
1
@TroelsArvin aber das -dFlag setzt nur den Datenbankpfad? Vielleicht habe ich dich falsch verstanden.
Lenniey
21

Gemäß man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

Das hat bei mir funktioniert. (Zeilen, die mit '#' beginnen, sind root, Zeilen mit '$' sind nicht root) In diesem Fall befindet sich der Benutzer ohne root in der wheelGruppe.

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

In Anbetracht dessen, was die Fähigkeit gewährt, passt sie genau zu dem, was Sie wollen. Ich habe nicht ausführlich geprüft, ob findes eine Funktion gibt, mit der Sie Bytes in Dateien lesen können, aber offensichtliche Dinge wie LD_PRELOADund Shim-Angriffe auf Bibliotheken sollten aufgrund der Art der Setuid-Überprüfungen unter Linux nicht funktionieren und die Fähigkeitsbits werden nicht angezeigt entweder von untergeordneten Prozessen geerbt (im Gegensatz zu Raw Setuid), das ist also ein weiterer Bonus.

Denken Sie daran, dass das, was Sie tun möchten, möglicherweise Bedenken hinsichtlich des Datenschutzes in Bezug auf die temporäre Erstellung oder den Zugriff auf Dateien aufwirft. Das Programm kann als Grundlage für die Bereitstellung eines Eskalationsversuchs für Race-Bedingungen / Berechtigungen verwendet werden (gegen Programme, die bekannte Dateinamen erstellen aber keine korrekten Sicherheitsüberprüfungen durchführen).

Einige schlecht geschriebene Anwendungen können sich auch auf Dateimetadaten oder Baumstrukturen stützen, um Bedeutung zu vermitteln oder Daten zu verbergen. Dies kann dazu führen, dass eingeschränkte Informationen veröffentlicht werden oder privilegierte Dokumente enthüllt werden, über die sonst nichts bekannt ist (Sicherheit durch Unbekanntheit, die ich kenne, aber dies ist eine Sache, die insbesondere Closed-Source-Anbieter leider gerne tun).

Seien Sie daher vorsichtig und seien Sie vorsichtig, wenn Sie dies tun, und verstehen Sie, dass damit immer noch ein Risiko verbunden ist, auch wenn die offensichtlichen Dinge nicht funktionieren.

Oh, und es würde mich interessieren, ob jemand einen Proof-of-Concept-Angriff hat, der diesen Mechanismus als Grundlage für die Eskalation von Berechtigungen in den Kommentaren verwendet!

Matthew Ife
quelle
5
Das sieht in der Tat sehr interessant aus!
Sven
So was? Nun, kein PoC, aber trotzdem interessant: forums.grsecurity.net/…
Lenniey
Ich mag diese Idee, aber sie hat einen erheblichen Nachteil: sudofind ist jetzt eine Binärdatei, die nicht Teil eines Softwarepakets (z. B. RPM) auf dem System ist. Wenn die Distribution einen Patch für "find" sendet, wird sudofind nicht aktualisiert.
Troels Arvin
2
@TroelsArvin Das ist nicht unbedingt eine schlechte Sache. Wenn Sie einem vorhandenen Dienstprogramm, das nicht für diese Funktionen entwickelt wurde, setuid-ähnliche Funktionen hinzufügen, möchten Sie keine Aktualisierungen des zugrunde liegenden Dienstprogramms, bevor Sie überprüft haben, ob das aktualisierte Dienstprogramm sicher mit Ihrem Nicht-Standard verwendet werden kann Fähigkeiten. Stellen Sie sich in diesem Fall vor, ein Update würde finddie Möglichkeit bieten, vom Benutzer bereitgestellten Code direkt auszuführen, ähnlich wie awkdies möglich ist.
Andrew Henle
4
Das größte Problem, das ich dabei sehen kann, ist, dass in die Welt beschreibbare Verzeichnisse, die sich unter nicht durchsuchbaren Verzeichnissen befinden, plötzlich geschrieben werden können.
Tavian Barnes
2

Ich würde den Benutzern die richtigen Berechtigungen geben.

Wenn die Umask aktiviert ist 022, werden standardmäßig Verzeichnisse erstellt, damit jeder die darin enthaltenen Dateien auflisten und statisieren kann. Wenn nicht, können Sie die Berechtigung des Verzeichnisses manuell in bitweise oder in die alten Berechtigungen ändern und 0555:

chmod +0555 foo

Und wenn diese Benutzer nicht über Ausführungsberechtigungen für alle übergeordneten Elemente dieses Verzeichnisses verfügen (z. B. das Ausgangsverzeichnis eines anderen Benutzers), bedeutet dies wahrscheinlich, dass Sie das erste Verzeichnis an einer anderen Stelle ablegen sollten.

Wenn Sie nur einigen Benutzern erlauben möchten, dieses Verzeichnis zu lesen und auszuführen, können Sie den Modus in ändern 0750, diese Benutzer in eine Gruppe einordnen und den Gruppeneigentümer des Verzeichnisses in diese Gruppe ändern:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo
yt7b97q-
quelle