Usuário root para executar um script sem privilégio, mas permitir que comandos sudo sejam executados sem senha

1

Então, como root (em /etc/rc.local ) eu quero rodar um script sem privilégios de root, por exemplo, usando su

su - myuser -c myscript

mas no myscript eu quero executar um comando com sudo sem dar uma senha. No entanto, eu não quero deixar o myuser executar esse comando sem uma senha (caso contrário, não queira adicionar aos sudoers, etc.)

Isso é possível?

    
por eskhool 06.10.2018 / 14:15

1 resposta

1

Se o comando requerido não estiver dentro de um bloco (por exemplo, loop ou condicional), você pode dividir o script em três: os comandos anteriores são executados como myuser , o comando protected é executado com sudo prompt quando já root ) e os comandos restantes, também são executados como myuser : -

su - myuser -c myscript-preamble
sudo myscript-protected-command
su - myuser -c myscript-postamble

Mais geralmente, há um truque que você pode usar com sudo , usando as credenciais salvas: -

sudo -u myuser sudo -S true <<< password 2>/dev/null
su - myuser -c myscript
sudo -u myuser sudo -k

Existem várias considerações - estas são as primeiras que vêm à mente: -

  • O script (ou pelo menos a primeira linha) deve ser executado em um arquivo protegido por leitura ( -rwx------ ) ou em um diretório protegido por execução ( drwx------ ), ambos pertencentes a root .
  • O truque requer que sudo credenciais sejam lembradas por um tempo definido (um padrão normal) e que sudo em myscript seja executado dentro desse tempo.
  • Se myuser executar myscript enquanto root estiver executando simultaneamente, as credenciais lembradas serão usadas se o comando sudo for atingido antes de root runs sudo -k .

Como você pode ver, não é uma solução ideal do ponto de vista de segurança, mas pode ser viável em seu ambiente.

Caso contrário, você precisará usar sudo -A , conforme descrito neste extrato do manual sudo : -

 -A, --askpass
             Normally, if sudo requires a password, it will read it from the user's
             terminal.  If the -A (askpass) option is specified, a (possibly graphical)
             helper program is executed to read the user's password and output the password
             to the standard output.  If the SUDO_ASKPASS environment variable is set, it
             specifies the path to the helper program.  Otherwise, if sudo.conf(5) contains
             a line specifying the askpass program, that value will be used.  For example:

                 # Path to askpass helper program
                 Path askpass /usr/X11R6/bin/ssh-askpass

             If no askpass program is available, sudo will exit with an error.

Para implementar isso, você precisará escrever um programa que verifique se está sendo executado como root : em caso afirmativo, ele exibe a senha para myuser (a partir de dados ofuscados, é claro); caso contrário, ele solicitará a senha como normal e exibirá a resposta do usuário.

Então, sim, é possível fazer o que você quer, mas pode envolver uma boa quantidade de trabalho, dependendo do nível de segurança que você precisa.

    
por 06.10.2018 / 16:52

Tags