Este capítulo describe la forma de utilizar la administración delegada para permitir que los usuarios sin privilegios puedan efectuar tareas de administración de ZFS.
Esta función permite distribuir permisos más concretos a determinados usuarios, grupos o a todo el mundo. Se permiten dos tipos de permisos delegados:
Se pueden especificar permisos concretos a determinadas personas, por ejemplo crear, destruir, montar, crear instantánea, etcétera.
Se pueden definir grupos de permisos denominadosconjuntos de permisos. Un conjunto de permisos se puede actualizar posteriormente y todos los usuarios de dicho conjunto adquieren ese cambio de forma automática. Los conjuntos de permisos comienzan con el carácter @ y tienen un límite de 64 caracteres. Después del carácter @, los demás caracteres del nombre del conjunto están sujetos a las mismas restricciones que los nombres de sistemas de archivos ZFS normales.
La administración delegada de ZFS proporciona funciones parecidas al modelo de seguridad RBAC. Esta función aporta las ventajas siguientes en la administración de agrupaciones de almacenamiento y sistemas de archivos ZFS:
Si se migra la agrupación, se mantienen los permisos en la agrupación de almacenamiento ZFS.
Proporciona herencia dinámica para poder controlar cómo se propagan los permisos por los sistemas de archivos.
Se puede configurar para que sólo el creador de un sistema de archivos pueda destruir el sistema de archivos.
Se pueden distribuir permisos en determinados sistemas de archivos. Los sistemas de archivos creados pueden designar permisos automáticamente.
Proporciona administración NFS simple. Por ejemplo, un usuario que cuenta con permisos explícitos puede crear una instantánea por NFS en el correspondiente directorio .zfs/snapshot.
A la hora de distribuir tareas de ZFS, plantéese la posibilidad de utilizar la administración delegada. Si desea información sobre el uso de RBAC para llevar a cabo tareas generales de administración de Solaris, consulte la Parte III, Roles, Rights Profiles, and Privileges de System Administration Guide: Security Services.
Puede controlar las funciones de administración delegada mediante la propiedad delegation de la agrupación. Por ejemplo:
# 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 |
De forma predeterminada se activa la propiedad delegation.
Utilice el comando zfs allow para conceder permisos en conjuntos de datos ZFS a usuarios que no sean root de las maneras siguientes:
Los permisos individuales se pueden conceder a un grupo, un usuario o a todo el mundo.
Los grupos de permisos individuales se pueden conceder como conjunto de permisos a un grupo, un usuario o a todo el mundo.
Los permisos se pueden conceder localmente sólo al conjunto de datos actual o a todos los elementos descendientes de dicho conjunto de datos.
En la tabla siguiente figuran las operaciones que se pueden delegar y los permisos dependientes que se necesitan para efectuar las operaciones delegadas.
Permiso (subcomando) |
Descripción |
Dependencias |
---|---|---|
allow |
Capacidad para conceder a otro usuario los permisos que tiene uno mismo. |
También debe tener el permiso que se está concediendo. |
clone |
Capacidad para clonar cualquier instantánea del conjunto de datos. |
También se debe disponer de las capacidades create y mount en el sistema de archivos original. |
create |
Capacidad para crear conjuntos de archivos descendientes. |
También se debe disponer de la capacidad mount. |
destroy |
Capacidad para destruir un conjunto de datos. |
También se debe disponer de la capacidad mount. |
mount |
Capacidad para montar y desmontar un conjunto de datos, así como para crear y destruir vínculos de dispositivos de volumen. | |
promote |
Capacidad para promover un clon a un conjunto de datos. |
También se debe disponer de las capacidades mount y promote en el sistema de archivos original. |
receive |
Capacidad para crear sistemas de archivos descendientes mediante el comando zfs receive. |
También se debe disponer de las capacidades mount y create. |
rename |
Capacidad para cambiar el nombre a un conjunto de datos. |
También se debe disponer de las capacidades create y mount en el nuevo elemento principal. |
rollback |
Capacidad para invertir una instantánea. | |
send |
Capacidad para enviar un flujo de instantáneas. | |
share |
Capacidad para compartir y anular la compartición de un conjunto de datos. | |
snapshot |
Capacidad para obtener una instantánea de un conjunto de datos. |
Puede delegar el siguiente conjunto de permisos, pero el permiso puede estar limitado a acceso, lectura o cambio:
groupquota
groupused
userprop
userquota
userused
Además, puede delegar las siguientes propiedades de ZFS a usuarios que no sean root:
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
Algunas de estas propiedades sólo se pueden establecer al crear el conjunto de datos. Para obtener una descripción de estas propiedades, consulte Introducción a las propiedades de ZFS.
La sintaxis zfs allow es la siguiente:
zfs allow -[ldugecs] everyone|user|group[,...] perm|@setname,...] filesystem| volume |
La siguiente sintaxis de zfs allow (en negrita) identifica a quién se delegan los permisos:
zfs allow [-uge]|user|group|everyone [,...] filesystem | volume |
Se pueden especificar varias entidades en una lista separada por comas. Si no se especifican opciones de -uge, el argumento se interpreta de forma preferente como la palabra clave everyone, después como nombre de usuario y, en último lugar, como grupo de nombre. Para especificar un usuario o grupo denominado “everyone”, utilice la opción -u o -g. Para especificar un grupo con el mismo nombre que un usuario, utilice la opción -g. La opción -c concede permisos de create-time.
La siguiente sintaxis de zfs allow (en negrita) identifica cómo se especifican los permisos y conjuntos de permisos:
zfs allow [-s] ... perm|@setname [,...] filesystem | volume |
Se pueden especificar varios permisos en una lista separada por comas. Los nombres de permisos son los mismos que las propiedades y los subcomandos de ZFS. Para obtener más información, consulte la sección anterior.
Los permisos se pueden agregar a conjuntos de permisos y los identifica la opción -s. Otros comandos de zfs allow pueden utilizar conjuntos de permisos para el sistema de archivos especificado y sus elementos descendientes. Los conjuntos de permisos se evalúan dinámicamente, por lo tanto los cambios que haya en un conjunto se actualizan de manera inmediata. Los conjuntos de permisos siguen las mismas convenciones de denominación que los sistemas de archivos ZFS; sin embargo, el nombre debe comenzar con el signo de arroba (@) y tener un máximo de 64 caracteres.
La siguiente sintaxis de zfs allow (en negrita) identifica cómo se delegan los permisos:
zfs allow [-ld] ... ... filesystem | volume |
La opción -l indica que el permiso se concede para el conjunto de datos especificado pero no a los elementos descendientes, a menos que también se especifique la opción -d. La opción -d indica que el permiso se concede a los conjuntos de datos descendientes y no a este conjunto de datos, a menos que también se especifique la opción -l. Si no se especifica ninguna de las opciones de -ld, los permisos se conceden para el volumen o sistema de archivos y todos sus elementos descendientes.
Mediante el comando zfs unallow se pueden eliminar los permisos que se han concedido.
Por ejemplo, suponga que ha delegado los permisos create, destroy, mount y snapshot de la forma siguiente:
# 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 ------------------------------------------------------------- |
Para eliminar estos permisos, debe utilizar una sintaxis similar a la siguiente:
# zfs unallow cindys tank/cindys # zfs allow tank/cindys |
En esta sección se proporcionan ejemplos de delegación y visualización de permisos de ZFS.
Si concede los permisos create y mount a un determinado usuario, compruebe que dicho usuario disponga de permisos en el punto de montaje subyacente.
Por ejemplo, para proporcionar al usuario los permisos marks create y mount entank, primero establezca los permisos:
# chmod A+user:marks:add_subdirectory:fd:allow /tank |
A continuación, utilice el comando zfs allow para conceder los permisos create , destroy y mount. Por ejemplo:
# zfs allow marks create,destroy,mount tank |
El usuario marks ya puede crear sus propios sistemas de archivos en el sistema de archivos tank. Por ejemplo:
# su marks marks$ zfs create tank/marks marks$ ^D # su lp $ zfs create tank/lp cannot create 'tank/lp': permission denied |
El ejemplo siguiente muestra cómo configurar un sistema de archivos de forma que cualquier integrante del grupo staff pueda crear y montar sistemas de archivos en el sistema de archivos tank, así como destruir sus propios sistemas de archivos. Ahora bien, los miembros del grupo staff no pueden destruir los sistemas de archivos de nadie más.
# 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 |
Compruebe que conceda permisos a los usuarios en el nivel correcto del sistema de archivos. Por ejemplo, al usuario marks se le concede los permisos create, destroy y mount para los sistemas de archivos local y descendiente. Al usuario marks se le concede permiso local para crear una instantánea del sistema de archivos tank, pero no puede crear una instantánea de su propio sistema de archivos. Así pues, no se le ha concedido el permiso snapshot en el nivel correcto del sistema de archivos.
# 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 |
Para conceder permiso al usuario marks en el nivel descendiente, utilice la opción zfs allow - d. Por ejemplo:
# 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 |
El usuario marks ahora sólo puede crear una instantánea por debajo del nivel de tank.
Puede conceder permisos a usuarios o grupos. Por ejemplo, el siguiente comando zfs allow concede determinados permisos al grupo staff. Asimismo, se conceden los permisos destroy y snapshot una vez creados los sistemas de archivos de tank.
# 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 ------------------------------------------------------------- |
Debido a que el usuario marks pertenece al grupo staff, puede crear sistemas de archivos en tank. Además, el usuario marks puede crear una instantánea de tank/marks2 porque dispone de los correspondientes permisos para hacerlo. Por ejemplo:
# 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 ------------------------------------------------------------- |
Sin embargo, no puede crear una instantánea de tank/marks porque carece de los correspondientes permisos. Por ejemplo:
$ zfs snapshot tank/marks2@snap1 $ zfs snapshot tank/marks@snappp cannot create snapshot 'tank/marks@snappp': permission denied |
Si dispone del permiso create en su directorio principal, puede crear directorios de instantáneas. Esta situación hipotética es útil si el sistema de archivos están montado por NFS. Por ejemplo:
$ 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 |
En el ejemplo siguiente se muestra cómo crear un conjunto de permisos @myset, conceder el grupo de permisos y cambiar el nombre del permiso para el grupo staff respecto al sistema de archivos tank. cindys, usuario del grupo staff, tiene permiso para crear un sistema de archivos en tank. Sin embargo, el usuario lp no tiene permiso para crear un sistema de archivos en 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 |
Para visualizar permisos puede utilizar el comando siguiente:
# zfs allow dataset |
Este comando muestra los permisos que se establecen o permiten en este conjunto de datos. La salida contiene los componentes siguientes:
Conjuntos de permisos
Permisos específicos o permisos create-time
Conjunto de datos local
Conjuntos de datos locales y descendientes
Sólo conjuntos de datos descendientes
La salida de este ejemplo indica que el usuario cindys tiene permisos para crear, destruir, montar y crear instantáneas en el sistema de archivos tank/cindys.
# zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount,snapshot |
La salida de este ejemplo indica los permisos siguientes en los sistemas de archivos pool/fred y pool.
Para el sistema de archivos pool/fred:
Se definen dos conjuntos de permisos:
@eng (create, destroy, snapshot, mount, clone, promote, rename)
@simple (create, mount)
Los permisos create-time se establecen para el conjunto de permisos @eng y la propiedad mountpoint. Create-time significa que, tras la creación de un conjunto de permisos, se conceden el conjunto de permisos @eng y la propiedad mountpoint.
Al usuariotom se le concede el conjunto de permisos @eng; al usuario joe se le conceden los permisos create, destroy y mount para sistemas de archivos locales.
Al usuario fred se le concede el conjunto de permisos @basic, así como los permisos share y rename para los sistemas de archivos locales y descendientes.
Al usuario barney y al grupo de usuarios staff se les concede el grupo de permisos @basic sólo para sistemas de archivos descendientes.
Para el sistema de archivos pool:
Se define el conjunto de permisos @simple (create, destroy, mount).
Al grupo staff se le concede el conjunto de permisos @simple en el sistema de archivos local.
A continuación se muestra el resultado de este ejemplo:
$ 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 ------------------------------------------------------------------------------ |
El comando zfs unallow se usa para eliminar permisos concedidos. Por ejemplo, el usuario cindys tiene permisos para crear, destruir, montar y crear instantáneas en el sistema de archivos 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 ------------------------------------------------------------- |
La siguiente sintaxis de zfs unallow elimina el permiso para crear instantáneas del usuario cindys en el sistema de archivos 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 |
Otro ejemplo: el usuario marks tiene los permisos siguientes en el sistema de archivos tank/marks:
# zfs allow tank/marks ------------------------------------------------------------- Local+Descendent permissions on (tank/marks) user marks create,destroy,mount ------------------------------------------------------------- |
En este ejemplo, la siguiente sintaxis de zfs unallow elimina todos los permisos del usuario marks de tank/marks:
# zfs unallow marks tank/marks |
La siguiente sintaxis de zfs unallow elimina un conjunto de permisos del sistema de archivos 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 ------------------------------------------------------------- |