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 (ou seja, ele não é um sudoer); vamos chamá-lo de Bob .

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

Usuários como Bob não têm permissão para saber a senha de amanhã, mesmo que esteja listada no arquivo. Por esse motivo, o arquivo /srv/daily-passphrasesé protegido pelas permissões do Unix, para que usuários não raiz como Bob não tenham permissão para acessar o arquivo diretamente. No entanto, eles podem executar o get-todays-passphrase.shscript 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 nas permissões de arquivo Unix? Ou, se Bob iniciar um script, o script estará sempre condenado a ser executado com as mesmas permissões que Bob?

IQAndreas
fonte

Respostas:

13

Isso é realmente comum e bastante direto. sudopermite limitar aplicativos específicos que um usuário pode chamar. Em outras palavras, você não precisa dar raiz ou nada a eles; você pode conceder a eles sudopermissões para executar um comando específico . É exatamente isso que você deseja e é uma prática muito comum para coisas como permitir que os usuários enviem repositórios Git via SSH e similares.

Para fazer isso, tudo o que você precisa fazer é adicionar uma linha /etc/sudoersparecida com algo como

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

(A NOPASSWD:parte não é necessária, mas é muito comum nessa situação.) Nesse ponto, bobpode-se chamar /path/to/command/you/trustvia sudo, mas nada mais.

Dito isto, dar a alguém uma raiz - o que estamos fazendo aqui - pode não ser exatamente o que você deseja. Notavelmente, se houver alguma falha no seu script, você corre o risco de deixar sua caixa enraizada. Por esse motivo, você pode preferir criar um usuário especificamente para ser o proprietário do arquivo especial - digamos, specialuser- então chowno arquivo para ele e /etc/sudoersfazer com bobque esse usuário seja o especial. Nesse caso, a linha à qual você adiciona sudoersseria simplesmente

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust
Benjamin Pollack
fonte
7
Sugiro não seguir o caminho "raiz" - crie um usuário / grupo especial para esse fim.
guntbert
Bom ponto; Emendarei a resposta.
Benjamin Pollack
7

Prefácio:

Como foi apontado nos comentários e pelas razões explicadas nesta resposta, o kernel do linux ignora o bit setuid / setguid ao manipular um script. Não vou duplicar a resposta de Benjamin, mas substituirei o script por executabe para corrigir minha resposta.


Resposta curta: use setgid

Etapas detalhadas:

  1. Crie um novo grupo (por exemplo, readpass)
  2. Torne esse grupo o proprietário do arquivo de senha sudo chown :readpass thatfile
  3. Tornar o arquivo legível apenas por seu grupo sudo chmod g=r,o= thatfile
  4. Faça seu sgid readpass executável :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.

Guntbert
fonte
2
Setgid e setuid não são facilmente viáveis ​​em scripts, certo?
Muru
1
Você não pode criar um script setgid no Linux: o bit setgid será ignorado. Em vez disso, adicione uma regra sudo permitindo que bob seja executado thatfilecom o grupo readpass.
Gilles 'SO- stop be evil'