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
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.
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
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:
setuidgid
: setuidgid user /home/user/unprivileged.sh
setuidgid
: setuidgid user /home/user/unprivileged.sh
setuidgid
: setuidgid user /home/user/unprivileged.sh
chpst
: chpst -u user /home/user/unprivileged.sh
runuid
: runuid user /home/user/unprivileged.sh
s6-setuidgid
: s6-setuidgid user /home/user/unprivileged.sh
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.
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)
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
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).