Como definir permissões padrão para arquivos movidos ou copiados para um diretório?

9

Minha pergunta é semelhante a Como definir as permissões de arquivo padrão em TODOS os arquivos recém-criados no linux - mas difere de maneiras importantes:

Desejo que todos os arquivos criados (ou copiados ou movidos para) em um determinado diretório herdem um conjunto de permissões padrão diferentes do padrão do sistema.

Justificativa: O diretório em questão é o "funil de entrada" para um aplicativo. Os usuários em um grupo colocam os arquivos no diretório e o aplicativo (executando sob outro ID de usuário no mesmo grupo) os leva e os processa. O problema é que o proprietário de cada arquivo colocado no diretório é o usuário que o colocou lá e as permissões são padronizadas como "rw-r - r--"; Eu quero mudar isso para "rw-rw ----". O aplicativo que faz a entrada não pode fazer isso explicitamente, porque o ID do usuário em que o aplicativo está sendo executado não possui o arquivo em questão e as permissões padrão não permitem que o aplicativo faça chmod no arquivo! Obviamente, o usuário poderia fazer um chmod depois de colocar o arquivo lá - mas eu quero manter a "queda" do usuário o mais simples possível. (Essas pessoas não são alfabetizadas em Linux,

umask parece muito poderosa: não quero definir permissões padrão para todos os arquivos criados em qualquer lugar por esses usuários - apenas aqueles criados (ou colocados) neste diretório.

Por favor, informe ... obrigado!

Roubar
fonte

Respostas:

5

Você pode usar uma ACL (lista de controle de acesso) para definir as permissões padrão para arquivos em um diretório.

De man 5 acl:

Se uma ACL padrão estiver associada a um diretório, o parâmetro mode para as funções que criam objetos de arquivo e a ACL padrão do diretório serão usadas para determinar a ACL do novo objeto:

  1. O novo objeto herda a ACL padrão do diretório que contém como ACL de acesso.

  2. As entradas da ACL de acesso correspondentes aos bits de permissão do arquivo são modificadas para que não contenham permissões que não estejam contidas nas permissões especificadas pelo parâmetro mode.

Para configurá-lo (altere o dispositivo, os diretórios etc.):

Edite seu /etc/fstabarquivo e adicione a aclopção de montagem.

/dev/mapper/star-home /home ext3  defaults,acl 0 2

Remonte ( página de manual do Sambamount.cifs ) seu sistema de arquivos reinicializando ou use:

mount -o remount,acl /home

Verifique se você possui os utilitários setfacle getfacl.

Defina a ACL padrão no diretório (também pode ser necessário definir a ACL nos arquivos existentes):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections

Consulte o tutorial vinculado para obter mais informações.

Fonte: Tutorial Parte 1 e Parte 2

Referência: listas de controle de acesso POSIX no Linux

Pausado até novo aviso.
fonte
Não acho que você deva adicionar aclcomo opção no mountcomando quando o adicionar /etc/fstab. Será redundante e quando você executar o mountcomando na sua resposta, obterá uma saída como esta: /dev/vda1 on / type ext4 (rw,errors=remount-ro,acl,acl)(veja acl,aclno final). Corrija se não estiver errado.
its_me
1

Posso oferecer uma solução alternativa: crie um diretório "drop" separado, execute um minijob separado para corrigir as permissões e depois mova os arquivos para o diretório de dados do aplicativo. Você pode usar o incron para isso, para que não haja praticamente nenhum atraso perceptível.

Peter Eisentraut
fonte
1

Eu posso pensar em quatro métodos possíveis de fazer isso:

  • umask, que você não deseja usar
  • wrapper de programa, que define umask desse aplicativo, não o usuário
  • cron, como @Peter Eisentraut descreveu; find $HOME/intake -type f -exec chmod 660 {} \;, diferentes sistemas têm melhorias de desempenho nisso (como a -exec+opção)
  • as configurações baseadas em diretório, que exigem um pouco de programação do shell, mas basicamente o shell, ao definir o prompt ou chamar o cd, alteraria a umask se houver um arquivo de ponto nesse diretório (ou possivelmente um diretório ancestral); para o bash, PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"seria o mais simples.
Arcege
fonte