ZFS ACL for samb+ssh

lockdoc

Well-Known Member
Hi,

ich steh gerade vor dem Problem, dass ich eine Share einrichten muss, welche via samba und via ssh zugaenglich ist. Des weiteren sollen Dateien, welche erstellt werden die selben acl und chmods bekommen, gleich ob sie per ssh oder samba erstellt worden sind.


Unter /var/data liegen ZFS Partitionen.
Als beispiel die Partition /var/data/projects.

Code:
/var
  /data
    /projects
      /project-1


Unter projects lege ich (als root user), manuell den Ordner project-1 an.

Danach sollen folgende Bedingungen gelten:

1.)
  • In /var/data/projects duerfen nur user hinein-gehen (aber nicht schreiben), welche in der Gruppe projects oder www sind.
  • Das soll sowohl fuer ssh Zugriff als auch via Samba Zugriff so sein.

2.)
  • Fuer /var/data/projects/project-1 gilt das gleiche wie aus 1.)
  • in project-1 duerfen aber alle user der Gruppe projects zusaetlich rekursiv schreiben (sowohl samba als auch ssh) und zwar beim Erstellen immer mit folgenden standard unix permissions:
Code:
[B]chmod[/B]
 File:   660
 Folder: 770
[B]chown[/B]
 <user>:[B][COLOR="Blue"]projects[/COLOR][/B]

Jemand eine Idee wie ich die ZFS ACLs fuer /var/data/projects und /var/data/projects/project-1 setze? Insbesondere interessiert mich hier, welche ACL Eintraege ich wie und wo vererbe und wie ich den chmod vererbbar festlege.
 
Last edited:
Ok, nach langer Zeit hab ich das nun endlich geschafft. Wen die Loesung interesseiert:


Level-1

Code:
root> getfacl projects/
# file: projects/
# owner: root
# group: smb-projects
            owner@:rwxp--aARWcCos:------:allow
            group@:r-x---a-R-c--s:------:allow
         everyone@:------a-R-c--s:------:allow

Schrit 1: Alles entfernen

Code:
root> setfacl -b projects/
root> setfacl -x0 projects/
root> setfacl -x0 projects/

root> getfacl projects/
 # file: projects/
 # owner: root
 # group: smb-projects
         everyone@:------a-R-c--s:------:allow

Schritt 2: Everyone Default (vererbar) - darf nichts
d bedeutet, dass es auf alle Ordner vererbt werden soll.
f bedeutet, dass es auf alle Dateien vererbt werden soll.
Code:
root> setfacl -m everyone@::fd:allow projects/

Schritt 3: Owner Default (vererbar) - darf alles (Unterscheidung file|dir)
Code:
root> setfacl -a0   owner@:rwxpaARWcCos:d:allow projects/
root> setfacl -a1   owner@:rwpaARWcCos:f:allow  projects/

Schritt 4: Group Default (vererbar) - darf lesen (Unterscheidung file|dir)
Code:
root> setfacl -a2   group@:rxaRcs:d:allow projects/
root> setfacl -a3   group@:raRcs:f:allow projects/

Schritt 5: Group www darf lesen
Code:
root> setfacl -a4 g:www:rxaRcs:fd:allow projects/

Result
Code:
root> getfacl projects/
# file: projects/
# owner: root
# group: smb-projects
            owner@:rwxp--aARWcCos:-d----:allow
            owner@:rw-p--aARWcCos:f-----:allow
            group@:r-x---a-R-c--s:-d----:allow
            group@:r-----a-R-c--s:f-----:allow
         group:www:r-x---a-R-c--s:fd----:allow
         everyone@:--------------:fd----:allow


Level-2

Wenn ich Nun einen Projekt Ordner darin anlege, dann ist es im Prinzip gleich, bis darauf, dass die Gruppe die gleichen Rechte bekommt, wie der owner

Code:
root> mkdir project-1

Schrit 1: Alles entfernen

Code:
root> setfacl -b project-1/
root> setfacl -x0 project-1/
root> setfacl -x0 project-1/

root> getfacl project-1/
 # file: project-1/
 # owner: root
 # group: smb-projects
         everyone@:------a-R-c--s:------:allow

Schritt 2: Everyone Default (vererbar) - darf nichts
Code:
root> setfacl -m everyone@::fd:allow project-1/

Schritt 3: Owner Default (vererbar) - darf alles (Unterscheidung file|dir)
Code:
root> setfacl -a0   owner@:rwxpaARWcCos:d:allow project-1/
root> setfacl -a1   owner@:rwpaARWcCos:f:allow  project-1/

Schritt 4: Group Default (vererbar) - darf alles (Unterscheidung file|dir)
Code:
root> setfacl -a2   owner@:rwxpaARWcCos:d:allow project-1/
root> setfacl -a3   owner@:rwpaARWcCos:f:allow  project-1/

