Definir um proprietário padrão "automaticamente" exigiria um diretório setuid
se comportando como setgid
. No entanto, enquanto isso pode ser configurado no FreeBSD, outros UNIX & Sistemas Linux apenas ignoram u+s
. No seu caso, no entanto, pode haver outra solução.
What I want is to have a directory that can be shared by adding a group to a user. Anything created in this directory inherits the permission scheme from its parent. If there is a better way than what I’m attempting, I’m all ears.
Então, basicamente, pelo que vejo, você quer controlar o acesso a um diretório usando o mecanismo de grupos. No entanto, isso não exige que você restrinja as permissões em toda a estrutura de diretórios. Na verdade, o diretório --x
bit de execução pode ser exatamente o que você precisa. Deixe-me lhe dar um exemplo. Assumindo que ...
- O grupo que controla o acesso ao diretório
group_dir
éourgroup
. - Apenas as pessoas no grupo
ourgroup
podem acessargroup_dir
. -
user1
euser2
pertencem aourgroup
. - A umask padrão é 0022.
... considere a seguinte configuração:
drwxrws--- root:ourgroup |- group_dir/
drwxr-sr-x user1:ourgroup |---- group_dir/user1_submission/
drwxr-sr-x user2:ourgroup |---- group_dir/user2_submission/
-rw-r--r-- user2:ourgroup |-------- group_dir/user2_submission/README
Aqui, vamos supor que cada item foi criado pelo seu proprietário.
Agora, nesta configuração:
- Todos os diretórios podem ser navegados livremente por todos em
ourgroup
. Qualquer pessoa do grupo pode criar, mover, excluir arquivos em qualquer lugar dentro degroup_dir
(mas não mais profundamente). - Qualquer pessoa que não esteja em
ourgroup
será bloqueada emgroup_dir
e, portanto, não poderá manipular nada sob ela. Por exemplo,user3
(que não é membro deourgroup
), não pode lergroup_dir/user2_submission/README
(mesmo que ele tenhar--
permissão no próprio arquivo).
No entanto, há um pequeno problema nesse caso: por causa da típica umask, os itens criados pelos usuários não podem ser manipulados por outros membros do grupo. É aqui que entram as ACLs. Ao definir permissões padrão, você garante que tudo esteja bem, apesar do valor umask:
$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/
Esta chamada define:
- Permissões
rw(x)
padrão para o proprietário. - Permissões
rw(x)
padrão para o grupo. - Nenhuma permissão por padrão para os outros. Observe que, como os outros não podem acessar
group_dir
, de fato, não importa quais são suas permissões abaixo dela.
Agora, se eu criar um item como user2
:
$ touch group_dir/user2_submission/AUTHORS
$ ls -l group_dir/user2_submission/AUTHORS
rw-rw---- user2:ourgroup group_dir/user2_submission/AUTHORS
Com essa ACL implementada, podemos tentar reconstruir nossa estrutura anterior:
drwxrws---+ root:ourgroup |- group_dir/
drwxrws---+ user1:ourgroup |---- group_dir/user1_submission/
drwxrws---+ user2:ourgroup |---- group_dir/user2_submission/
-rw-rw----+ user2:ourgroup |-------- group_dir/user2_submission/README
Aqui, mais uma vez, cada item é criado pelo seu proprietário.
Além disso, se você quiser dar um pouco mais de poder / segurança para aqueles que usam o diretório, você pode querer considerar um bit pegajoso. Isso impediria, por exemplo, que user1
excluísse user2_submission
(pois ele tem -w-
permissão em group_dir
):
$ chmod +t group_dir/
Agora, se user1
tentar remover o diretório user2
, ele receberá uma% Operation not permitted
. No entanto, observe que, embora isso impeça modificações na estrutura de diretórios em group_dir
, os arquivos e diretórios abaixo ainda estarão acessíveis:
user1@host $ rm -r user2_submission
Operation not permitted
user1@host $ cat /dev/null > user2_submission/README
user1@host $ file user2_submission/README
user2_submission/README: empty (uh-oh)
Outra coisa a considerar é que as ACLs que usamos usam as permissões padrão . Portanto, é possível que o proprietário de um item altere as permissões associadas a ele. Por exemplo, user2
pode ser executado perfeitamente ...
$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R
... portanto, tornando seu diretório de submissão completo indisponível para qualquer pessoa do grupo.
No entanto, como você está originalmente disposto a conceder acesso total a rws
a qualquer pessoa do grupo, presumo que esteja confiando nesses usuários e que não esperaria muitas operações maliciosas deles.