FreeNas: CIFS Shares mit verbesserter Rechteverwaltung

Ich habe mir vor einigen Tagen FreeNAS auf meinem MicroServer installiert, um regelmäßig Backups anfertigen zu können.

Da meine Familie den Backupspeicher mitnutzen möchte, und ich nicht jedem (Schreib-)Zugriff auf die Backups des Anderen geben möchte, musste eine gute Rechteverteilung her.

Das Setting

Auf dem NAS, in dem ein Soft-RAID1 aus 2x 3TB Platten steckt, gibt es einige Ordner:

  • Backup
  • Dokumente
  • Bilder
  • Shared

Da jedoch nicht jeder Nutzer des Netwerks sehr Technik-affin ist, und man nicht weiß, was sich für bösartige Software auf deren Rechnern tummelt, wollte ich die folgende Rechteverteilung umsetzen:

  • Backup: Jeder Benutzer bekommt einen eigenen Ordner, auf den nur er Zugriff hat.
  • Dokumente: Allgemeine, wichtige Dokumente, die bestimmte Personen lesen, und nur manche schreiben können.
  • Bilder: Alle dürfen lesen, aber nur ausgewählte schreiben.
  • Shared: Alle dürfen lesen + schreiben (Temporärer Ordner)

Ich legte also mehrere Benutzer an, um diesen später Zugriff auf die Freigaben zu erlauben. Zusätzlich erstellte ich noch die Gruppen:

  • read_documents
  • write_documents
  • read_pictures
  • write_pictures
  • read_backup

Die entsprechenden Benutzer wurden in diese Gruppen eingeteilt.
Nach ein wenig Probieren waren ACLs am Ende die beste Lösung.

1. Lösungsversuch: CIFS-Protokoll

Der erste Lösungsversuch bestand darin, direkt in den Freigabeeinstellungen (CIFS) in der „zusätzliche Konfigurationszeilen“-Textbox folgendes einzufügen (Für die Dokumenten-Freigabe):

valid users @read_documents, @write_documents
read list @read_documents
write list @write_documents

Nach einem Blick in das Logfile auf dem NAS gab es zu diesen zusätzlichen Zeilen, welche ich in einem Stack-Overflow-Thread gefunden hatte, nur den Kommentar, dass diese ignoriert würden.

Somit war es mir nicht möglich die Rechteverteilung direkt über das CIFS-Protokoll zu steuern.

2. Lösungsversuch: ACLs

Da das ZFS-Dateisystem ACLs (Access Control Lists) unterstützt, lässt sich damit die bekannte Linux-Rechteverwaltung aufbessern. Normalerweise kann man unter Linux nur drei Rechte

  • Lesen (r)
  • Schreiben (w)
  • Ausführen (x)

an drei verschiedene Gruppen

  • Benutzer (u)
  • Gruppe (g)
  • Andere (o)

vergeben. Da wir einem Ordner aber mehrere Gruppen vergeben möchten (z.B. read_pictures && write_pictures) müssen wir auf die ACLs zurückgreifen.

Um ACLs nutzen zu können, muss beim Mounten einer Partition die Option „acl“ angegeben werden. Um herauszufinden, welche Partitionen mit aktiviertem ACL gemountet sind, könnt ihr den folgenden Befehl nutzen:

[Basti@nas /mnt/V1_3TB/Pictures]$ mount | grep acl
V2_250GB on /mnt/V2_250GB (zfs, local, nfsv4acls)
V2_250GB/Home on /mnt/V2_250GB/Home (zfs, local, nfsv4acls)

Wie man erkennt, wurden meine Partitionen auf dem NAS mittels nfsv4acls eingebunden. Wir können also den Befehl „getfacl“ (nicht das „f“ überlesen) nutzen, um eine Übersicht aller gesetzten ACLs zu bekommen:

[Basti@nas /mnt/V1_3TB]$ getfacl Backup   
# file: Backup
# owner: root
# group: superuser
 group:read_backup:r-x-----------:------:allow
            owner@:rwxp--aARWcCos:------:allow
            group@:------a-R-c--s:------:allow
         everyone@:------a-R-c--s:------:allow

Der Ordner „Backup“ gehört dem Benutzer root, und ansonsten sind bis auf die Leserechte der „read_backup“ Gruppe keine weiteren Rechte vergeben. Der root-User darf die Dateien bearbeiten, löschen, sowie erstellen, wohingegen die Benutzer der Gruppe „read_backup“ nur die Daten lesen dürfen.
Den Backup-Ordner habe ich dann noch weiter aufgeteilt, sodass jeder Backup-würdige Nutzer einen eigenen Ordner bekommt:

