Definir um proprietário padrão "automaticamente" exigiria que um diretório setuid
se comportasse como setgid
. Entretanto, embora isso possa ser configurado no FreeBSD, outros sistemas UNIX e Linux simplesmente ignoram u+s
. No seu caso, no entanto, pode haver outra solução.
O que eu quero é ter um diretório que possa ser compartilhado adicionando um grupo a um usuário. Qualquer coisa criada neste diretório herda o esquema de permissão de seu pai. Se existe uma maneira melhor do que estou tentando, sou todo ouvidos.
Então, basicamente, pelo que vejo, você deseja controlar o acesso a um diretório usando o mecanismo de grupos. No entanto, isso não requer que você restrinja as permissões em toda a estrutura de diretórios. Na verdade, o --x
bit de execução do diretório pode ser exatamente o que você precisa. Deixe-me lhe dar um exemplo. Assumindo que...
- O grupo que controla o acesso ao
group_dir
diretório é ourgroup
.
- Somente pessoas do
ourgroup
grupo podem acessar group_dir
.
user1
e user2
pertence a ourgroup
.
- O 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 assumir que cada item foi criado por seu proprietário.
Agora, nesta configuração:
- Todos os diretórios podem ser navegados livremente por todos os usuários
ourgroup
. Qualquer pessoa do grupo pode criar, mover, excluir arquivos em qualquer lugar dentro group_dir
(mas não em profundidade).
- Quem não
ourgroup
estiver dentro será bloqueado group_dir
e, portanto, será incapaz de manipular qualquer coisa sob ele. Por exemplo, user3
(quem não é membro ourgroup
), não pode ler group_dir/user2_submission/README
(mesmo que ele tenha r--
permissão no próprio arquivo).
No entanto, há um pequeno problema neste caso: devido ao umask típico, os itens criados pelos usuários não podem ser manipulados por outros membros do grupo. É aqui que as ACLs entram. Ao definir as permissões padrão, você garantirá que tudo esteja bem, apesar do valor umask:
$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/
Esta chamada define:
rw(x)
Permissões padrão para o proprietário.
rw(x)
Permissões padrão para o grupo.
- Por padrão, não há permissões para os outros. Observe que, como os outros não podem acessar de
group_dir
qualquer maneira, não importa realmente quais permissões estão abaixo dele.
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, 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, novamente, cada item é criado por seu proprietário.
Além disso, se você quiser dar um pouco mais de energia / segurança para aqueles que usam o diretório, considere um pouco complicado. Isso impediria, por exemplo, a user1
exclusão user2_submission
(já que ele tem -w-
permissão group_dir
):
$ chmod +t group_dir/
Agora, se user1
tentar remover user2
o diretório, ele ficará adorável Operation not permitted
. Observe no entanto que, embora isso impeça modificações na estrutura de diretórios group_dir
, os arquivos e diretórios abaixo ainda estã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 configuram 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 executar perfeitamente ...
$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R
... portanto, tornando seu diretório de envio completo indisponível para qualquer pessoa do grupo.
No entanto, como você originalmente deseja dar rws
acesso total a qualquer pessoa do grupo, presumo que você confie nesses usuários e que não esperaria muitas operações maliciosas deles.