Inicialmente, pensei que o que eu estava tentando fazer era simples. Mas quanto mais eu olho para o FreeBSD man
pages, mais confuso eu estou ficando sobre se é possível.
Eu tenho um pool zfs que é usado apenas para arquivos de dados. Eu quero estabelecer uma uniformidade e controle razoavelmente justos sobre qualquer coisa escrita / armazenada nela. Um aspecto é que eu quero que todos os arquivos "estáticos" sejam mantidos, para ter um proprietário / grupo uniforme (eu tive que ser uma dor real no pescoço, anteriormente, quando arquivos não-executáveis escritos por vários usuários são divididos entre diferentes contas ).
Baseado em esta questão do InfoSec SE parecia mais simples ter esse usuário único como usuário root, já que nenhum script ou arquivo de sistema operacional faz referência ao pool de dados e a permissão de execução é facilmente deixada sem definição.
Então eu achei isso muito fácil. Use o chmod setuid
bit e tudo está bem. Exceto que man chmod
diz que este não pode ser feito a menos que o conjunto de dados seja montado usando -o suiddir
(consulte "modos"). Ok, isso é um pouco doloroso, já que não é o padrão, mas factível.
man mount
então adiciona que os bits de execução são removidos (bom) mas diz " e não será dado ao root " o que é um inesperado, embora tecnicamente eu possa dar os arquivos para um" dummy "usuário não root eu crio.
Exceto que ele adiciona "Somente os sistemas de arquivos UFS suportam esta opção" , então aparentemente não posso usar o bit setiud, porque meu sistema de arquivos montado é o ZFS.
Estou usando as ACLs do NFSv4, mas também não vejo nada naquelas que ajudariam a herdar a propriedade. Parece que eles só podem ser usados para impedir que um usuário altere um proprietário existente.
Então, o que posso fazer? Eu só quero impor um único proprietário de arquivo em todos os arquivos criados / modificados dentro do meu conjunto de dados, mas parece a partir dessas páginas como se não pudesse ser feito.
Existe uma maneira de alcançá-lo?
Atualizações:
@Raphael Ahrens - por arquivos estáticos Eu apenas quero dizer que os arquivos em todo o conjunto de dados não estão sendo executados ou chamados por nenhum processo do sistema - eles são apenas arquivos de dados e hierarquias de diretório criadas / movidas / modificadas em qualquer lugar do conjunto de dados pelos usuários.
Eu tentei o comando que você deu. Eu não percebi que setuid
é uma propriedade válida do zfs, o que resolveria o problema se funcionasse. Mas quando eu tentei, parecia reportar ativado / herdado, mas na verdade ignorar a bandeira? Estou fazendo algo errado ou preciso ativar outra coisa? Esta foi a saída, talvez eu esteja errado:
# id
uid=0(root) gid=0(wheel) groups=0(wheel),1002(data_managers)
# su -l temp_user
% id
uid=1003(temp_user) gid=65533(nogroup) groups=65533(nogroup),1002(data_managers)
% cd /mnt/test_pool
% ls -lt
drwsrwxrwx 11 root data_managers 12 Apr 3 15:25 test_dataset
% zfs get setuid test_pool/test_dataset
NAME PROPERTY VALUE SOURCE
test_pool/test_dataset setuid on default
% cd test_dataset
% ls -lt
drwsrwxrwx 11 root data_managers 12 Apr 3 15:26 test_dataset2
% zfs get setuid test_pool/test_dataset/test_dataset2
NAME PROPERTY VALUE SOURCE
test_pool/test_dataset/test_dataset2 setuid on default
% cd test_dataset2
% touch testfile
% ls -lt testfile
-rw-r--r-- 1 temp_user data_managers 0 Apr 3 15:27 testfile
O conjunto de dados dir +, e também seu diretório pai + conjunto de dados, mostra setuid + herança como sendo definida, mas o arquivo criado neles é criado com owner = invocando usuário ( temp_user
) não é proprietário do diretório pai ( root
).
Atualização 2:
Veja a saída abaixo, que mostra o problema com clareza.
O conjunto de dados foi definido no ZFS. É montado com a opção suiddir. saída dir longa mostra que o bit setuid está definido. dir é de propriedade de root e o usuário de chamada é 'temp_user'. Mas, conforme descrito nas páginas OP e man citadas no OP, o arquivo recém-criado dentro dele ( test0
) é criado com owner = temp_user não-root.
Esse é o problema que estou tentando resolver - obter a propriedade de arquivos para herdar arquivos ZFS, se possível, ou uma solução alternativa, se não.
# id
uid=0(root) gid=0(wheel) groups=0(wheel),1002(data_managers)
# su -l temp_user
% id
uid=1003(temp_user) gid=65533(nogroup) groups=65533(nogroup),1002(data_managers)
% zfs get setuid test_pool/test_dataset/test_dataset2
NAME PROPERTY VALUE SOURCE
test_pool/test_dataset/test_dataset2 setuid on default
% mount | grep 'test_dataset2'
test_pool/test_dataset/test_dataset2 on /mnt/test_pool/test_dataset/test_dataset2 (zfs, local, noatime, suiddir, nfsv4acls)
% cd /mnt/test_pool/test_dataset
% ls -lt
drwsrwxrwx 5 root wheel 9 Apr 3 22:30 test_dataset2
% cd test_dataset2
% touch test0
% ls -lt test0
-rw-r--r-- 1 temp_user wheel 0 Apr 3 22:32 test0