Permissões para um script de envio

3

Sou um assistente técnico para uma aula introdutória de programação Python (todo o trabalho é feito a partir do terminal) e estou escrevendo um script de submissão de projetos. Idealmente, eu quero uma configuração de diretório como esta:

submissions/
   user1/
      project1/
      ...
   user2/
      project1/
      ...
   ...

Idealmente, eu gostaria que nada dentro do diretório de envios fosse legível ou gravável para qualquer um dos usuários, e eu fornecerei um script de submissão que copie todo o seu trabalho no lugar certo.

Atualmente, tenho um pequeno script em Perl que faz a parte de envio e funciona quando o uso, mas como posso configurar as permissões (ou o script) para que os alunos não recebam um erro permission denied durante a execução o script (exigindo permissões de gravação para o diretório de submissões), mas eles não possuem permissões de gravação simultaneamente?

    
por JeremyKun 12.01.2012 / 20:10

3 respostas

2

Para completar, aqui está a solução mais simples. Eu a sigo com a minha visão de por que um sistema de versionamento não é apropriado.

Acabei habilitando o bit setuid no executável de envio (chmod 4755), de modo que, quando os alunos o executavam, o programa funcionava como eu. Todas as cópias de arquivos transfeririam a propriedade para mim e eu poderia tornar o diretório inteiro inacessível para os alunos. Isso envolveu alguns obstáculos para ultrapassar a segurança adicional do Perl (não conseguir a entrada, não melhorar o PATH), mas funcionou muito bem no final. O roteiro final é de cerca de 20 linhas.

A razão pela qual um sistema de versionamento é inaceitável é porque este é um primeiro curso em programação. Os alunos nunca usaram um terminal e estão confusos o suficiente com a idéia de fazer ssh em um servidor e transferir arquivos para frente e para trás. Os detalhes de um sistema de controle de versão são para classes de divisão superior (especialmente quando um aluno é propenso a erros de terminal!). E você ficaria surpreso hoje em saber quantos desses cursos realmente requerem um para aprender um sistema de controle de versão (eu fiz quatro cursos que fiz na minha graduação). Uma razão menos significativa que eu não poderia fazer um sistema de versionamento é que eu não poderia ter privilégios de superusuário no servidor, e não pediria ao professor que configurasse um sistema de versionamento só porque eu não conseguia descobrir o estúpido bit setuid.

Tudo o que eu quero para este curso é um simples envio de uma etapa para um lugar particular. O problema foi com a minha execução e falta de conhecimento sobre as permissões unix (não sabendo sobre o bit setuid), não a estrutura da minha solução. Então o comentário de Sean C. foi a dica, mas eu não o reconheci no começo porque parecia que ele queria dizer que o objetivo era executar o roteiro como root, e eu não queria que isso protegesse o mundo do meu próprio ingenuidade sobre o unix.

Aqui está o script de trabalho real e suas permissões. Por favor, indique quaisquer falhas de segurança que você possa ver.

-rwsr-xr-x 1 260s12ta 260s12ta 600 2012-01-16 23:19 submit

#!/usr/bin/perl

use File::Copy;

$ENV{"PATH"} = "/usr/bin"; # appease the perl-suid security for shell calls

my $username = getlogin() or die "Couldn't access user login: $!\n"; 
my $dir = "/home/260s12ta/labs/$username/";

foreach (@ARGV) {
   if ($_ =~ /([\w-]+\.tar\.gz)/) { # untaint the given filename
      $filename = $1;
   } else {
      die "\nInvalid submission: $_ is not a .tar.gz file.\n";
   }

   print "Submitting $filename... ";
   copy($filename, $dir) or print "Submission failed: $!\n";
   chmod(0600, "$dir/$filename") or print "Submission failed: $!\n"; 
   print "OK!\n";
}
    
por 18.01.2012 / 03:00
2

Uma continuação de um dos comentários (eu não tenho mojo suficiente para comentar ainda): parece que todo mundo tem acesso shell a um host conhecido para fazer suas tarefas. Então isso simplifica as coisas. Veja o que você pode (e deveria) fazer:

  • Você deve configurar um servidor git (preferencialmente gitolite para esse tipo de ambiente) e um repositório separado para cada aluno. Supondo que você tenha configurado os diretórios pessoais dos alunos, vá em frente & execute o ssh-keygen para cada conta de estudante e copie as chaves públicas para a sua configuração de administração do gitolite. (EDIT (esclarecimento): acesso root não é necessário para instalar o gitolite. Criar chaves públicas / privadas de estudantes requer acesso a suas contas, é claro, mas é apenas um comando que eles podem executar sozinhos se necessário. keygen).)
  • Cada aluno somente tem permissões para o repositório deles , mas você tem acesso a leitura / gravação para todos eles.
  • Eles clonam seus repositórios com todos os modelos e instruções iniciais no início do curso; depois, eles apenas puxam / empurram novas atribuições & submissões.
  • Cada projeto (atribuição) pode estar em um diretório separado (como você propôs). E você mesmo pode criar os diretórios & commit / push as alterações, e eles podem simplesmente puxar as mudanças quando é hora de iniciar o projeto. (Sim, você tem que fazer isso para cada aluno, mas isso pode ser facilmente roteirizado.) Dessa forma, você sabe que os diretórios do projeto são todos nomeados corretamente para suportar automação para classificação.
  • Perks adicionais: você pode ver quem começou o projeto na noite anterior ao vencimento ... e quem começou cedo & refinado como eles foram. Pontos de bônus para commits constantes; menos pontos para um único commit com o projeto "terminado". Você também pode (opcionalmente) ter pessoas trabalhando em equipes, e realmente ver quem fez todo o trabalho (cada pessoa teria seu próprio histórico de commit). É trivial configurar permissões dessa maneira no gitolite.

Longa história: há tanto para os alunos aprenderem, tão pouco tempo para ensinar. Nos últimos 20 anos, como desenvolvedor profissional, raramente vi um novo contratado fora da universidade realmente saber usar qualquer tipo de controle de revisão. Tudo o que eles têm é uma compreensão solta das linguagens de programação x, y & z (e Java), e não sabem nada de desenvolvimento de software. Mas não podemos culpar os estudantes, podemos? (Ahem ...) Este é um momento de ensino.

    
por 13.01.2012 / 08:15
0

Você deve ser capaz de usar o Sticky bit para permitir que os alunos apenas gravem seus próprios arquivos no compartilhamento compartilhado diretório.

Editar: não resolve o problema, pois os alunos poderiam ler o trabalho de outros alunos.

    
por 12.01.2012 / 22:09