Guia de administração do ZFS Oracle Solaris

Capítulo 9 Administração delegada de ZFS

Este capítulo descreve como usar a administração delegada para permitir que usuários não-privilegiados realizem tarefas de administração no ZFS.

Visão geral da administração delegada de ZFS

Este recurso permite distribuir permissões refinadas a usuários específicos, grupos ou a todos. São suportados dois tipos de permissões delegadas:

A administração delegada de ZFS oferece recursos semelhantes ao modelo de segurança RBAC. Este recurso oferece as seguintes vantagens na administração de conjuntos de armazenamento e sistemas de arquivos do ZFS:

Considere o uso da administração delegada para distribuir tarefas do ZFS. Para obter mais informações sobre o uso de RBAC para gerenciar tarefas gerais de administração do Solaris, consulte Parte III, Roles, Rights Profiles, and Privileges, no System Administration Guide: Security Services.

Desativando permissões delegadas do ZFS

É possível controlar os recursos de administração delegados utilizando a propriedade delegation do conjunto. Por exemplo:


# 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

Por padrão, a propriedade delegation é habilitada.

Delegando permissões do ZFS

Você pode usar o comando zfs allow a fim de conceder permissões em conjuntos de dados ZFS a usuários não-privilegiados das seguintes formas:

A tabela abaixo descreve as operações que podem ser delegadas e as permissões dependentes requeridas para realizar as operações delegadas.

Permissão (Subcomando) 

Descrição 

Dependências 

allow

A capacidade que você tem de conceder permissões a outro usuário. 

Também deve ter a permissão que está sendo concedida. 

clone

A capacidade de clonar quaisquer instantâneos do conjunto de dados.  

Também deve possuir as capacidades create e mount no sistema de arquivos original.

create

A capacidade de criar conjuntos de dados descendentes. 

Também deve possuir a capacidade mount.

destroy

A capacidade de destruir um conjunto de dados. 

Também dever possuir a capacidade mount.

mount

A capacidade de montar e desmontar um conjunto de dados e de criar e destruir os links do dispositivo de volume. 

 

promote

A capacidade de promover um clone de um conjunto de dados. 

Também deve possuir as capacidades mount e promote no sistema de arquivos original.

receive

A capacidade de criar sistemas de arquivos descendentes com o comando zfs receive.

Também deve possuir as capacidades mount e create.

rename

A capacidade de renomear um conjunto de dados. 

Também deve possuir as capacidades create e mount no novo pai.

reversão

A capacidade de reverter um instantâneo. 

 

send

A capacidade de enviar um fluxo de instantâneo. 

 

share

A capacidade de compartilhar e cancelar o compartilhamento de um conjunto de dados. 

 

instantâneo

A capacidade de obter um instantâneo de um conjunto de dados. 

 

Você pode delegar os seguintes conjuntos de permissões, mas a permissão pode estar limitada para a permissão de acesso, leitura ou alteração:

Além disso, você pode delegar as seguintes propriedades do ZFS a usuários não raiz:

Algumas destas propriedades podem ser definidas somente durante a criação do conjunto de dados. Para obter uma descrição destas propriedades, consulte Introduzindo as propriedades do ZFS.

Delegação de permissões do ZFS (zfs allow)

A sintaxe de zfs allow é a seguinte:


zfs allow -[ldugecs] everyone|user|group[,...] perm|@setname,...] filesystem| volume

A sintaxe de zfs allow abaixo (em negrito) identifica a quem as permissões são delegadas:


zfs allow [-uge]|user|group|everyone [,...] filesystem | volume

Podem ser especificadas várias entidades em uma lista separada por vírgulas. Se não for especificada nenhuma opção -uge , o argumento é interpretado preferencialmente como a palavra-chave everyone, a seguir, como um nome de usuário e, por último, como um nome de grupo. Para especificar um usuário ou grupo denominado “everyone”, use a opção -u ou -g. Para especificar um grupo com o mesmo nome de um usuário, use a opção -g. A opção -c concede as permissões no momento da criação.

A sintaxe de zfs allow abaixo (em negrito) identifica como as permissões e os conjuntos de permissões são especificados:


zfs allow [-s] ... perm|@setname [,...] filesystem | volume

Podem ser especificadas várias permissões em uma lista separada por vírgulas. Os nomes das permissões são os mesmo dos subcomandos e propriedades do ZFS. Para obter mais informações, consulte a seção anterior.

As permissões podem ser reunidas em conjuntos de permissões e são definidas pela opção -s. Os conjuntos de permissões podem ser usados por outros comandos zfs allow no sistema de arquivos especificado e seus descendentes. Os conjuntos de permissões são avaliados dinamicamente, de modo que as alterações no conjunto são atualizadas imediatamente. Os conjuntos de permissões seguem as mesmas convenções de nomeação dos sistemas de arquivos ZFS, mas o nome deve começar com o sinal de arroba (@) e não pode ter mais de 64 caracteres.

A sintaxe de zfs allow abaixo (em negrito) identifica como as permissões são delegadas:


zfs allow [-ld] ... ... filesystem | volume

A opção -l indica que a permissão é concedida ao conjunto de dados especificado e não a seus descendentes, a menos que a opção -d também seja especificada. A opção -d indica que a permissão é concedida aos conjuntos de dados descendentes e não a este conjunto de dados, a menos que a opção -l também seja especificada. Se nenhuma das opções -ld forem especificadas, as permissões são concedidas ao sistema de arquivos ou volume e a todos os seus descendentes.

Removendo as permissões delegadas do ZFS (zfs unallow)

Você pode remover as permissões concedidas anteriormente com o comando zfs unallow.

Por exemplo, suponha que você delegou as permissões create, destroy, mount e snapshot como a seguir:


