Eu tenho um diretório que contém dados compartilhados entre vários usuários. O acesso a este diretório e a qualquer coisa abaixo dele será controlado pelo grupo do diretório, que será adicionado aos usuários em questão. Como tal, criei o conjunto de pastas "sticky group" chmod g+s
. O diretório conterá uma estrutura em árvore com diretórios e arquivos, com a quantidade total de arquivos provavelmente sendo de alguns milhões. Os arquivos serão bem pequenos, não prevejo nada maior que 50 MB.
Meu problema é que o proprietário do arquivo ou diretório ainda é o usuário que o criou. Como tal, mesmo que eu devesse remover esse usuário do grupo de acesso, não o removeria completamente.
Tão:
Há outras opções que eu perdi para garantir que todos os arquivos e subdiretórios tenham o mesmo proprietário?
Eu espero que possa navegar periodicamente por todo o diretório com um cron-job, mas isso me parece ineficiente para o que é essencialmente um comando de uma vez por arquivo.
Encontrei um exemplo usando o INotify, mas isso me parece de alta manutenção, pois requer scripts.
Não consegui descobrir se a ACL pode me ajudar com a propriedade forçada.
Existe uma maneira mais inteligente de fazer isso?
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.
fonte
chown -hR owner:group
?Respostas:
Definir um proprietário padrão "automaticamente" exigiria que um diretório
setuid
se comportasse comosetgid
. Entretanto, embora isso possa ser configurado no FreeBSD, outros sistemas UNIX e Linux simplesmente ignoramu+s
. No seu caso, no entanto, pode haver outra solução.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...group_dir
diretório éourgroup
.ourgroup
grupo podem acessargroup_dir
.user1
euser2
pertence aourgroup
.... considere a seguinte configuração:
Aqui, vamos assumir que cada item foi criado por seu proprietário.
Agora, nesta configuração:
ourgroup
. Qualquer pessoa do grupo pode criar, mover, excluir arquivos em qualquer lugar dentrogroup_dir
(mas não em profundidade).ourgroup
estiver dentro será bloqueadogroup_dir
e, portanto, será incapaz de manipular qualquer coisa sob ele. Por exemplo,user3
(quem não é membroourgroup
), não pode lergroup_dir/user2_submission/README
(mesmo que ele tenhar--
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:
Esta chamada define:
rw(x)
Permissões padrão para o proprietário.rw(x)
Permissões padrão para o grupo.group_dir
qualquer maneira, não importa realmente quais permissões estão abaixo dele.Agora, se eu criar um item como
user2
:Com essa ACL, podemos tentar reconstruir nossa estrutura anterior:
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ãouser2_submission
(já que ele tem-w-
permissãogroup_dir
):Agora, se
user1
tentar removeruser2
o diretório, ele ficará adorávelOperation not permitted
. Observe no entanto que, embora isso impeça modificações na estrutura de diretóriosgroup_dir
, os arquivos e diretórios abaixo ainda estão acessíveis: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 ...... 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.fonte
group_dir
em primeiro lugar, não importa se ele é o dono ou não do arquivo. O único "privilégio" real que o proprietário tem é que ele pode alterar as permissões de suas criações (que eu detalhei um pouco mais na minha resposta).group_dir
diretório é de propriedade deroot:ourgroup
with-rwxr-x---
, o que significa que somente o root e os membrosourgroup
podem acessá-lo, ou seja, fazer qualquer coisa com os arquivos sob ele. Se você não tiver--x
permissão em um diretório, não poderá acessar um arquivo nele, mesmo se tiver permissões para o próprio arquivo.Existe uma maneira mais inteligente de fazer isso. Ele usa uma combinação de set-gid e acls padrão . Obviamente, você precisará de um sistema de arquivos habilitado para acl. Vamos supor que o diretório em que você deseja compartilhar esteja
/var/grpdir
e que os membros do gruposharing
possam acessá-lo.As ACLs padrão são herdadas pelos subdiretórios criados em um diretório com ACLs padrão. Portanto, isso significa que qualquer arquivo criado
/var/grpdir
terá seu grupo definidosharing
pelo bit setgid do diretório. Além disso, ele herdará as acls padrão, que substituirão as premissas padrão do estilo linux, porque não especificamos ACLs com usuários ou grupos específicos. Isso significa que todos os arquivos serão criados com propriedade<user>:sharing
e permissõesrw-rw----
. Os diretórios serão os mesmos, exceto que eles também terão suas próprias ACLs padrão definidas como iguais aos pais (/var/grpdir
) e, é claro, os bits executáveis definidos para usuário e grupo. Se você remover um usuário dosharing
grupo, ele não poderá acessar o diretório (nem nenhum arquivo nele, mesmo que seja o proprietário).Diferentemente da correção periódica de permissões com um cronjob, as permissões estão sempre sincronizadas, pois são atualizadas automaticamente com os arquivos e diretórios criados recentemente. Esta solução é leve; não são necessários daemons e não há aumento no IO enquanto corrige as permissões de uma só vez.
fonte
Não conheço nenhuma boa maneira de fazer isso. A maneira tecnicamente mais limpa seria um sistema de arquivos FUSE que faça isso. Claro, muito trabalho se ninguém fez isso ainda.
Alternativas:
Use samba. samba tem o
force user
parâmetro Você pode exportar um diretório localmente e montá-lo localmente. Não torna os acessos mais rápidos, mas pode ser aceitável, pois apenas a rede de loopback está envolvida.Use um sistema de arquivos não Linux como o FAT32. Isso deve ser configurado para um determinado usuário para montá-lo. As permissões de acesso devem ser tratadas pelo diretório pai.
fonte
Não ouvi nenhuma maneira de alterar automaticamente a propriedade de um arquivo, de forma que o proprietário do arquivo seja alterado quando o arquivo for movido para um determinado diretório. O mais próximo é o pouco complicado, mas parece que você indicou que a propriedade do grupo não é suficiente; a propriedade real do usuário precisa mudar.
Nesse caso, acho que sua melhor aposta é o trabalho cron com a bandeira chown -R, como Pandya mencionou. Coloque-o em um cron para executar a cada minuto ou a cada cinco minutos.
Se você pode explicar como seus usuários estão usando isso, pode haver uma solução melhor.
A ACL pode ajudá-lo a obter um controle mais detalhado sobre quem tem permissão para fazer o que, não mudará automaticamente a propriedade real do arquivo para você. Acho que você precisa ter uma visão mais elevada e avaliar / redesenhar sua solução nessa base.
fonte
Você pode usar o inotify-tools e escrever um script simples do bash como abaixo. O Inotify manterá seus olhos no diretório web e fará algo sempre que um evento como a criação de dir ocorrer dentro do diretório web. Existem muitos eventos existentes. Você pode pesquisar no Google ou procurar neste site
fonte