Ein Workaround mit inotifywait unter Linux:

Ein Workaround mit inotifywait unter Linux:

Auf einer Samba-Freigabe sollte ein TO-Ordner vorhanden sein, in dem jeder Dateien erstellen, bearbeiten und löschen darf. Ein Benutzer sollte jedoch nicht die Dateien lesen dürfen, die andere Benutzer erstellt haben.

Die Grundidee besteht darin, einen Ordner zu haben, in dem die Studenten Tests einreichen können, ohne die Texte anderer Klassenkameraden lesen zu müssen. Es sollte keine unnötigen Einschränkungen geben. Studenten sollte es erlaubt sein, Verzeichnisse zu erstellen und ihre Dateien zu kopieren. Sie sollten nur voneinander getrennt sein und nicht die Dateien anderer lesen/löschen.

Unter Windows hätte ein solcher Ordner eine ACL ähnlich der folgenden:

$ icacls TO
.\TO Everybody: (CI)(Rc,S,RD,WD,AD,X)

Ein Lehrer/Eigentümer verfügt über Änderungsberechtigungen für den besagten Ordner, um alle Daten zu erfassen.

Wie kann ich etwas Ähnliches unter Linux mit ACLs (setfacl, getfacl) oder, wenn überhaupt möglich, ohne sie replizieren, indem ich nur Standard-Linux-Berechtigungen verwende?

Antwort1

Ich werde meine Frage selbst beantworten. Wenn jemand diese Antwort verbessern kann oder Fragen hat, dann nur zu. Dieses spezielle Problem beschäftigt mich schon seit einiger Zeit.

Meine Frage scheint mit POSIX-ACLs nicht möglich zu sein, und zwar aus folgendem Grund: Group+rx-Berechtigung nur in Verzeichnissen mit ACLda ACLs bei der Anwendung geerbter Rechte nicht zwischen Dateien und Ordnern unterscheiden können.

Bei genauerer Betrachtung wurden zwei mögliche Problemumgehungen erwähnt:

  • inotify (das ich hier verwendet habe)
  • bindfs (wenn das jemand versucht, bitte posten)

Ein Workaround mit inotifywait unter Linux:

Ordnerberechtigungen

Führen Sie als Root die folgenden Schritte aus:

Erstellen Sie den freizugebenden Ordner:

mkdir fld

Machen Sie die Gruppe der obersten Ordner zur Lehrergruppe. Die Gruppe sollte existieren und die primäre Lehrergruppe sein.

chown :teach fld

Lassen Sie die Gruppe von allen Dateien/Unterordnern erben. Das bedeutet, dass der Lehrer lesen/schreiben/löschen können sollte

chmod g+s fld 

Erlauben Sie nicht das Überschreiben/Löschen von Dateien durch andere (wie /tmp-Berechtigungen).

chmod +t fld

Jetzt werden ACLs so eingestellt, dass sie für alle in diesem Ordner erstellten Dateien/Unterordner minimale Rechte erben:

setfacl -m u::rwx,g::rwx,o::rwx,d:u::rwx,d:o::--- fld

Der oberste Ordner, der alle von den Studierenden erstellten Unterordner/Dateien enthalten sollte, sollte jetzt so aussehen:

getfacl fld

# file: fld
# owner: root
# group: teach
# flags: -st
user::rwx
group::rwx
other::rwx
default:user::rwx
default:group::rwx
default:other::---

Allein diese Berechtigungen haben einen gewissen Wert. Sollte das unten folgende Skript nicht ausgeführt werden, erlauben die obigen Ordnerberechtigungen den Studierenden, ihre eigenen Dateien zu erstellen/lesen/bearbeiten/löschen und nichts dergleichen mit den Dateien anderer zu tun. Der Ordner sollte sich normal verhalten, d. h. er darf alle Dateien anzeigen/auflisten. Die einzige Einschränkung besteht darin, dass dies nur direkt in diesem Ordner funktioniert, nicht in Unterordnern. Dies sollte für einfache Übermittlungen mehrerer Dateien durch Studierende ausreichen.

Für alle von Studierenden angelegten Unterordner gilt: Studierende werden unter „Andere“ zusammengefasst, wichtig ist also:

default:other::---

Das bedeutet, dass „anderen“ keine Rechte an Dateien/Ordnern in dieser Freigabe erteilt werden. Die Idee ist, dass in „anderen“ nur Ordner RWX erhalten sollen, Dateien müssen ihre Berechtigungen nicht ändern.

inotify-Skript: submission_folder.sh

Dieses Skript sollte von root ausgeführt werden. Das einzige Argument ist dieser Ordner, der gerade oben erstellt wurde. Ein Beispiel für die Ausführung:

submission_folder.sh /path/to/fld

Die Datei ist ausführbar und hat diesen Inhalt:

#!/bin/bash +x
dir=$1

if [[ -z $dir ]];
then
    echo "Enter path as argument"
    exit
fi
echo "WATCHING: $dir"

# run forever
while true; do

inotifywait -r -q --format %w%f -e create "$dir" | while read f; do 
    echo "- CREATED: $f"
    if [[ -d "${f}" ]] ; then
        echo "FOLDER: ${f}, adding read,write,execute permission"
        chmod o+rwx "${f}"
        stat "${f}"
    else
        echo "FILE: $f, doing noting"
    fi
done

done

Solange das Skript ausgeführt wird, aktualisiert es alle Unterordner, sodass sie rwx erhalten und somit durchlaufen und aufgelistet werden können.

Vorbehalte:

  • Dies wurde lokal getestet, noch nicht in einer Samba-Freigabe. Ich werde dies später tun, aber es sollte funktionieren, da ich beabsichtige, keine Einschränkungen in der Freigabe aufzuerlegen und alles vom Dateisystem erledigen zu lassen

  • Sollten Ordner mit mkdir -p Ordner/Unterordner erstellt werden und beide noch nicht existieren, dann werden sie so schnell erstellt, dass inotify nicht einzeln benachrichtigt wird und die Ordner daher nicht in rwx ändert. Für diese Ordner ist es dann so, als ob das Skript nicht laufen würde. Das ist an sich kein Problem, da die Studierenden weniger Rechte haben und kein Schummeln möglich sein sollte.

Persönliche Notizen

Ich habe einipython-notebook(Bash-Notebook, kein Python-Notebook) mit einigen Tests und Hilfsfunktionen, falls jemand Interesse hat. Es ist jedoch teilweise deutsch, da ich zu faul war, alles wieder auf Englisch zu machen.

verwandte Informationen