Qual é a maneira recomendada de executar um serviço como um usuário não-root?

5

Eu tenho um script init.d simples que inicia e interrompe um processo. Eu chamo o init.d como root, mas gostaria que o processo que ele controla fosse executado como um usuário específico.

A sugestão mais comum on-line parece ser fazer

su myuser -c "my_process args"

No entanto, isso cria um segundo espaço de processo, novo shell, etc. e é um pouco deselegante.

Eu prefiro usar exec() , pois ele substitui o shell, mas isso não leva o usuário como argumento. Este é um caso em que devo usar setuid() primeiro? E quanto a definir o gid? Há alguma pegadinha para saber?

Alternativamente, existem soluções específicas de distro para executar o init.d como um usuário diferente? Meu ambiente é o Centos 6.4.

    
por ire_and_curses 28.03.2014 / 20:51

2 respostas

2

Depende da distribuição, mas as distribuições baseadas em RHEL usam uma função Bash da qual são originárias de /etc/rc.d/init.d/functions , que é chamado de daemon , que é apenas um wrapper em torno do comando runuser . Pelo que eu posso dizer nos arquivos de origem, ele é funcionalmente idêntico ao su na maioria dos casos, ele simplesmente não passa pelo PAM (provavelmente para evitar alguns problemas de galinha e ovo em certos casos).

Isso não vai realmente responder às suas objeções, mas é como os serviços fazem isso. A limpeza e conformidade geral com a lógica que você está querendo é parte da motivação para coisas como systemd

    
por 28.03.2014 / 21:12
1

O uso de su someuser -c ... é o que é necessário. Para iniciantes, setuid() é uma chamada do sistema não disponível para o código shell. Não torne isso mais difícil do que o necessário.

    
por 28.03.2014 / 21:09