Warum entspricht der Zugriffsüberprüfungsalgorithmus von "man acl" nicht der tatsächlichen Differenzierung der Rechte?

337
magrif

In man aclsagt:

2. else if the effective user ID of the process matches the qualifier of any entry of type ACL_USER, then if the matching ACL_USER entry and the ACL_MASK entry contain the requested permissions, access is granted, else access is denied. 

Wie ich es verstehe, wenn der Eintrag ACL_USER für Benutzer vorhanden ist, wird der Zugriff entsprechend diesem Eintrag gewährt oder verweigert, und der Algorithmus endet.

Erstellen Sie eine Datei und weisen Sie ihr Zugriffsrechte zu:

echo "echo 123" > /file1 chmod 005 file1 setfacl -m u:test1:--- /file1 chown usertest:root /file1 

und bekomme

userc@client:~$ getfacl /file1 getfacl: Removing leading '/' from absolute path names # file: file1 # owner: usertest # group: root user::--- user:test1:--- group::--- mask::--- other::r-x 

Wenn ich den Algorithmus richtig verstehe, ist der Zugriff zum Ausführen und Lesen für jeden außer usertestund erlaubt test1, aber auth zur test1Datei und zum Ausführen der Datei:

test1@client:~$ sh /file1 123 

dh Zugangsrechte erhalten von others

Warum verweigert der Eintrag ACL_USER für den Benutzer 'test1' den Zugriff nicht test1?

ps-Laufwerk mit 'acl'

2

1 Antwort auf die Frage

2
grawity

In diesem Fall überspringt der Linux-Kernel die ACL-Prüfung vollständig, da ACL_MASK überhaupt keine Bits enthält (und daher die ACL keine Berechtigungen erteilen kann). Die Operation führt dazu, dass nur die "anderen" Berechtigungsbits (die den Zugriff erlauben) geprüft werden.

Dies könnte ein Fehler sein, der 2004 beim Umschreiben der "generischen ACL-Unterstützung" (Commit 42017c2ein tglx / history, dc4ceab7vereinheitlicht) eingeführt wurde. Sie können es in der Funktion acl_permission_check () in sehen fs/namei.c(beachten Sie, dass die ' mask' -Variable nicht auf ACL_MASK, sondern auf die gewünschten Zugriffsbits verweist):

statisch int acl_permission_check (struct inode * inode, int-Maske) { unsigned int mode = inode-> i_mode;  if (wahrscheinlich (uid_eq (current_fsuid (), inode-> i_uid))) ... sonstiges if (IS_POSIXACL (Inode) && (Modus & S_IRWXG)) { int error = check_acl (Inode, Maske); if (Fehler! = -EAGAIN) Rückgabefehler; } ... 

Als Randbemerkung gilt : Wenn Sie verwenden sh /file1, gilt für file1 nur die Berechtigung + r, da Sie nicht vom Kernel aufgefordert werden, die Datei auszuführen sh. Sie werden nur ausgeführt .

Gibt es eine C-Schnittstelle zum Überprüfen der tatsächlichen Zugriffsrechte auf die FS-Ressource für den Benutzer (einschließlich der ACL)? magrif vor 5 Jahren 0
@ magrif: Mit dem Systemaufruf [access ()] (http://man7.org/linux/man-pages/man2/access.2.html) können Sie überprüfen, ob Sie über bestimmte effektive Rechte verfügen - dabei werden Berechtigungen, ACLs, root berücksichtigt Privileg und CAP_DAC_OVERRIDE. (Ich weiß nicht, ob es LSMs wie SELinux enthält, sollte es aber.) grawity vor 5 Jahren 1
existieren einige wie access (user, resurce), dh nicht für aufrufenden prozess? (sudo -u [-x / path / to / res] möchte nicht verwendet werden). magrif vor 5 Jahren 0
Wenn Sie dies in C tun und root haben, können Sie `setfsuid ()` und `initgroups ()` verwenden, bevor Sie die Berechtigungen überprüfen, und dann zurückkehren. Denken Sie jedoch daran, dass der Dateizugriff _can_ von verschiedenen Umgebungsfaktoren abhängt. Sogar "[-x path]" ruft tatsächlich access () hinter den Kulissen auf. grawity vor 5 Jahren 1