Posso tornar um arquivo acessível apenas a um script e não a um usuário?

11

Eu tenho um usuário com acesso limitado no sistema (isto é, ele não é um sudoer); vamos chamá-lo de Bob .

Eu tenho um script ou um binário no qual eu, o administrador do sistema, confio e não teria problemas em executá-lo como root; vamos chamar o script get-todays-passphrase.sh . O trabalho desse script é ler os dados de um arquivo "privado" (pertencente a um usuário / grupo diferente de Bob, ou até mesmo de raiz) localizado em /srv/daily-passphrases e apenas gerar uma linha específica do arquivo: a linha que corresponde com a data de hoje.

Usuários como Bob não podem saber a senha de amanhã, mesmo que ela esteja listada no arquivo. Por esse motivo, o arquivo /srv/daily-passphrases é protegido por permissões Unix, portanto, usuários não-root como Bob não têm permissão para acessar o arquivo diretamente. No entanto, eles podem executar o script get-todays-passphrase.sh a qualquer momento, o que retorna os dados "filtrados".

Para resumir (a versão TL; DR ):

  1. Bob não consegue ler o arquivo protegido
  2. O script pode ler o arquivo protegido
  3. A qualquer momento, Bob pode executar o script que pode ler o arquivo

É possível fazer isso dentro das permissões de arquivo do Unix? Ou, se Bob iniciar um script, o script estará sempre destinado a ser executado com as mesmas permissões que Bob?

    
por IQAndreas 26.12.2014 / 16:58

2 respostas

13

Isso é realmente comum e bastante direto. sudo permite limitar aplicativos específicos que um usuário pode invocar. Em outras palavras, você não precisa dar a todos raiz ou nada; você pode dar a eles sudo permissions para executar um comando específico . Isto é exatamente o que você quer, e é uma prática muito comum para coisas como permitir que usuários empurrem repositórios Git via SSH e afins.

Para fazer isso, tudo o que você precisa fazer é adicionar uma linha a /etc/sudoers que se pareça com

bob ALL=(root) NOPASSWD: /path/to/command/you/trust

(A parte NOPASSWD: não é necessária, mas é muito comum nesta situação.) Nesse ponto, bob pode invocar /path/to/command/you/trust via sudo, mas nada mais.

Dito isso, dar a alguém raiz - o que estamos fazendo aqui - pode não ser exatamente o que você quer. Notavelmente, se houvesse alguma falha em seu roteiro, você arrisca deixar sua caixa enraizar-se. Por esse motivo, em vez disso, você pode preferir criar um usuário especificamente para possuir o arquivo especial, por exemplo, specialuser , em que chown o arquivo para eles, e ter o /etc/sudoers make bob como usuário especial. Nesse caso, a linha adicionada a sudoers seria simplesmente

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust
    
por 26.12.2014 / 18:02
7

Prefácio:

Como foi apontado nos comentários e pelas razões explicadas em esta resposta , o kernel do linux ignora o < em> setuid / setguid bit ao manusear um script. Eu não vou duplicar a resposta de Benjamin, mas vou substituir script por executabe para fazer a minha resposta correta.

Resposta curta: use setgid

etapas detalhadas:

  1. Crie um novo grupo (por exemplo, readpass)
  2. Torne esse grupo o proprietário do arquivo de frase de senha sudo chown :readpass thatfile
  3. Tornar o arquivo legível apenas pelo seu grupo sudo chmod g=r,o= thatfile
  4. Torne o seu executável sgid readpass: sudo chmod g+s thatfile

Dessa forma, seu executável será executado com as permissões do grupo proprietário e, portanto, poderá ler o arquivo.

    
por 26.12.2014 / 18:00