# 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 remover estas permissões, pode ser necessário usar uma sintaxe semelhante à seguinte:


# zfs unallow cindys tank/cindys
# zfs allow tank/cindys

Usando a administração delegada de ZFS

Esta seção oferece exemplos de delegação e exibição de permissões delegadas do ZFS.

Delegando permissões do ZFS (Exemplos)


Exemplo 9–1 Delegando permissões a um usuário individual

Ao fornecer as permissões create e mount a um usuário individual, você precisa ter certeza de que o usuário tem as permissões no ponto de montagem subjacente.

Por exemplo, para dar ao usuário marks as permissões create e mount em tank, defina primeiro as permissões:


# chmod A+user:marks:add_subdirectory:fd:allow /tank

A seguir, use o comando zfs allow para conceder as permissões create, destroy e mount. Por exemplo:


# zfs allow marks create,destroy,mount tank

Agora, o usuário marks pode criar seus próprios sistemas de arquivos no sistema de arquivos tank. Por exemplo:


# su marks
marks$ zfs create tank/marks
marks$ ^D
# su lp
$ zfs create tank/lp
cannot create 'tank/lp': permission denied


Exemplo 9–2 Delegando as permissões de criação e destruição a um grupo

O exemplo abaixo mostra como configurar um sistema de arquivos para que todos no grupo staff possam criar e montar sistemas de arquivos no sistema de arquivos tank, bem como destruir seus próprios sistemas de arquivos. No entanto, os membros do grupo staff não podem destruir os sistemas de arquivos de outros.


# 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


Exemplo 9–3 Delegando permissões no nível correto do sistema de arquivos

Certifique-se de ter concedido a permissão aos usuários no nível correto do sistema de arquivos. Por exemplo, ao usuário marks são concedidas as permissões create, destroy e mount para os sistemas de arquivos locais e descendentes. Ao usuário marks é concedida a permissão local para realizar instantâneos do sistema de arquivos tank, mas não tem permissão para realizar instantâneos do seu próprio sistema de arquivos. Assim, ele não tem a permissãosnapshot no nível correto do sistema de arquivos.


# 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 ao usuário marks a permissão no nível do descendente, use a opção zfs allow - d. Por exemplo:


# 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

Agora, o usuário marks pode somente criar um instantâneo abaixo do nível tank.



Exemplo 9–4 Definindo e usando permissões delegadas complexas

Você pode conceder permissões específicas a usuários ou grupos. Por exemplo, o comando zfs allow seguinte concede permissões específicas ao grupo staff. Além disso, as permissões destroy e snapshot são concedidas após a criação dos sistemas de arquivos 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
-------------------------------------------------------------

Por ser um membro do grupo staff, o usuário marks pode criar sistemas de arquivos tank. Além disso, o usuário marks pode criar um instantâneo de tank/marks2 porque possui as permissões específicas para isso. Por exemplo:


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

Porém, ele não pode criar um instantâneo em tank/marks porque não possui as permissões específicas para isso. Por exemplo:


$ zfs snapshot tank/marks2@snap1
$ zfs snapshot tank/marks@snappp
cannot create snapshot 'tank/marks@snappp': permission denied

Se tiver a permissão create no diretório de início, você pode criar seus próprios diretórios de instantâneos. Esta situação é útil quando o sistema de arquivos está montado em NFS. Por exemplo:


$ 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


Exemplo 9–5 Definindo e usando um conjunto de permissões delegadas do ZFS

O exemplo seguinte mostra como criar um conjunto de permissões @myset e conceder e renomear permissões no grupo staff para o sistema de arquivos tank. O usuário cindys, membro do grupo staff, possui a permissão para criar um sistema de arquivos em tank. No entanto, o usuário lp não possui a permissão para criar um sistema de arquivos em 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

Exibindo permissões delegadas do ZFS (Exemplos)

Você pode usar o comando seguinte para exibir permissões:


# zfs allow dataset

Este comando exibe permissões que são definidas ou concedidas a este conjunto de dados. A saída contém os seguintes componentes:


Exemplo 9–6 Exibindo permissões básicas de administração delegada

A saída do exemplo seguinte indica que o usuário cindys tem permissões para criar, destruir, montar e realizar um instantâneo no sistema de arquivos tank/cindys.


# zfs allow tank/cindys
       -------------------------------------------------------------
       Local+Descendent permissions on (tank/cindys)
               user cindys create,destroy,mount,snapshot


Exemplo 9–7 Exibindo permissões complexas de administração delegada

A saída deste exemplo indica as seguintes permissões nos sistemas de arquivos pool/fred e pool.

Para o sistema de arquivos pool/fred:

Para o sistema de arquivos pool:

Eis a saída deste exemplo:


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

Removendo permissões do ZFS (Exemplos)

Você pode usar o comando zfs unallow para remover as permissões concedidas. Por exemplo, o usuário cindys tem permissões para criar, destruir, montar e realizar um instantâneo no sistema de arquivos 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
       -------------------------------------------------------------

A sintaxe seguinte de zfs unallow remove a permissão de criação de instantâneo do usuário cindys do sistema de arquivos 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

Como no outro o exemplo, o usuário marks tem as seguintes permissões em tank/marks:


# zfs allow tank/marks
-------------------------------------------------------------
Local+Descendent permissions on (tank/marks)
        user marks create,destroy,mount
-------------------------------------------------------------

Neste exemplo, a sintaxe seguinte de zfs unallow remove todas as permissões do usuário marks de tank/marks:


# zfs unallow marks tank/marks

A sintaxe seguinte de zfs unallow remove um conjunto de permissões do sistema de arquivos 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
-------------------------------------------------------------