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

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

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

A sugestão mais comum online parece ser fazer

su myuser -c "my_process args"

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

Eu preferiria usar exec(), pois substitui o shell, mas não leva um usuário como argumento. Este é um caso em que devo usar setuid()primeiro? Que tal definir o gid? Há alguma dica a ser observada?

Como alternativa, existem soluções específicas da distribuição para executar o init.d como um usuário diferente? Meu ambiente é Centos 6.4.

Responder1

Depende da distribuição, mas as distros baseadas em RHEL usam uma função Bash que eles originam e /etc/rc.d/init.d/functionsque é chamada, daemonque é apenas um wrapper em torno do runusercomando. Pelo que posso dizer nos arquivos de origem, é funcionalmente idêntico suna maioria dos casos, apenas não passa pelo PAM (provavelmente para evitar alguns problemas do ovo e da galinha em certos casos).

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

Responder2

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

informação relacionada