Posso usar permissões ou facls para limitar a criação de arquivos em um diretório sem limitar a criação de diretórios?

2

Eu tenho alguns diretórios com permissões bastante permissivas, que ficam cheios de arquivos (scripts) criados por vários usuários diferentes. Eu tento incentivar as pessoas a criarem seu próprio subdiretório e adicionar seus arquivos lá, mas outras não, deixando o diretório de scripts raiz cheio de coisas que os outros não estão interessados.

Como tive sucesso apenas em persuadir as pessoas a criar arquivos no diretório raiz, mas ainda precisamos que todos os usuários acessem qualquer um dos scripts, esperava que pudéssemos aplicar a política de scripts sendo escritos em um subdiretório usando permissões ou listas de controle de acesso.

Então, é possível permitir que os usuários criem apenas diretórios na pasta de scripts raiz, mas permitir que eles criem scripts apenas nesses subdiretórios?

    
por Mark Booth 13.04.2015 / 15:17

1 resposta

2

Não é uma ótima solução, mas:

  • torna o diretório só gravável por você ou algum usuário designado ou pseudo-usuário, ou, melhor ainda, um grupo (de que seus usuários não são membros),
  • escreva cuidadosamente um wrapper para mkdir e instale-o como setuid ou setgid.


  • Se você escolher a opção group / setgid, pode ser tão simples quanto
    mkdir("root_scripts/<user's folder name>", 0755);

    E, se você não se importa em fazer a pasta de propriedade do usuário quem criou, é tudo que você precisa fazer se o programa for setuid. Caso contrário,
  • Se você fizer o programa setuid root, seja muito com muito cuidado fazer um milhão de cheques para uso inadequado e, em seguida,
    mkdir("root_scripts/<user's folder name>", 0755);
    chown("root_scripts/<user's folder name>", <user's uid>, <user's gid>);
  • Se você fizer o programa setuid para um usuário não-root, criar um subdiretório gravável pelo mundo em (ou em algum lugar abaixo) o seu diretório root_scripts , e faça algo como
    euid = geteuid();
    ruid = getruid();
    seteuid(ruid);          // Person who's running the program
    mkdir("root_scripts/.writable_subdir/<user's folder name>", 0755);
    seteuid(euid);          // Owner of the program and the top-level directory
    rename("root_scripts/.writable_subdir/<user's folder name>, "root_scripts/<user's folder name>");
por 13.04.2015 / 22:35