Como faço para eliminar privilégios de root em scripts de shell?

12

A opção "--up" no OpenVPN é normalmente usada para roteamento, etc. E assim é processada antes que o OpenVPN descarte privilégios de root para ser executado como ninguém. No entanto, estou invocando scripts de shell que precisam ser executados como um usuário sem privilégios.

Como faço isso? Eu estudei Drop Process Privileges , especialmente as respostas do polinômio e tylerl, mas eu não entendo como implemento. Eu estou trabalhando no Centos 6.5, e suid é bloqueado, tanto como "chmod u + s" e como "setuid ()".

Existe um plugin OpenVPN ("openvpn-down-root.so") que permite que os scripts chamados pela opção "--down" sejam executados como root. Pode haver um equivalente, como "openvpn-up-user.so", mas não o encontrei.

Editar0

Por resposta de Nikola Kotur, instalei run-rpm de Ian Meyer . Embora o comando chpst funcione no terminal, no script up ele falha com "comando não encontrado". O que funciona é "sudo chpst", além de definir a exibição e o idioma corretos. Por favor, veja Por que o meu terminal não gera caracteres unicode corretamente? Dado que, o script up precisa dessas quatro linhas:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo chpst -u user -U user /home/user/unprivileged.sh &

Editar1

Por comentário de 0xC0000022L, eu acho que "sudo -u user" funciona tão bem quanto "sudo chpst -u usuário -U user":

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo -u user /home/user/unprivileged.sh &

Eu estudarei man sudoers e atualizarei se / quando eu tiver sudo sozinho para trabalhar.

    
por mirimir 30.05.2014 / 09:15

5 respostas

7

Eu uso a ferramenta chpst do runit para tarefas como esta. Por exemplo, no script para cima, chame seu script sem privilégios:

chpst -u nobody /path/to/script
    
por 30.05.2014 / 11:16
7

Cobrindo apenas o runit e o sudo tem muita falta. Na verdade, existe toda uma família de conjuntos de ferramentas, como o runit, e uma grande variedade de ferramentas para fazer exatamente isso, a tarefa para a qual foram projetadas:

  • Os daemontools de Daniel J. Bernstein, setuidgid :
    setuidgid user /home/user/unprivileged.sh
  • A liberdade de Adam Sampson tem setuidgid :
    setuidgid user /home/user/unprivileged.sh
  • O daemontools-encore de Bruce Guenter tem setuidgid :
    setuidgid user /home/user/unprivileged.sh
  • O runito de Gerrit Pape tem chpst :
    chpst -u user /home/user/unprivileged.sh
  • O criminoso de Wayne Marshall tem runuid :
    runuid user /home/user/unprivileged.sh
  • O s6 de Laurent Bercot tem s6-setuidgid :
    s6-setuidgid user /home/user/unprivileged.sh
  • meu nosh tem setuidgid :
    setuidgid user /home/user/unprivileged.sh

Eles não se misturam na diferente tarefa de adicionar privilégios, e nunca caem em um modo interativo.

Seus problemas de adesão são pouco mais do que o seu esquecimento de ter sbin , bem como bin em seu PATH , a propósito.

Leitura adicional

por 24.03.2017 / 23:06
3

script que libera privilégios e executa outro script (mas aqui eu acabei de fazê-lo para executar ele mesmo):

#!/bin/sh

id='id -u'
safeuser="nobody"

if [ $id = "0" ]
then
         # we're root. dangerous!
        sudo -u $safeuser $0
else
    echo "I'm not root"
    id
fi

Exemplo:

root@n3:/tmp/x# id
uid=0(root) gid=0(root) группы=0(root)
root@n3:/tmp/x# ./drop.sh
I'm not root
uid=65534(nobody) gid=65534(nogroup) группы=65534(nogroup)
    
por 30.05.2014 / 23:38
1

E sobre:

sudo -Eu <user> <command>

Você reclamou sobre o ambiente em um comentário anterior, então também pode comparar as diferenças entre as saídas:

sudo -u <user> printenv
sudo -Eu <user> printenv
    
por 01.06.2014 / 05:47
0

No Linux, você pode usar runuser ou setpriv se uma sessão do PAM não for necessária (ambas de util-linux ):

runuser -u USER [--] COMMAND [ARGUMENTS...]

setpriv --reuid=1000 --regid=1000 --init-groups COMMAND [ARGUMENTS...]  # Like su/runuser/sudo
setpriv --reuid=1000 --regid=1000 --clear-groups COMMAND [ARGUMENTS...]  # Like daemontools setuid(8)

Na página do manual su :

su is mostly designed for unprivileged users, the recommended solution for privileged users (e.g. scripts executed by root) is to use non-set-user-ID command runuser(1) that does not require authentication and provide separate PAM configuration. If the PAM session is not required at all then the recommend solution is to use command setpriv(1).

    
por 02.11.2018 / 06:19