Uma solução alternativa com inotifywait no Linux:

Uma solução alternativa com inotifywait no Linux:

Deve haver uma pasta TO em um Samba-Share, onde todos podem criar arquivos, editá-los e excluí-los. Mas um usuário não deve ter permissão para ler os arquivos que outros criaram.

A ideia principal é ter uma pasta onde os alunos possam enviar provas e não ler o que os outros colegas escreveram. Não deve haver limitações desnecessárias. Os alunos devem ter permissão para criar diretórios e copiar seus arquivos. Eles devem apenas ser separados um do outro e não ler/excluir arquivos de terceiros.

No Windows, essa pasta teria uma ACL semelhante a:

$ icacls TO
.\TO Everybody: (CI)(Rc,S,RD,WD,AD,X)

Um professor/proprietário teria permissões de modificação nessa pasta para coletar todos os dados.

Como eu replicaria algo semelhante no Linux com ACLs (setfacl, getfacl) ou, se possível, sem elas, usando apenas permissões padrão do Linux?

Responder1

Vou responder minha própria pergunta. Se alguém puder melhorar esta resposta ou tiver alguma dúvida, faça-o sem dúvida. Esse problema específico já me incomoda há algum tempo.

O que perguntei parece não ser possível com ACLs POSIX de acordo com: Permissão Group+rx apenas em diretórios usando ACLpois as ACLs não conseguem distinguir entre arquivos e pastas ao aplicar direitos herdados.

Procurando mais, duas possíveis soluções alternativas foram mencionadas:

  • inotify (que usei aqui)
  • bindfs (se alguém tentar isso, por favor poste)

Uma solução alternativa com inotifywait no Linux:

Permissões de pasta

Como root, faça o seguinte:

Crie a pasta para compartilhar:

mkdir fld

Faça com que as pastas superiores agrupem o grupo de professores. O grupo deve existir e ser o grupo primário dos professores.

chown :teach fld

Deixe o grupo ser herdado por todos os arquivos/subpastas. Isso significa que o professor deve ser capaz de ler/escrever/excluir

chmod g+s fld 

Não permitir a substituição/exclusão de arquivos por terceiros (como permissões /tmp)

chmod +t fld

Agora as ACLs serão configuradas para herdar direitos mínimos em todos os arquivos/subpastas criados nesta pasta:

setfacl -m u::rwx,g::rwx,o::rwx,d:u::rwx,d:o::--- fld

A pasta superior, que deve conter todas as subpastas/arquivos criados pelos alunos, deve ficar assim agora:

getfacl fld

# file: fld
# owner: root
# group: teach
# flags: -st
user::rwx
group::rwx
other::rwx
default:user::rwx
default:group::rwx
default:other::---

Somente essas permissões têm algum mérito. Se o script a seguir não for executado, as permissões de pasta acima permitirão que os alunos criem/leiam/editem/excluam seus próprios arquivos e não façam isso com arquivos de outras pessoas. A pasta deve se comportar normalmente, ou seja, é permitido ver/listar todos os arquivos. A única limitação é que funciona apenas diretamente nesta pasta, não em subpastas. Isso deve ser suficiente para envios simples de vários arquivos pelos alunos.

Para todas as subpastas criadas por alunos, aplica-se o seguinte: Os alunos serão agrupados em "outros", portanto, a parte importante é:

default:other::---

Isso significa que nenhum direito será concedido a "outros" sobre arquivos/pastas neste compartilhamento. A idéia é que apenas as pastas recebam rwx em "outros", os arquivos não precisam alterar as permissões.

script inotify: submit_folder.sh

Este script deve ser executado pelo root, o único argumento será esta pasta, que acabou de ser criada acima. Como exemplo de como executá-lo:

submission_folder.sh /path/to/fld

O arquivo é executável e possui este conteúdo:

#!/bin/bash +x
dir=$1

if [[ -z $dir ]];
then
    echo "Enter path as argument"
    exit
fi
echo "WATCHING: $dir"

# run forever
while true; do

inotifywait -r -q --format %w%f -e create "$dir" | while read f; do 
    echo "- CREATED: $f"
    if [[ -d "${f}" ]] ; then
        echo "FOLDER: ${f}, adding read,write,execute permission"
        chmod o+rwx "${f}"
        stat "${f}"
    else
        echo "FILE: $f, doing noting"
    fi
done

done

Enquanto o script estiver em execução, ele atualizará todas as subpastas para que obtenham rwx e possam, portanto, ser percorridas e listadas.

ressalvas:

  • Isso foi testado localmente, ainda não em um compartilhamento de samba. Farei isso mais tarde, mas deve funcionar pois pretendo não impor nenhuma restrição no compartilhamento e deixar tudo tratado pelo sistema de arquivos

  • Caso as pastas sejam criadas com a pasta/subpasta mkdir -p e ambas ainda não existam, elas serão criadas tão rapidamente que o inotify não será notificado individualmente e, portanto, não alterará as pastas para rwx. Para essas pastas é como se o script não estivesse rodando. Isto não é, por si só, um problema, pois os estudantes terão menos direitos, e não mais, e nenhuma trapaça deverá ser possível.

Notas pessoais

Eu criei umnotebook ipython(notebook bash, não python) com alguns testes e funções utilitárias, se alguém estiver interessado. No entanto, é parcialmente alemão, pois eu estava com preguiça de fazer tudo em inglês novamente.

informação relacionada