Como definir o bit setgid de um programa para permitir que ele mude sua pasta de grupo?

0

As pré-condições são um pouco complexas, então aqui está o contexto:

  • Existe um programa que é iniciado por meio de um script de shell;
  • O script de shell inicia o programa por meio de um arquivo .jar;
  • Eu quero que este programa armazene seu cache em uma subpasta /var/opt/ , digamos /var/opt/program/ ;
  • O conteúdo do cache não deve estar acessível diretamente, somente através do programa
  • O programa deve estar disponível para todos os usuários locais em um sistema

A ideia principal que eu criei é criar um grupo que tenha todas as permissões necessárias para ler e editar o conteúdo da pasta cache. Não quero adicionar usuários ao grupo manualmente, então, procurei por opções alternativas. Se bem entendi, o setgid bit deve me sirva perfeitamente. Minha compreensão é a seguinte:

  • Uma pasta com o conjunto setgid bit força todo o seu conteúdo a ter o mesmo grupo de proprietários, como a pasta possui e força todas as suas subpastas a seguirem as mesmas regras. Enquanto isso, ele não fornece nenhuma permissão extra para aqueles que não estão incluídos no grupo do proprietário da pasta, isto é, a pasta com a máscara drwxrws - x não permite que outros editem e leiam seu conteúdo .
  • Um programa com o conjunto% bit_de% sempre é executado em nome do grupo proprietário, permitindo que os usuários executem ações respeitando as permissões do grupo.

Meus passos da seguinte forma:

  • Eu criei um grupo mygroup ;
  • Eu criei uma pasta setgid e configurei seu grupo de proprietários para mygroup ;
  • eu defino /var/opt/program/ bit para a pasta
  • Defino o grupo de proprietários de scripts de shells do programa como mygroup ;
  • eu defino setgid bit para o script de shell

O problema é que o programa não é capaz de criar e editar arquivos na pasta de cache que está sendo lançada por um usuário sem permissões de root. Qualquer conselho será apreciado.

Ambiente do UPD:

SO: Ubuntu 16.04.2 LTS

    
por The Dreams Wind 16.06.2017 / 22:04

2 respostas

2
  • A folder with the setgid bit set force all its content to have the same owner group as the folder

Sim. Arquivos recém-criados recebem o grupo do diretório, o grupo do arquivo pode ser alterado posteriormente. (Nós os chamamos diretórios, não pastas.)

  • A program with the setgid bit set always run on behalf of the owner group

Sim. Embora você não precise setgid no diretório, se você está apenas criando arquivos através de um binário setgid. Um programa setgid obtém o grupo em questão como o grupo primário, portanto, quaisquer arquivos que ele cria são de propriedade desse grupo por padrão (e não o grupo do usuário chamador).

  • I set setgid bit for the shell script

Esta é a parte que não funciona. A maioria dos sistemas não respeita bits setuid e setgid em scripts interpretados , já que isso leva facilmente a vários problemas de segurança .

O que você precisa fazer é escrever um wrapper de programa C que execute o script e faça o wrapper setgid; ou (preferencialmente) use algo como sudo para permitir que seus usuários executem o script com os direitos de outro grupo. ( sudo já lida com coisas como limpeza de variáveis de ambiente que podem ser problemáticas.) Em ambos os casos, verifique se o script e seu interpretador estão em diretórios que os usuários não podem modificar.

Para sudo , a configuração necessária (em /etc/sudoers ) seria algo assim:

username ALL=(:privgroup) /path/to/script

Isso permitiria que o usuário username executasse /path/to/script como o grupo privgroup . Você pode usar %groupname em vez de username para permitir que todos os membros de groupname executem o script. Os usuários precisarão executar o script usando sudo -g privgroup /path/to/script porque sudo por padrão tentará executar o comando nomeado como root , e nós não permitimos isso. Mas você pode escrever um wrapper para esse comando.

    
por 16.06.2017 / 23:31
0

A maioria dos sistemas operacionais ignora o setgid em scripts. O diretório /var/opt/program deve ser group writable e setgid. ls -ld /var/opt/program deve produzir algo como drwxrwsr-x 159 root mygroup 5406 Jun 15 10:25 /var/opt/program . Qualquer usuário regular (não raiz) que precise executar o programa deve ter mygroup como um grupo suplementar. Adicione-os usando usermod com um comando similar a usermod -a -G mygroup LOGIN para cada usuário substituindo LOGIN por seu nome de usuário. Ou edite /etc/group e anexe a linha ao mygroup com uma lista separada por vírgula desses usuários. Ex: mygroup:x:5000:joe,frank,ellen,mark onde os usuários joe, frank, ellen e mark estarão executando esse script.

    
por 16.06.2017 / 22:21