Guía de administración de Oracle Solaris ZFS

Capítulo 9 Administración delegada de ZFS

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.

Descripción general de la administración delegada 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:

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:

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.

Inhabilitación de permisos delegados de ZFS

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.

Delegación de permisos de ZFS

Utilice el comando zfs allow para conceder permisos en conjuntos de datos ZFS a usuarios que no sean root de las maneras siguientes:

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:

Además, puede delegar las siguientes propiedades de ZFS a usuarios que no sean root:

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.

Delegación de permisos de ZFS (zfs allow)

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.

Eliminación de permisos delegados de ZFS (zfs unallow)

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

Uso de la administración delegada de ZFS

En esta sección se proporcionan ejemplos de delegación y visualización de permisos de ZFS.

Delegación de permisos ZFS (ejemplos)


Ejemplo 9–1 Delegación de permisos a un determinado usuario

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


Ejemplo 9–2 Delegación de los permisos create y destroy en un grupo

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


Ejemplo 9–3 Delegación de permisos en el nivel correcto del sistema de archivos

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.



Ejemplo 9–4 Definición y uso de permisos delegados complejos

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


Ejemplo 9–5 Definición y uso de un conjunto de permisos delegados de ZFS

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

Visualización de permisos delegados de ZFS

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:


Ejemplo 9–6 Visualización de permisos de administración delegados básicos

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


Ejemplo 9–7 Visualización de permisos de administración delegados complejos

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:

Para el sistema de archivos pool:

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
------------------------------------------------------------------------------

Eliminación de permisos ZFS (ejemplos)

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
-------------------------------------------------------------