Evitar que o script seja sudoing

0

Eu tenho um script muito simples que executa um utilitário a cada dois dias. Este utilitário faz algumas coisas no meu sistema. É uma peça muito conhecida e amplamente utilizada de software de código aberto.

#!/usr/bin/env bash

#...do stuff here
utility

Às vezes, mas nem sempre, utility precisará que eu insira minha senha para que ela possa fazer sua parte. Eu não estou assistindo utility run, e também não estou vendo nenhuma saída, 1>/dev/null . Então, eu gostaria de qualquer tentativa utility faz com que sudo falhe automaticamente. Mais tarde eu posso executá-lo manualmente e ver o que precisa de acesso de superusuário para.

O problema é que não é o sudoing do meu script, é utility . utility é atualizado regularmente, então não quero editá-lo. Definir SUDO_ASKPASS como algo inútil parecia promissor, mas requer que sudo tenha sido chamado com -A de utility . utility man page e documentação on-line também não têm uma maneira de "evitar o sudo", nem eu tenho alguma sorte no googling "impedir o sudo do sistema".

Estou pensando em usar esse fake-sudo-test.bash :

#!/usr/bin/env bash

FAKE_SUDO="/usr/local/bin/sudo"
echo "echo 'no sudo for you $0' && exit 1" > $FAKE_SUDO
chmod u+x $FAKE_SUDO
sudo echo "I got superuser access"
\rm $FAKE_SUDO

Isso funciona porque meu $ PATH tem /usr/local/bin na frente de /usr/bin .

Você conhece uma maneira melhor de fazer isso?

PS: utility é brew , do gerenciador de pacotes homebrew para macOS, e estou usando brew upgrade em questão. Pensei em tornar a questão mais genérica que a tornasse mais útil.

$ sudo -V
Sudo version 1.8.17p1
    Sudoers policy plugin version 1.8.17p1
    Sudoers file grammar version 45
    Sudoers I/O plugin version 1.8.17p1
    
por Thomazella 04.07.2018 / 17:56

3 respostas

0

Não pode pedir uma senha se não estiver associada a um terminal:

setsid brew < /dev/null &> /dev/null

Ou, se você quiser capturar sua saída:

setsid brew < /dev/null |& cat

Isto é, supondo que você tenha setsid , que aparentemente < um href="https://stackoverflow.com/questions/36590905/is-setsid-command-missing-on-os-x"> pode não estar disponível no MacOS . Se você quiser e não tiver, existem implementações disponíveis .

Se você não tem sedsid , mas tem at :

[ -e ~/brew_$$.log ] && rm ~/brew_$$.log
at now << eof
brew > ~/brew_$$.lo_ 2>& 1 || true
mv ~/brew_$$.lo_ ~/brew_$$.log
eof
while ! [ -e ~/brew_$$.log ]; do sleep 1; done
cat ~/brew_$$.log && rm ~/brew_$$.log

executará brew now-ish desanexado do terminal, capturará a saída e copiá-la no fluxo de saída do script.

    
por 05.07.2018 / 17:52
0
  1. Saia de /etc/sudoers . Isso fará com que todas as tentativas de sudo falhem.

    Você pode precisar comentar esta linha:

    %sudo   ALL=(ALL:ALL) ALL
    

    Verifique se você tem uma maneira alternativa de obter raiz (por exemplo, senha de root) para poder desfazer isso.

  2. Modifique esta linha em /etc/sudoers :

    Defaults        env_reset
    

    em

    Defaults        env_reset,timestamp_timeout=-1
    

    Isso faz com que o sudo nunca peça uma senha. ( Fonte. )

  3. Todas as tentativas de sudo com falha são registradas em /var/log/auth.log . Execute utility e procure por uma linha como esta em auth.log :

    Jul  4 12:23:07 host sudo: test_perm : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/nick ; USER=root ; COMMAND=/bin/echo
    

    (Isso pode ser registrado em algum outro lugar no macOS; não tenho certeza.)

por 04.07.2018 / 20:42
0

No Linux, você pode desativar o efeito do bit setuid para o processo e todos os outros processos iniciados a partir dele, ativando o sinalizador no_new_privs (consulte prctl(2) ). Em scripts de shell, você pode fazer isso com o utilitário setpriv do pacote util-linux :

$ setpriv --no-new-privs sudo -v
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?

Portanto, modificar seu script para executar setpriv --no-new-privs utility em vez de utility deve fazer o trabalho, contanto que você possa viver com a mensagem de erro barulhenta acima.

(Infelizmente, você menciona brew , e isso provavelmente não funciona no macOS ... mas talvez ainda ajude outra pessoa.)

    
por 05.07.2018 / 16:55