Linux ACL para envio de teste de alunos, Criar, Anexar, Excluir, mas não Ler para outros

0

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 idéia principal é ter uma pasta onde os alunos possam enviar testes e não ler o que outros colegas escreveram. Não deve haver limitações desnecessárias. Os alunos devem ter permissão para criar diretórios, copiar seus arquivos. Eles devem apenas ser separados uns dos outros e não ler / excluir arquivos de outros.

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 na referida pasta para coletar todos os dados.

Como eu faria para replicar algo semelhante no Linux com ACLs (setfacl, getfacl) ou, se possível, sem que eles usem somente permissões padrão do linux?

    
por P.Meyer 31.01.2016 / 00:48

1 resposta

0

Eu responderei minha própria pergunta. Se alguém puder melhorar esta resposta, ou tiver algumas perguntas, então faça isso. Este problema particular me incomodou por algum tempo agora.

O que eu perguntei parece não ser possível com POSIX ACLs de acordo com: Group + rx permissão apenas em diretórios usando ACL como ACLs não podem distinguir entre arquivos e pastas, ao aplicar direitos herdados.

Além disso, duas possíveis soluções alternativas foram mencionadas:

  • inotify (que eu 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

Crie o grupo de pastas principais no grupo de professores. O grupo deve existir e ser o grupo primário de 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 / apagar

chmod g+s fld 

Não permitir sobrescrever / excluir arquivos de outras pessoas (como as permissões / tmp)

chmod +t fld

Agora, as ACLs serão definidas 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 principal, 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::---

Estas permissões sozinhas têm algum mérito. Se o script abaixo não for executado, as permissões da pasta acima permitirão que os alunos criem / leiam // editar / excluir 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 ele funciona apenas diretamente nessa pasta, não em subpastas. Isso deve ser suficiente para submissões simples de vários arquivos pelos alunos.

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

default:other::---

Isso significa que nenhum direito será concedido a "outros" para arquivos / pastas nesse compartilhamento. A idéia é que as pastas sozinhas devem obter o rwx em "outros", os arquivos não precisam alterar as permissões.

inotify-Script: submission_folder.sh

Este script deve ser executado por root, o único argumento será esta pasta, que acabou de ser criada acima. Como um 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 elas obtenham o rwx e possam, portanto, ser percorridas e listadas.

advertências:

  • Isso foi testado localmente, e não em um compartilhamento de samba ainda. Eu farei isso mais tarde, mas deve funcionar como eu pretendo não impor quaisquer restrições no compartilhamento e deixar tudo ser manipulado pelo sistema de arquivos

  • Se as pastas forem criadas com a pasta / subpasta mkdir -p e as duas não existirem ainda, 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 em execução. Este não é um problema em si, já que os alunos terão menos direitos, não mais e não será possível fazer batota

Notas pessoais

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

    
por 03.02.2016 / 12:53