A opção "--up" no OpenVPN é normalmente usada para roteamento etc. E, portanto, é processada antes que o OpenVPN descarte os privilégios de root para executar como ninguém. No entanto, estou invocando scripts de shell que precisam executar como um usuário não privilegiado.
Como faço isso? Estudei privilégios de processo de entrega, especialmente as respostas de polinômios e de tylerl, mas não entendo como implementar. Estou trabalhando no Centos 6.5 e suid está bloqueado, como "chmod u + s" e como "setuid ()".
Existe um plugin OpenVPN ("openvpn-down-root.so") que permite que scripts chamados pela opção "--down" sejam executados como raiz. Pode haver um equivalente, como "openvpn-up-user.so", mas eu não o encontrei.
Editar0
De acordo com a resposta de Nikola Kotur, instalei o runit-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" mais a configuração da tela e do idioma adequados. Consulte Por que meu terminal não gera caracteres unicode corretamente? Dado isso, 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 &
Edit1
Pelo comentário de 0xC0000022L, acho que "sudo -u user" funciona tão bem quanto "sudo chpst -u user -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 &
Vou estudar sudoers para homens e atualizar se / quando eu tiver o sudo sozinho para trabalhar.
fonte
Respostas:
Eu uso a ferramenta runit
chpst
para tarefas como esta. Por exemplo, no script up, chame seu script não privilegiado:fonte
Cobrir apenas runit e sudo erra muito. Na verdade, existe toda uma família de conjuntos de ferramentas, como runit, e uma grande variedade de ferramentas para fazer exatamente isso, a mesma tarefa para a qual eles foram projetados:
setuidgid
:setuidgid
:setuidgid
:chpst
:runuid
:s6-setuidgid
:setuidgid
:Eles não se misturam na tarefa diferente de adicionar privilégios e nunca caem no modo interativo.
Seus problemas resolvidos são pouco mais do que você esquecer de ter
sbin
e também osbin
seusPATH
, a propósito.Leitura adicional
fonte
script que remove privilégios e executa outro script (mas aqui eu fiz apenas para rodar sozinho):
Exemplo:
fonte
/etc/sudoers
permite ser muito específico sobre quais variáveis de ambiente podem ser transmitidas para o programa executadosudo
e assim por diante.man sudoers
. Honestamente, quem usasudo
apenas porsudo su -
ou ao contexto de troca de usuário não tem nenhuma pista sobre o que está por trás deste programa incrível e quanto você pode bloquear as coisas para programas individuais, usuários, anfitriões etc ...$0
; o chamador pode definir um script$0
para literalmente qualquer coisa que ele queira que seja. E use mais citações.$0
for/directory/name with spaces/script
(e lembre-se, os usuários podem criar links simbólicos arbitrários em locais que possuem, mesmo se eles não usamexec -a somename yourscript
para chamaryourscript
com um$0
dossomename
), então você deseja obtersudo -u nobody /directory/name with spaces
, comwith
espaces
passados como argumentos separados para o seu comando .A respeito:
Você reclamou do ambiente em um comentário anterior, portanto, você também pode comparar as diferenças entre as saídas:
fonte
No Linux, você pode usar
runuser
ousetpriv
se uma sessão PAM não for necessária (ambas deutil-linux
):Na
su
página do manual:fonte