Definindo permissões padrão para arquivos e subdiretórios recém-criados em um diretório no Linux?

99

Eu tenho um monte de scripts e aplicativos de longa duração que estão armazenando resultados de saída em um diretório compartilhado entre alguns usuários. Gostaria de ter certeza de que todos os arquivos e diretórios criados neste diretório compartilhado tenham u=rwxg=rwxo=rpermissões automaticamente .

Eu sei que poderia usar umask 006meus vários scripts, mas não gosto dessa abordagem, pois muitos usuários escrevem seus próprios scripts e podem se esquecer de definir o umask sozinhos.

Eu realmente quero que o sistema de arquivos defina os arquivos e diretórios recém-criados com uma certa permissão, se estiver em uma determinada pasta. Tudo isso é possível?

Atualização : acho que pode ser feito com ACLs POSIX , usando a funcionalidade ACL padrão, mas está tudo um pouco sobrecarregado no momento. Se alguém puder explicar como usar ACLs padrão, provavelmente responderá bem a essa pergunta.

David Dean
fonte
1
ACLs POSIX são bons, no entanto, uns bons 60% das máquinas que você encontra não os terão ativados para certos sistemas de arquivos, dependendo da distribuição. Aqui está uma introdução e um exemplo muito bons: suse.de/~agruen/acl/linux-acls/online
Tim Post
1
Você quer dizer o mesmo documento que eu vinculei :) Ainda não tive nenhuma alteração para lê-lo, mas obrigado por me avisar sobre o problema de disponibilidade.
David Dean
1
O link no comentário de Tim Post parece estar morto, mas graças ao Internet Archive, eu pude visualizá-lo e verificar se vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html contém exatamente o mesmo documento. Vou editar a pergunta para atualizar o link.
rmunn

Respostas:

78

Para obter a propriedade correta, você pode definir o bit setuid do grupo no diretório com

chmod g+rwxs dirname

Isso garantirá que os arquivos criados no diretório sejam de propriedade do grupo. Você deve então certificar-se de que todos executam com umask 002 ou 007 ou algo dessa natureza --- é por isso que o Debian e muitos outros sistemas linux são configurados com grupos por usuário por padrão.

Não conheço uma maneira de forçar as permissões desejadas se o umask do usuário for muito forte.

Norman Ramsey
fonte
23
Isso realmente não fornece uma solução - ele está perguntando sobre permissões, não propriedade, e a única maneira de fazer isso é com ACLs
Yarin
3
"... certifique-se de que todos usem umask 002 ou 007 ou algo dessa natureza" - isso é um pouco forçado ... Como você faz com que Postfix, Dovecot, Clam e Spam Assassin façam isso?
jww
2
O que a +sparte faz? Obrigado.
tommy.carstensen
1
Neste caso, significa definir o ID do grupo. Isso quer dizer que usamos g + s para definir o bit SGID. Digo "neste caso" porque + s foi combinado com g para o grupo. + s também pode ser usado para definir o bit SUID (setuid).
Bastião de
57

Veja como fazer isso usando ACLs padrão, pelo menos no Linux.

Primeiro, pode ser necessário habilitar o suporte ACL em seu sistema de arquivos. Se você estiver usando ext4, ele já está habilitado. Outros sistemas de arquivos (por exemplo, ext3) precisam ser montados com a aclopção. Nesse caso, adicione a opção ao seu /etc/fstab. Por exemplo, se o diretório estiver localizado em seu sistema de arquivos raiz:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

Em seguida, monte-o novamente:

mount -oremount /

Agora, use o seguinte comando para definir a ACL padrão:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

Todos os novos arquivos /shared/directorydevem agora obter as permissões desejadas. Claro, também depende do aplicativo que está criando o arquivo. Por exemplo, a maioria dos arquivos não será executável por ninguém desde o início (dependendo do argumento de modo para a chamada open (2) ou creat (2)), assim como ao usar umask. Alguns utilitários como cp, tare rsynctentarão preservar as permissões do (s) arquivo (s) de origem, o que mascarará sua ACL padrão se o arquivo de origem não puder ser gravado em grupo.

Espero que isto ajude!

Pelle
fonte
Parece que isso ainda requer adequado umaskpara todos os usuários. = / unix.stackexchange.com/questions/71743/…
anatoly techtonik
1
@techtonik Como escrevi, depende do aplicativo que está criando o arquivo. Por exemplo, se você usar cp, ele tentará copiar as permissões do arquivo de origem. Nem umaskajuda na hora de usar cp. Eu vi o mesmo problema com tar. Veja esta pergunta .
pelle de
@techtonik Eu adicionei uma frase sobre isso na minha resposta agora.
pelle de
1
sim, parece que o problema estava no aplicativo, definindo os direitos para 644 quando minha configuração correta de ACL e POSIX era toda para 664. Seria bom esclarecer esse mecanismo de fallback para pessoas que estão solucionando o problema. Muitos nem sabem disso umask.
anatoly techtonik
Quer dizer, perdi algum tempo tentando ver se não tenho os sinalizadores de montagem configurados corretamente (e no ext4 eles não podem ser configurados, porque parece que funcionam automaticamente). Não há informações de como verificar se setfacl works correctly- presumo que deva falhar, mas não tenho certeza, porque a resposta erra esse ponto.
anatoly techtonik
4

É feio, mas você pode usar o comando setfacl para conseguir exatamente o que deseja.

Em uma máquina Solaris, tenho um arquivo que contém as acls para usuários e grupos. Infelizmente, você precisa listar todos os usuários (pelo menos não consegui encontrar uma maneira de fazer isso funcionar):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

Nomeie o arquivo acl.lst e preencha seus nomes de usuário reais em vez de user_X.

Agora você pode definir essas acls em seu diretório emitindo o seguinte comando:

setfacl -f acl.lst /your/dir/here
innaM
fonte
você pode deixar de fora a lista de usuários se forem todos membros do mesmo grupo e apenas usar as permissões do grupo?
David Dean
Eu estava me perguntando a mesma coisa. Já faz um tempo desde que configurei isso. Porém, toda vez que recebo um novo usuário (no mesmo grupo dos outros), esqueço de atualizar a lista e recebo reclamações sobre o novo usuário não poder gravar / excluir arquivos. Portanto, a resposta é: Não, você não pode.
innaM de
4

em seu script de shell (ou .bashrc), você pode usar algo como:

umask 022

umask é um comando que determina as configurações de uma máscara que controla como as permissões de arquivo são definidas para arquivos recém-criados.

user3270784
fonte
1
Incorreto. Umask limita as permissões e não pode adicionar permissões
ACV
@ACV você pode explicar? Isso funciona para mim, arquivos recém-criados agora permitem que os membros do grupo tenham permissões rw quando eu tenho umask 002no meu .bashrc.
Arthur Dent
3
@ArthurDent umask 002limita o acesso a outros, deixando o grupo inalterado. Lembre-se, é ugo- esse é o grupo de usuários outros. Lembre-se também de que umask basicamente significa subtrair dos padrões. Para arquivos: 666 - 002significa 664, o que significa que o grupo não é afetado.
ACV