Schritt 5: Group www darf lesen
Code:
root> setfacl -a4 g:www:rxaRcs:fd:allow project-1/

Result
Code:
root> getfacl project-1/
# file: project-1/
# owner: root
# group: smb-projects
            owner@:rwxp--aARWcCos:-d----:allow
            owner@:rw-p--aARWcCos:f-----:allow
            group@:rwxp--aARWcCos:-d----:allow
            group@:rw-p--aARWcCos:f-----:allow
         group:www:r-x---a-R-c--s:fd----:allow
         everyone@:--------------:fd----:allow

Voila.
Jetzt werden alle Unterordner in Project-1 ueber samba oder ueber ssh wie folgt immer mit den gleichen Regeln angelegt (ohne beispielsweise die Gruppe in der smb.conf zu forcen und ohne create masks anzugeben):
Code:
chmod 770
<user>:smb-projects
Und alle Dateien
Code:
chmod 660
<user>:smb-projects



Eine Frage bleibt allerdings noch:

Ich habe eine Share mit ca. 2TB Daten und habe auf den Hauptfolder meine Berechtigungen angelegt, allerdings werden diese nicht vererbt, sondern nur gesetzt, sobald ich Daten hineinkopiere.

Gibt es eine moeglichkeit, dass ich diese Regeln auf vorhandene Dateien/Ordner anwenden kann ohne jedes Level/Sublevel/etc einzeln zu machen?
Und ohne wegkopieren und neu reinkopieren, da das zu lange dauern wuerde.

LG
 
Last edited:
Ok, man kann es mit dem Command nicht rekursiv setzen. Ein workaround, den ich gerade anwende fuer eine Share, wo der Owner Schreiben darf und die Gruppe lesen darf sieht wie folgt aus:
Code:
find . -type f -exec setfacl -b {} \;
find . -type f -exec setfacl -x0 {} \;
find . -type f -exec setfacl -x0 {} \;
find . -type f -exec setfacl -m everyone@::allow {} \;
find . -type f -exec setfacl -a0 owner@:rwpaARWcCos:allow {} \;
find . -type f -exec setfacl -a1 group@:rwpaARWcCos:allow {} \;


find . -type d -exec setfacl -b {} \;
find . -type d -exec setfacl -x0 {} \;
find . -type d -exec setfacl -x0 {} \;
find . -type d -exec setfacl -m everyone@::fd:allow {} \;
find . -type d -exec setfacl -a0 owner@:rwxpaARWcCos:d:allow {} \;
find . -type d -exec setfacl -a1 owner@:rwpaARWcCos:fi:allow {} \;
find . -type d -exec setfacl -a2 group@:rxaRcs:d:allow {} \;
find . -type d -exec setfacl -a3 group@:raRcs:fi:allow {} \;

Das dauert natuerlich ewig. Die frage hier, kann ich die ganzen Befehle in einen einzigen find command einbauen?
 
Kannst du nicht ein Script anlegen, welches du aufrufst?

setfacl_file.sh
Code:
#!/bin/sh
                                                                                                                 
/bin/setfacl -b -x0 -m everyone@::allow -a0 owner@:rwpaARWcCos:allow -a1 group@:rwpaARWcCos:allow $*

Dann mit
Code:
find . -type f -exec setfacl_file.sh {} \+

laufen lassen und dann noch mal ein Skript für die Verzeichnisse erstellen und find damit laufen lassen.
 
Ähm
Code:
find . -type f -exec setfacl -b \{} + -exec setfacl -x0 \{} + -exec setfacl -x0 \{} + -exec setfacl -m everyone@::allow \{} + -exec setfacl -a0 owner@:rwpaARWcCos:allow \{} + -exec setfacl -a1 group@:rwpaARWcCos:allow \{} +

Wenn der Befehl an mehreren Dateien arbeiten kann, verwende +, nicht ;. Das geht bei großen Mengen Dateien um ein vielfaches schneller.

Wichtig, das jeweilige exec wird nur ausgeführt, wenn das Vorherige mit 0 terminiert.
 
@laemodost

Danke, wusste gar nicht, dass man dass in einem Command schreiben kann.
Btw, du musst -x0 2x schreiben, damit wirklich alle nach dem -b geloescht werden.

@Kamikaze
Danke auch dir. Ich nutze jetzt den Langcommand mit den Pluszeichen


Edit:
Wo ist denn jetzt der Unterschied der Klammerung von
{} \ nach \{} ?
 
Wo ist denn jetzt der Unterschied der Klammerung von
{} \ nach \{} ?
Für ein + braucht man kein Shell-Escape. Ich weiß nicht, was du für eine Shell verwendest, aber für ein { in der Regel halt schon.

Edit: Dachte ich zumindest.
 
Back
Top