Usando ACLs do NFSv4 no Linux

5

Eu configurei com sucesso um cliente e servidor NFSv4, seguindo aproximadamente o guia em Configurando o NFS HOWTO . Ambos estão executando o Ubuntu Linux 14.04. Este é um pequeno ambiente de teste sem autenticação complicada; os dois servidores usam apenas o mesmo arquivo passwd. Tudo parece estar funcionando corretamente; os arquivos são visíveis no cliente e as permissões / IDs de usuário estão corretas.

Agora, gostaria de usar as ACLs do NFSv4 para controlar o acesso aos arquivos no servidor NFSv4. Eu instalei as ferramentas de linha de comando necessárias no cliente e consigo ver algo que parece uma ACL do NFSv4:

$ nfs4_getfacl .
A::OWNER@:rwaDxtTcCy
A::GROUP@:rxtcy
A::EVERYONE@:rxtcy

No entanto, embora eu possa obter a lista da ACL muito bem, não consigo definir nenhuma ACL. Cada tentativa resulta em um erro Invalid argument de setxattr .

$ nfs4_setfacl -a A::OWNER@:rxtncy .
Failed setxattr operation: Invalid argument

Eu usei strace para ver o que estava acontecendo. De acordo com a documentação esparsa que consegui encontrar, as ACLs do NFSv4 são armazenadas como dados XDR binários em um atributo estendido chamado system.nfs4_acl no arquivo. E com certeza, é isso que está acontecendo; setxatt está retornando EINVAL .

getxattr("/primary/home/rstudiouser", "system.nfs4_acl", 0x0, 0) = 80
getxattr("/primary/home/rstudiouser", "system.nfs4_acl", "\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\xe7\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x06GROUP@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x09EVERYONE@\x00\x00", 80) = 80
setxattr("/primary/home/rstudiouser", "system.nfs4_acl", "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa9\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\xe7\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x06GROUP@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x09EVERYONE@\x00\x00", 104, XATTR_REPLACE) = -1 EINVAL (Invalid argument)

Então, por que setxattr está falhando? Atributos estendidos são ativados no servidor NFSv4:

$ sudo tune2fs -l /dev/sda1
tune2fs 1.42.9 (4-Feb-2014)
...
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file 
uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
...

E o cliente certamente está usando o protocolo NFSv4; usando mount para mostrar as unidades montadas:

$ mount
...
192.168.55.103:/primary/home on /primary/home type nfs4 (rw,rsize=8192,wsize=8192,timeo=14,intr,nfsvers=4,acl,addr=192.168.55.103,client
addr=192.168.55.101)
...

Eu tentei inverter todos os sinalizadores de depuração no nfsd para ver se isso produziria um log útil.

$ sudo rpcdebug -m nfsd -s all

Confirma que o servidor está recebendo a solicitação para definir o atributo.

Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567892] nfsd_dispatch: vers 4 proc 1
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567909] nfsv4 compound op #1/2: 22 (OP_PUTFH)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567915] nfsd: fh_verify(36: 01070001 001c0002 00000000 acf697e6 a847b405 c98a638b)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567929] nfsv4 compound op ffff88003c2f6080 opcnt 2 #1: 22: status 0
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567932] nfsv4 compound op #2/2: 34 (OP_SETATTR)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567938] nfsd: fh_verify(36: 01070001 001c0002 00000000 acf697e6 a847b405 c98a638b)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567978] nfsv4 compound op ffff88003c2f6080 opcnt 2 #2: 34: status 22

O que é "status 22"? Por que, 22 = EINVAL , Argumento inválido, que é o que setxattr está retornando no cliente. Infelizmente, não parece revelar nada sobre por que o argumento é considerado inválido.

Algumas outras coisas que tentei:

  1. Uma possibilidade é que o servidor pense que a ACL está malformada. Para verificar isso, usei nfs4_setfacl -e . , que abre a ACL existente em um editor de texto para manipulação. Salvar o arquivo sem alterações ainda produz uma ACL que resulta em Invalid argument quando aplicada.

  2. O mapeamento do ID do usuário é outro problema comum do NFSv4. Eu validei que os IDs do usuário estão alinhados corretamente e que os bits de propriedade / modo de arquivo estão corretos do ponto de vista do cliente NFSv4. Eu também tentei criar um domínio para o NFSv4 definindo Domain = localdomain em /etc/idmapd.conf em ambos os servidores, sem efeito.

Se você usar as ACLs do NFSv4 em servidores NFS baseados em Linux, eu ficaria curioso em saber sua opinião; Eu encontrei muitos tutoriais para configurar o próprio NFSv4 (veja o link no topo deste discurso), mas praticamente nenhum mencionou o uso de ACLs.

    
por Jonathan 07.04.2017 / 22:36

1 resposta

1

Por que vale a pena, eu finalmente desisti desse esforço depois de mais alguns golpes no escuro, o que envolveu principalmente a tentativa de um host Ubuntu com o ZFS.

Como tudo que eu precisava para o meu ambiente de teste era uma VM que pudesse expor um servidor NFSv4 com ACLs, acabei abandonando meus esforços para fazer um servidor Linux funcionar e usando uma imagem do FreeBSD 10.3. A tentativa de fazer com que isso funcionasse com o NFSv4 era também difícil, mas era pelo menos possível. Há um guia bem decente na página de manual do FreeBSD para o nfsv4 (4) .

    
por 10.04.2017 / 23:51