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.
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:
As permissões individuais podem ser explicitamente especificadas como criar, destruir, montar, realizar um instantâneo, etc.
Os grupos de permissões denominados conjuntos de permissões podem ser definidos. Um conjunto de permissões pode ser atualizado mais tarde e todos os consumidores deste conjunto adquirem automaticamente a alteração. Os conjuntos de permissões começam com o caractere @ e estão limitados a 64 caracteres de extensão. Depois do caractere @, os caracteres restantes do nome do conjunto apresentam as mesmas restrições que os nomes de um sistema de arquivos ZFS normal.
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:
As permissões seguem o pool de armazenamento do ZFS quando tal pool for migrado.
Oferece herança dinâmica, onde é possível controlar como as permissões se propagam pelos sistemas de arquivos.
Pode ser configurado de forma que somente o criador de um sistema de arquivos possa destruir tal sistema de arquivos.
Você pode distribuir permissões para especificar sistemas de arquivos. Os sistemas de arquivos recém-criados podem adquirir automaticamente as permissões.
Fornece administração do NFS simples. Por exemplo, um usuário com permissões explícitas pode criar um instantâneo sobre o NFS no diretório .zfs/snapshot apropriado.
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.
É 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.
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:
As permissões individuais podem ser concedidas a um usuário, grupo ou todos.
Os grupos de permissões individuais podem ser concedidos como um conjunto de permissões a um usuário, grupo ou todos.
As permissões podem ser concedidas tanto localmente apenas ao conjunto de dados atual quanto a todos os descendentes do conjunto de dados atual.
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:
groupquota
groupused
userprop
userquota
userused
Além disso, você pode delegar as seguintes propriedades do ZFS a usuários não raiz:
aclinherit
aclmode
atime
canmount
casesensitivity
soma de verificação
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
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.
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.
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 |
Esta seção oferece exemplos de delegação e exibição de permissões delegadas do ZFS.
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 |
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 |
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.
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 |
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 |
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:
Conjuntos de permissões
Permissões específicas ou permissões no momento da criação
Conjunto de dados local
Conjuntos de dados locais e descendentes
Conjuntos de dados descendentes somente
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 |
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:
São definidas dois conjuntos de permissões:
@eng (create, destroy, snapshot, mount, clone, promote, rename)
@simple (create, mount)
As permissões do tempo da criação são definidas para o conjunto de permissões @eng e a propriedade mountpoint. Tempo de criação significa que o conjunto de permissões @eng e a propriedade mountpoint são concedidas depois da criação do conjunto de dados.
Ao usuário tom é concedido o conjunto de permissões @eng e ao usuário joe são concedidas as permissões create, destroy e mount para sistemas de arquivos locais.
Ao usuário fred é concedido o conjunto de permissões @basic e as permissões share e rename para os sistemas de arquivos locais e descendentes.
Ao usuário barney e ao grupo staff é concedido o conjunto de permissões @basic somente para os sistemas de arquivos descendentes.
Para o sistema de arquivos pool:
Está definido o conjunto de permissões @simple (create, destroy, mount).
Ao grupo staff é concedido o conjunto de permissões @simple no sistema de arquivos local.
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 ------------------------------------------------------------------------------ |
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 ------------------------------------------------------------- |