[Basti@nas /mnt/V1_3TB]$ ls Backup/
total 67
drwx------+  6 root     superuser     6B Nov  1 20:44 .
drwxr-xr-x   5 root     wheel         5B Nov  1 20:42 ..
drwx------  32 Basti    Basti        34B Nov  1 22:23 Basti
drwx------   2 Gehaxelt Gehaxelt      2B Nov  1 20:44 Gehaxelt

Die Benutzer haben jeweils ein eigenes Verzeichnis, auf welches nur sie selbst Zugriff (Lese- / Schreiberechte) haben.

Weiter oben hatten wir für den Backup-Ordner festgelegt, dass nur Benutzer der Gruppe „read_backup“ auf den Ordner Zugriff haben dürfen. Wie setzt man diesen ACL Eintrag?

sudo setfacl -m g:read_backup:r-x----------:------:allow Backup

Schreib- und Leserechte aufteilen

Kommen wir noch kurz zu einem Beispiel, wo wir die Schreib- bzw. Leserechte komplett aufteilen. Dazu haben wir zwei Gruppen „read_pictures“ bzw. „write_pictures“ angelegt. Wie die Benennungen vermuten lassen, darf die eine Gruppe nur lesen, und die andere Gruppe darf zusätzlich schreiben.

Da wir erstmal keine Standardgruppen- bzw. Other-Zugriffe auf den Ordner haben möchten, führen wir ein

sudo chmod 700 Pictures

aus. Danach fügen wir die beiden ACL-Regeln hinzu:

sudo setfacl -m g:read_pictures:r-x----------:------:allow Pictures
sudo setfacl -m g:write_pictures:rwxp---------:------:allow Pictures

Das Flag „p“ muss gesetzt werden, damit die Gruppe Unterordner erstellen darf. Ansonsten können nämlich nur Dateien angelegt werden. Mittels „getfacl“ überprüfen wir das Setup:

[Basti@nas /mnt/V1_3TB]$ getfacl Pictures/
# file: Pictures/
# owner: root
# group: superuser
group:write_pictures:rwxp----------:------:allow
group:read_pictures:r-x-----------:------:allow
            owner@:rwxp--aARWcCos:------:allow
            group@:------a-R-c--s:------:allow
         everyone@:------a-R-c--s:------:allow

Nun kann der Ordner einfach im FreeNAS-Panel als Freigabe freigegeben werden, und nur die entsprechenden Benutzer der Gruppen können die entsprechenden Aktionen ausführen.

Das ungelöste Problem

Leider bleibt mir bisher noch ein Problem ungelöst. Wenn ein Benutzer in einem Share eine Datei anlegt, welche die Rechte 700 trägt, so hat keine der Gruppen Zugriff auf die Dateien, außer der Benutzer.
Da bei Nsf4ACLs die „default“-Rechte leider nicht mehr nutzbar sind, habe ich bisher noch keinen Weg gefunden den Dateien default-mäßig einen entsprechenden Satz an Rechten zu verpassen. Von daher muss bzw. sollte die Person mit den Schreibrechten die Dateirechte auf 707 (ja ich weiß -.-) setzen. So greifen die Other-Rechte für die Gruppenmitglieder, die sowieso nur lesen dürfen. Andere Personen können auf die Dateien nicht zugreifen, da sie nicht in den per ACL beschränkten Ordner kommen.

//Sollte hier jemand eine passende/gute Idee einfallen, dann würde ich mich über ein Kommentar freuen. Die jetzige Lösung macht mich nicht wirklich glücklich :(

Freigabe einbinden

Um die Freigaben einfach einzubinden, empfiehlt sich folgende Vorgehensweise:

Zunächst installiert man sich das Tool „cifs-utils“, welches zumindest so im Arch-Linux Repository gefunden werden kann.
Danach legt man sich in seinem Homeverzeichnis eine Datei an, welche .smblogin heißt und füllt diese mit dem Inhalt:

username=Foobar
password=FooPW!

Die Rechte der Datei sollte man unbedingt auf 600 setzen:

chmod 600 .smblogin

Danach lässt sich das mount relativ einfach durchführen:

sudo mount -t cifs //nas.local/Temp /network/Temp -o users,credentials=/home/$USER/.smblogin,workgroup=WORKGROUP

Falls man diesen Befehl nicht immer runterhacken möchte, dann kann man sich einen Eintrag in der /etc/fstab anlegen:

#Shares from NAS
//nas.local/Temp /network/Temp cifs noauto,users,credentials=/home/gehaxelt/.smblogin 0 0

Danach ruft man „mount“ schöner auf:

mount /network/Temp

Fazit

Zumindest mit den ACLs lässt sich einfach eine etwas komplexere Rechteverwaltung umsetzen, sodass bestimmte Rechte nur an bestimmte Personen vergeben werden.

~Sebastian