In diesem Kapitel wird erläutert, wie mit der delegierten Administration Benutzern ohne ausreichende Zugriffsrechte ermöglicht werden kann, ZFS-Administrationsaufgaben zu erledigen.
Dieses Leistungsmerkmal dient zum Verteilen fein abgestimmter Zugriffsrechte an bestimmte Benutzer, Gruppen oder an „everyone“. Es werden zwei Arten der delegierten Zugriffsrechte unterstützt:
Einzelne Zugriffsrechte wie create, destroy, mount, snapshot usw. können ausdrücklich angegeben werden.
Auch können Gruppen von Zugriffsrechten, so genannte Zugriffsrechtsätze, definiert werden. Ein Zugriffsrechtsatz kann zu einem späteren Zeitpunkt aktualisiert werden. Die daraus resultierenden Änderungen wirken sich automatisch auf alle Benutzer des Satzes aus. Zugriffsrechtsätze beginnen mit dem Zeichen @ und sind auf eine Länge von 64 Zeichen begrenzt. Für die auf das Zeichen @ folgenden übrigen Zeichen im Namen gelten dieselben Einschränkungen wie für normale ZFS-Dateisystemnamen.
Die delegierte ZFS-Administration bietet ähnliche Möglichkeiten wie das RBAC-Sicherheitsmodell. Diese Funktion bietet für die Verwaltung von ZFS-Speicher-Pools und -Dateisystemen folgende Vorteile:
Bei einer Migration des ZFS-Speicher-Pools werden seine Zugriffsberechtigungen mit ihm weitergegeben.
Durch dynamische Vererbung kann gesteuert werden, wie die Zugriffsrechte durch die Dateisysteme weitergegeben werden.
Möglich ist eine Konfiguration, bei der nur der Ersteller eines Dateisystems dieses wieder löschen kann.
Zugriffsrechte können gezielt an bestimmte Dateisysteme verteilt werden. Neu erstellte Dateisysteme können Zugriffsrechte automatisch übernehmen.
Es wird eine einfache NFS-Administration ermöglicht. So könnte beispielsweise ein Benutzer mit ausdrücklichen Zugriffsrechten über NFS einen Snapshot im entsprechenden .zfs/snapshot -Verzeichnis erstellen.
Die delegierte Administration bietet sich für die Verteilung von ZFS-Aufgaben an. Informationen zum Einsatz von RBAC für allgemeine Solaris-Administrationsaufgaben finden Sie in Teil III, Roles, Rights Profiles, and Privileges in System Administration Guide: Security Services.
Die Funktionen der delegierten Administration können durch Setzen der Pool-Eigenschaft delegation gesteuert werden. Beispiel:
# zpool get delegation users NAME PROPERTY VALUE SOURCE users delegation on default # zpool set delegation=off users # zpool get delegation users NAME PROPERTY VALUE SOURCE users delegation off local |
Standardmäßig ist die Eigenschaft delegation aktiviert.
Mit dem Befehl zfs allow können Sie Nicht-Root-Benutzern Zugriffsrechte für ZFS-Datasets gewähren. Dafür stehen folgende Möglichkeiten zur Verfügung:
Einzelne Zugriffsrechte können einem Benutzer, einer Gruppe oder global gewährt werden.
Gruppen von Einzelzugriffsrechten können in Form von Zugriffsrechtsätzen ebenfalls an Benutzer, Gruppen oder global vergeben werden.
Die Gewährung von Zugriffsrechten ist sowohl lokal für das jeweilige Dataset als auch allgemein an alle untergeordneten Objekte des aktuellen Datasets möglich.
In der folgenden Tabelle finden Sie eine Beschreibung der delegierbaren Vorgänge und aller abhängigen Zugriffsrechte, die zum Durchführen des delegierten Vorgangs erforderlich sind.
Zugriffsrecht (Unterbefehl) |
Beschreibung |
Abhängigkeiten |
---|---|---|
allow |
Die Fähigkeit, eigene Zugriffsrechte an andere Benutzer weiterzugeben. |
Das Zugriffsrecht, das gewährt werden soll, muss ebenfalls vorhanden sein. |
clone |
Die Fähigkeit, beliebige Snapshots des Datasets zu klonen. |
Die Fähigkeiten create und mount müssen im ursprünglichen Dateisystem vorhanden sein. |
create |
Die Fähigkeit, untergeordnete Datasets zu erstellen. |
Die Fähigkeit mount muss ebenfalls vorhanden sein. |
destroy |
Die Fähigkeit, ein Dataset zu löschen. |
Die Fähigkeit mount muss ebenfalls vorhanden sein. |
Einhängen |
Die Fähigkeit, ein Dataset ein- und auszuhängen und Geräteverknüpfungen für Volumes zu erstellen oder zu löschen. | |
promote |
Die Fähigkeit, einen Klon zu einem Dataset zu machen. |
Die Fähigkeiten mount und promote müssen im ursprünglichen Dateisystem vorhanden sein. |
receive |
Die Fähigkeit, mit dem Befehl zfs receive untergeordnete Dateisysteme zu erstellen. |
Die Fähigkeiten mount und create müssen ebenfalls vorhanden sein. |
rename |
Die Fähigkeit, ein Dataset umzubenennen. |
Die Fähigkeiten create und mount müssen im neuen übergeordneten Objekt vorhanden sein. |
rollback |
Die Fähigkeit, frühere Zustände aus einem Snapshot wiederherzustellen. | |
send |
Die Fähigkeit, einen Snapshot-Datenstrom zu senden. | |
share |
Die Fähigkeit, ein Dataset freizugeben und zu sperren. | |
snapshot |
Die Fähigkeit, Snapshots von Datasets herzustellen. |
Sie können die folgenden Zugriffsrechte erteilen, wobei diese auf Zugriff, Lesezugriff oder Bearbeitungszugriff beschränkt sein können:
groupquota
groupused
userprop
userquota
userused
Darüber hinaus können Nicht-Root-Benutzern folgende ZFS-Eigenschaften delegiert werden.
aclinherit
aclmode
atime
canmount
casesensitivity
checksum
compression
copies
devices
exec
mountpoint
nbmand
normalization
primarycache
quota
readonly
recordsize
refreservation
reservation
secondarycache
setuid
shareiscsi
sharenfs
sharesmb
snapdir
utf8only
version
volblocksize
volsize
vscan
xattr
zoned
Einige dieser Eigenschaften können nur bei der Erstellung des Datasets gesetzt werden. Eine Beschreibung dieser Eigenschaften finden Sie unter ZFS-Eigenschaften.
Die Syntax für zfs allow lautet:
zfs allow -[ldugecs] everyone|user|group[,...] perm|@setname,...] filesystem| volume |
Die folgende zfs allow-Syntax (fett gedruckt) gibt an, wem die Zugriffsrechte übertragen werden:
zfs allow [-uge]|user|group|everyone [,...] filesystem | volume |
Mehrere Entitäten können durch Komma getrennt als Liste angegeben werden. Wenn keine -uge-Option angegeben ist, werden die Argumente der Reihenfolge nach als das Schlüsselwort everyone, dann als Benutzername und schließlich als Gruppenname interpretiert. Um einen Benutzer oder eine Gruppe mit dem Namen „everyone “anzugeben, verwenden Sie die Option -u bzw. -g. Mit der Option -g geben Sie eine Gruppe mit demselben Namen eines Benutzers an. Die Option -c gewährt „Create-time“-Zugriffsrechte.
Die folgende zfs allow-Syntax (fett gedruckt) veranschaulicht, wie Zugriffsrechte und Zugriffsrechtsätze angegeben werden:
zfs allow [-s] ... perm|@setname [,...] filesystem | volume |
Mehrere Zugriffsrechte können durch Komma getrennt als Liste angegeben werden. Die Namen der Zugriffsrechte sind mit den ZFS-Unterbefehlen und -Eigenschaften identisch. Weitere Informationen finden Sie im vorherigen Abschnitt.
Mehrere Zugriffsrechte lassen sich in Zugriffsrechtsätzen zusammenfassen. Sie werden durch die Option -s gekennzeichnet. Zugriffsrechtsätze können von anderen zfs allow-Befehlen für das angegebene Dateisystem und dessen untergeordnete Objekte verwendet werden. Zugriffsrechtsätze werden dynamisch ausgewertet, sodass Änderungen an einem Satz unverzüglich aktualisiert werden. Für Zugriffsrechtsätze gelten dieselben Benennungsregeln wie für ZFS-Dateisysteme, wobei der Name allerdings mit dem Zeichen @ beginnen muss und nicht mehr als 64 Zeichen lang sein darf.
Die folgende zfs allow-Syntax (fett gedruckt) gibt an, wie die Zugriffsrechte übertragen werden:
zfs allow [-ld] ... ... filesystem | volume |
Die Option -l gibt an, dass das Zugriffsrecht für das angegebene Dataset, nicht aber für dessen untergeordnete Objekte gewährt wird, es sei denn, es wurde auch die Option -d angegeben. Die Option -d bedeutet, dass das Zugriffsrecht nicht für dieses Dataset, sondern für dessen untergeordnete Objekte gewährt wird, es sei denn, es wurde auch die Option -l angegeben. Wenn keine der Optionen -ld angegeben wird, gelten die Zugriffsrechte für das Dateisystem bzw. Volume und alle untergeordneten Objekte.
Mit dem Befehl zfs unallow können Sie zuvor erteilte Zugriffsrechte wieder löschen.
Gehen wir beispielsweise davon aus, dass Sie die Zugriffsrechte create, destroy, mount und snapshot wie folgt delegiert haben:
# zfs allow cindys create,destroy,mount,snapshot tank/cindys # zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount,snapshot ------------------------------------------------------------- |
Zum Entziehen dieser Zugriffsrechte müssen Sie die folgende Syntax verwenden:
# zfs unallow cindys tank/cindys # zfs allow tank/cindys |
In diesem Abschnitt finden Sie Beispiele zum Delegieren und Anzeigen von ZFS-Zugriffsrechten.
Wenn Sie einem einzelnen Benutzer die Zugriffsrechte create und mount übertragen möchten, müssen Sie sich vergewissern, dass dieser über die erforderlichen Zugriffsrechte für den zugrunde liegenden Einhängepunkt verfügt.
Um beispielsweise dem Benutzer marks die Zugriffsrechte create und mount für tank zu erteilen, setzen Sie zuerst diese Zugriffsrechte:
# chmod A+user:marks:add_subdirectory:fd:allow /tank |
Anschließend gewähren Sie mit dem Befehl zfs allow die Zugriffsrechte create , destroy und mount. Beispiel:
# zfs allow marks create,destroy,mount tank |
Jetzt kann der Benutzer marks unter tank eigene Dateisysteme anlegen. Beispiel:
# su marks marks$ zfs create tank/marks marks$ ^D # su lp $ zfs create tank/lp cannot create 'tank/lp': permission denied |
Das folgende Beispiel veranschaulicht, wie ein Dateisystem eingerichtet wird, damit jedes Mitglied der Gruppe staff Dateisysteme unter tank erstellen und einhängen sowie eigene Dateisysteme löschen kann. Die Gruppenmitglieder von staff können jedoch nicht die Dateisysteme anderer Gruppenmitglieder löschen.
# zfs allow staff create,mount tank # zfs allow -c create,destroy tank # zfs allow tank ------------------------------------------------------------- Create time permissions on (tank) create,destroy Local+Descendent permissions on (tank) group staff create,mount ------------------------------------------------------------- # su cindys cindys% zfs create tank/cindys cindys% exit # su marks marks% zfs create tank/marks/data marks% exit cindys% zfs destroy tank/marks/data cannot destroy 'tank/mark': permission denied |
Achten Sie darauf, den Benutzern die Zugriffsrechte auf der richtigen Ebene der Dateisystemhierarchie zuweisen. So werden beispielsweise dem Benutzer marks die Zugriffsrechte create, destroy und mount für das lokale und für die untergeordneten Dateisysteme gewährt. Benutzer marks erhält lokale Zugriffsrechte zum Erstellen von Snapshots des Dateisystems tank, nicht aber des eigenen Dateisystems. Ihm wurde das Zugriffsrecht snapshot also nicht auf der richtigen Ebene der Dateisystemhierarchie übertragen.
# zfs allow -l marks snapshot tank # zfs allow tank ------------------------------------------------------------- Local permissions on (tank) user marks snapshot Local+Descendent permissions on (tank) user marks create,destroy,mount ------------------------------------------------------------- # su marks marks$ zfs snapshot tank/@snap1 marks$ zfs snapshot tank/marks@snap1 cannot create snapshot 'mark/marks@snap1': permission denied |
Um Benutzer marks Zugriffsrechte für die untergeordnete Ebene zu gewähren, verwenden Sie den Befehl zfs allow mit der Option - d. Beispiel:
# zfs unallow -l marks snapshot tank # zfs allow -d marks snapshot tank # zfs allow tank ------------------------------------------------------------- Descendent permissions on (tank) user marks snapshot Local+Descendent permissions on (tank) user marks create,destroy,mount ------------------------------------------------------------- # su marks $ zfs snapshot tank@snap2 cannot create snapshot 'tank@snap2': permission denied $ zfs snapshot tank/marks@snappy |
Jetzt kann der Benutzer marks nur Snapshots unterhalb der Ebene tank erstellen.
Benutzern oder Gruppen können spezifische Zugriffsrechte gewährt werden. So werden beispielsweise mit dem folgenden zfs allow-Befehl spezifische Zugriffsrechte an die Gruppe staff übertragen. Darüber hinaus gelten die Zugriffsrechte destroy und snapshot, sobaldtank-Dateisysteme erstellt werden.
# zfs allow staff create,mount tank # zfs allow -c destroy,snapshot tank # zfs allow tank ------------------------------------------------------------- Create time permissions on (tank) destroy,snapshot Local+Descendent permissions on (tank) group staff create,mount ------------------------------------------------------------- |
Da Benutzer marks ein Mitglied der Gruppe staff ist, kann er in tank Dateisysteme erstellen. Zusätzlich kann Benutzer marks Snapshots von tank/marks2 erstellen, da er über die spezifischen Zugriffsrechte verfügt. Beispiel:
# su marks $ zfs create tank/marks2 $ zfs allow tank/marks2 ------------------------------------------------------------- Local permissions on (tank/marks2) user marks destroy,snapshot ------------------------------------------------------------- Create time permissions on (tank) destroy,snapshot Local+Descendent permissions on (tank) group staff create everyone mount ------------------------------------------------------------- |
Er kann jedoch keine Snapshots in tank/marks erstellen, da ihm die Zugriffsrechte hierfür fehlen. Beispiel:
$ zfs snapshot tank/marks2@snap1 $ zfs snapshot tank/marks@snappp cannot create snapshot 'tank/marks@snappp': permission denied |
Wenn Sie in Ihrem home-Verzeichnis über die Berechtigung create verfügen, können Sie eigene Snapshot-Verzeichnisse erstellen. Dies kann sich bei Dateisystemen als hilfreich erweisen, die per NFS eingehängt werden. Beispiel:
$ cd /tank/marks2 $ ls $ cd .zfs $ ls snapshot $ cd snapshot $ ls -l total 3 drwxr-xr-x 2 marks staff 2 Dec 15 13:53 snap1 $ pwd /tank/marks2/.zfs/snapshot $ mkdir snap2 $ zfs list NAME USED AVAIL REFER MOUNTPOINT tank 264K 33.2G 33.5K /tank tank/marks 24.5K 33.2G 24.5K /tank/marks tank/marks2 46K 33.2G 24.5K /tank/marks2 tank/marks2@snap1 21.5K - 24.5K - tank/marks2@snap2 0 - 24.5K - $ ls snap1 snap2 $ rmdir snap2 $ ls snap1 |
Das folgende Beispiel zeigt, wie der Zugriffsrechtsatz @myset erstellt wird und dieser und das Zugriffsrecht rename an die Gruppe staff für das Dateisystem tank übertragen werden. Der Benutzer cindys, Mitglied der Gruppe staff, verfügt über die Berechtigung zum Erstellen von Dateisystemen in tank. Benutzer lp verfügt jedoch nicht über die Berechtigung zum Erstellen von Dateisystemen in tank.
# zfs allow -s @myset create,destroy,mount,snapshot,promote,clone,readonly tank # zfs allow tank ------------------------------------------------------------- Permission sets on (tank) @myset clone,create,destroy,mount,promote,readonly,snapshot ------------------------------------------------------------- # zfs allow staff @myset,rename tank # zfs allow tank ------------------------------------------------------------- Permission sets on (tank) @myset clone,create,destroy,mount,promote,readonly,snapshot Local+Descendent permissions on (tank) group staff @myset,rename # chmod A+group:staff:add_subdirectory:fd:allow tank # su cindys cindys% zfs create tank/data Cindys% zfs allow tank ------------------------------------------------------------- Permission sets on (tank) @myset clone,create,destroy,mount,promote,readonly,snapshot Local+Descendent permissions on (tank) group staff @myset,rename ------------------------------------------------------------- cindys% ls -l /tank total 15 drwxr-xr-x 2 cindys staff 2 Aug 8 14:10 data cindys% exit # su lp $ zfs create tank/lp cannot create 'tank/lp': permission denied |
Mit dem folgenden Befehl werden die Zugriffsrechte angezeigt:
# zfs allow dataset |
Dieser Befehl gibt die für das jeweilige Dataset gesetzten oder gewährten Zugriffsrechte aus. Die Ausgabe enthält folgende Komponenten:
Zugriffsrechtsätze
Spezifische Zugriffsrechte oder Create-time-Zugriffsrechte
Lokales Dataset
Lokale und untergeordnete Datasets
Nur untergeordnete Datasets
Die folgende Ausgabe in diesem Beispiel bedeutet, dass der Benutzer cindys berechtigt ist, im Dateisystem tank/cindys Objekte zu erstellen, zu löschen, einzuhängen und Snapshots zu erstellen.
# zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount,snapshot |
Die Ausgabe in diesem Beispiel zeigt die folgenden Zugriffsrechte für die Dateisysteme pool/fred und pool auf.
Für das Dateisystem pool/fred:
Es sind zwei Zugriffsrechtsätze definiert:
@eng (create, destroy, snapshot, mount, clone, promote, rename)
@simple (create, mount)
Die Create-time-Zugriffsrechte werden für den Zugriffsrechtsatz @eng und die Eigenschaft mountpoint gesetzt. „Create-time“ bedeutet, dass der Zugriffsrechtsatz @eng und die Eigenschaft mountpoint nach der Erstellung eines Datasets gewährt werden.
Dem Benutzer tom wird der Zugriffsrechtsatz @eng und dem Benutzer joe werden die Zugriffsrechte create, destroy und mount für lokale Dateisysteme gewährt.
Benutzer fred erhält den Zugriffsrechtsatz @basic sowie die Zugriffsrechte share und rename für das lokale und die untergeordneten Dateisysteme.
Dem Benutzer barney und der Gruppe staff wird der Zugriffsrechtsatz @basic ausschließlich für untergeordnete Dateisysteme übertragen.
Für das Dateisystem pool:
Der Zugriffsrechtsatz @simple (create, destroy, mount) ist definiert.
Die Gruppe staff erhält den Zugriffsrechtsatz @simple für das lokale Dateisystem.
Sehen Sie hier die Ausgabe für dieses Beispiel:
$ zfs allow pool/fred ------------------------------------------------------------------------------ Permission sets on (pool/fred) @eng create,destroy,snapshot,mount,clone,promote,rename @simple create,mount Create time permissions on (pool/fred) @eng,mountpoint Local permissions on (pool/fred) user tom @eng user joe create,destroy,mount Local+Descendent permissions on (pool/fred) user fred @basic,share,rename Descendent permissions on (pool/fred) user barney @basic group staff @basic ------------------------------------------------------------------------------ Permission sets on (pool) @simple create,destroy,mount Local permissions on (pool) group staff @simple ------------------------------------------------------------------------------ |
Mit dem Befehl zfs unallow lassen sich übertragene Zugriffsrechte wieder löschen. Beispielsweise verfügt Benutzer cindys über die Zugriffsrechte zum Erstellen, Löschen, Einhängen und Anfertigen von Snapshots im Dateisystem tank/cindys.
# zfs allow cindys create,destroy,mount,snapshot tank/cindys # zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount,snapshot ------------------------------------------------------------- |
Mit der folgenden zfs unallow-Syntax entziehen Sie das Zugriffsrecht von Benutzer cindys zum Erstellen von Snapshots für das Dateisystem tank/cindys:
# zfs unallow cindys snapshot tank/cindys # zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount ------------------------------------------------------------- cindys% zfs create tank/cindys/data cindys% zfs snapshot tank/cindys@today cannot create snapshot 'tank/cindys@today': permission denied |
Betrachten wir als weiteres Beispiel die nachfolgenden Zugriffsrechte des Benutzers marks in tank/marks:
# zfs allow tank/marks ------------------------------------------------------------- Local+Descendent permissions on (tank/marks) user marks create,destroy,mount ------------------------------------------------------------- |
In diesem Beispiel werden mit der folgenden zfs unallow-Syntax alle Zugriffsrechte für Benutzer marks von tank/marks gelöscht:
# zfs unallow marks tank/marks |
Die folgende zfs unallow-Syntax löscht einen Zugriffsrechtsatz für das Dateisystem tank.
# zfs allow tank ------------------------------------------------------------- Permission sets on (tank) @myset clone,create,destroy,mount,promote,readonly,snapshot Create time permissions on (tank) create,destroy,mount Local+Descendent permissions on (tank) group staff create,mount ------------------------------------------------------------- # zfs unallow -s @myset tank $ zfs allow tank ------------------------------------------------------------- Create time permissions on (tank) create,destroy,mount Local+Descendent permissions on (tank) group staff create,mount ------------------------------------------------------------- |