Proteja o script de propriedade da raiz contra adulteração e execute o NOPASSWD autônomo de w / sudoers

1

Usando /etc/sudoers dei permissão a um usuário não root ( anyuser below) para executar um script de propriedade raiz ( test-script below) com o conjunto de tags NOPASSWD: .
O valor octal da permissão do script é 0550 . Sua execução é possível apenas com um argumento predefinido ( cache_bak below) e quando o arquivo de script não foi adulterado. O último é possível com base em uma execução condicionada por digestões SHA256 (informações relevantes na página sudoers man).

As coisas funcionam bem ... até eu testar o script para obter um resumo SHA diferente e ver como sudoers lida com ele.

O que eu fiz foi:

$ cat /home/anyuser/Scripts/test-script
#!/bin/bash
/bin/mkdir -p /var/"$1"
/bin/cp -R /var/cache/* /var/"$1" # copies content of /var/cache/ 
                                  # to /var/$1, defined by script's lone arg 
exit $?
# End of test-script

$ sudo chmod 0550 /home/anyuser/Scripts/test-script
$ sudo chown root:admin /home/anyuser/Scripts/test-script
$ ls -lsAF test-*   # check
4 -r-xr-x--- 1 root admin   75 Apr 25 18:23 test-script*

$ cat /etc/group | grep sudo   # check
sudo:x:27:anyuser

$ sudo cat /etc/sudoers         # check
Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults    insults
root    ALL = (ALL:ALL) ALL
%sudo   ALL = (root:ALL) ALL
%admin  ALL = (ALL:ALL) ALL
%wheel Somehost = (ALL:ALL) ALL
#includedir /etc/sudoers.d

Em seguida, preenchi /etc/sudoers.d com 10_user , cujo conteúdo é:

$ cat /etc/sudoers.d/10_user
Cmnd_Alias CPVARCACHE = sha256:48805bae82834f323xxxxxxxxxxxxx10145c7bbf80bae183b7de3ea52ef90637 /home/anyuser/Scripts/test-script cache_bak

# GROUP SPECS
%admin Somehost = NOPASSWD: /usr/bin/rsync

# USER SPECS
anyuser Somehost = (root) NOPASSWD: CPVARCACHE

Tudo funciona bem, ou seja, nenhuma senha é solicitada e o trabalho de cópia é concluído, até que eu simule ter adulterado test-script . Eu fiz isso adicionando uma linha a ele, por exemplo if [ "$1" ] ;then :; fi e em execução: sudo /home/anyuser/Scripts/test-script cache_bak novamente.

O shell sudo não aborta como eu esperava. Em vez disso, ele verifica se o resumo SHA se tornou diferente e solicita uma senha para anyuser executar o trabalho. No entanto, nesse caso, eu quero que a linha cmd aborte sem supervisão (silenciosamente).

Tentando redirecionar stdout e stderr para / dev / null:

# after modifying the script so its SHA digest is different from
#+ that in '/etc/sudoers.d/10_user'

$ sudo /home/anyuser/Scripts/test-script cache_bak > /dev/null 2>&1
[sudo] password for anyuser: _^C

O acima apenas redireciona a saída do processo subshell, não a do processo sudo.

Se o script for adulterado, eu preciso que o processo sudo seja abortado, presumivelmente antes mesmo de iniciar o script ... Vi coisas interessantes (por exemplo, ), mas nada realmente relevante ...

    
por Cbhihe 26.04.2016 / 02:05

1 resposta

0

Minha solução foi diretamente adaptada do do MarcoS resposta no StackOverflow é:

$ sudo -n /home/anyuser/Scripts/test-script cache_bak -- 2> sudo-stderr_"$(date+\%Y\%m\&d-\%H\%M\%S)".log

EXPLICAÇÃO:
O sinalizador -n suprime a solicitação passwd do sudo. Portanto, nada é exibido em stdout .
Se uma senha, no entanto, é necessária, sudo morre normalmente após enviar uma mensagem de erro para stdderr . Por exemplo:

$ sudo -n ls
sudo: a password is required

é imediatamente seguido por sudo morte do processo.

Para redirecionar sudo stderr , primeiro adicione -- após o cmd do sudo para significar que sudo pára de interpretar o que vem depois como argumentos de linha cmd. O redirecionamento de stderr é, como de costume, denotado por 2> seguido por ad-hoc log-filename.

    
por Cbhihe 26.04.2016 / 18:31