Ich möchte Dateien finden, die ein bestimmter Benutzer nicht lesen kann.
Angenommen, der Benutzername lautet "user123" und sie befinden sich in einer Gruppe namens "user123". Ich möchte Dateien finden, die, wenn sie Eigentum von user123 sind, u + r aktiviert haben. Andernfalls sollte g + r aktiviert sein, wenn die Datei der Gruppe user123 ist. Andernfalls kann o + r eingeschaltet sein.
Da GNU find "-readable" hat, könnte ich dies tun:
sudo -u user123 find /start ! -readable -ls
Der Prozess muss jedoch von einem Benutzer ausgeführt werden, der keinen Sudo-Zugriff hat. Deshalb habe ich folgendes versucht: (es prüft o + r nicht, aber das ist an dieser Stelle nicht wichtig)
find /start \( -user user123 ! -perm -u=r \) -o \( -group user123 ! -perm -g=r \) -ls
aber es listet diese Datei auf:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
Diese Datei ist die einzige Datei unter /start
, die dem Benutzer123 mit g=r
off gehört. Es ist, als würde find das -u=r
as interpretieren -g=r
.
Ich beschloss, die Logik umzukehren und stattdessen zu testen not ( truth )
:
find /etc/puppet ! \( \( -user puppet -perm -u=r \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \) -ls
Das funktioniert!
Warum ist das Original find
gescheitert? Ist es ein Fehler find
(unwahrscheinlich) oder ist die Logik falsch?
Update: Ich hatte die Logik falsch. Wie unten ausgeführt, da! (A || B || C) == (! A &&! B &&! C) Dies sind die beiden äquivalenten Aussagen:
find /start ! \( \( -user user123 -perm -u=r \) -o \( -group user123 -perm -g=r \) -o \( ! \( -user user123 -o -group user123 \) -perm -o=r \) \) -ls
find /start ! \( -user user123 -perm -u=r \) ! \( -group user123 -perm -g=r \) ! \( ! \( -user user123 -o -group user123 \) -perm -o=r \) -ls
Mein Ziel war es, Benutzer / Gruppe nicht zweimal testen zu müssen. Was ich wirklich brauche, ist eine kompliziertere Wenn-Dann-Sonst-Struktur, die wahrscheinlich nur möglich wäre, wenn es einen -xor-Operator gäbe. Ich könnte ein xor daraus bauen und / oder / nicht, aber es wäre komplexer als die beiden obigen Lösungen.
puppet
Zugriff auf eine Datei mit hat--wxrwxrwx puppet puppet
.Antworten:
Die Logik ist falsch. Sie denken, diese Datei sollte nicht aufgelistet sein, da sie Eigentum
user123
des Benutzers ist und dasr
Bit des Benutzers gesetzt hat. Es wird jedoch aufgelistet, weil es dem zweiten Kriterium entspricht (es gehört der Gruppeuser123
und hat dasr
Bit der Gruppe nicht gesetzt).Ihre zweite Version funktioniert aufgrund eines von de Morgans Gesetzen : Das Negieren der logischen ODER-Verknüpfung einer Gruppe von Anweisungen entspricht logisch der UND-Verknüpfung der Negation der einzelnen Anweisungen. Mit anderen Worten:
Die Arbeit
find
sucht also nach einer Datei, dieuser123
und lesbar für diesen Benutzer) UNDuser123
und von dieser Gruppe lesbar) UNDwährend der erste
find
nach einer Datei sucht, dieuser123
und für diesen Benutzer nicht lesbar ODERuser123
und für diese Gruppe nicht lesbar ODER (falls Sie es abgeschlossen haben)Wie Sie gesehen haben, wird eine Datei aufgelistet, die mit JEDEM der oben genannten 3 Kriterien (und nicht unbedingt allen) übereinstimmt.
Bearbeiten
Übrigens (nach dem Betrachten Ihres Profils) bin ich ein großer Fan Ihres O'Reilly-Buches :)
quelle
( !A && !B && !C )
aber ich habe das!
in das Innere jedes Teils verschoben , was nicht gültig ist. Vielen Dank!Es sind noch viel mehr Dinge zu beachten, um zu überprüfen, ob ein Benutzer über einen bestimmten Pfad Zugriff auf eine Datei hat:
Es ist sehr schwierig, die gleiche Logik wie das System zu implementieren, ohne alle Uids und Gids auf die des Benutzers umzustellen und zu überprüfen.
Mit zsh können Sie (als root) Folgendes tun:
Oder mit
perl
:In beiden Fällen müssen Sie den Verzeichnisbaum
root
als den entsprechenden Benutzer absteigen, aber auf Dateizugriff testen.Laufen
find -readable
wiesome-user
nicht in den Fällen , da es nicht in der Lage sein , über die Verzeichnisse zu gehen , für die der Benutzer keinen Zugang oder keine Leseberechtigung hat (aber möglicherweise Zugriff).Auch wenn Sie nur die Berechtigung und den Besitz der Datei selbst berücksichtigen (und nicht ACLs oder Pfadkomponenten ...), benötigen Sie mindestens (hier GNU-Syntax):
Die Idee ist, dass alle anderen Berechtigungen irrelevant sind, wenn die Datei dem Benutzer gehört. Wenn nicht, ist die "andere" Berechtigung irrelevant, wenn sich die Datei in Gruppenbesitz einer der Benutzergruppen befindet.
quelle
access()
darin, dass derselbe Kernelcode wie verwendet wirdopen()
. Somitsudo -u user123 find /start -readable
ist die beste Lösung, wennsudo
eine Option ist.sudo -u user123 find -readable
, werden keine Dateien in Verzeichnissen gemeldet, die Sie nicht eingeben können, oder in Verzeichnissen, die Sie nicht lesen können (es gibt also falsch negative und falsch positive Ergebnisse). Deshalb schlage ich vor , mitzsh
für den Abstieg den Verzeichnisbaum als root und tunaccess()
([ -r ... ]
) als die tatsächlichen Benutzer (Einstellung$USERNAME
inzsh
Änderungen alle UIDs und GIDs wiesudo
würde).