Como posso eliminar privilégios e ainda limpar meu arquivo pid em / var / run?

4

Eu tenho um daemon chamado foo . Meu script de inicialização /etc/init.d/foo inicia o daemon foo e armazena seu pidfile em /var/run/foo.pid , que parece ser o local padrão. Como /etc/init.d/foo deve ser executado como root, não há problemas para criar e excluir pidfiles em /var/run .

O daemon foo é realmente o programa /usr/sbin/foo que deve ser invocado como root no script de inicialização, mas imediatamente descarta seus privilégios para o usuário foo sem privilégios. No entanto, também quero que esse programa /usr/sbin/foo exclua seu pidfile quando ele sair devido a um erro crítico. Mas como ele já abandonou seus privilégios, ele não tem mais a capacidade de excluir arquivos do diretório /var/run .

Minha abordagem atual é usar seteuid em vez de setuid para descartar meus privilégios e re-aumentar os privilégios imediatamente antes de sair, para que eu possa excluir adequadamente o pidfile de /var/run . No entanto, encontrei muitos, muitos problemas com várias bibliotecas e programas externos que ficam malucos quando invocados com um euid diferente do uid.

Existe alguma outra maneira de conseguir isso? Eu suponho que a outra opção é simplesmente colocar meu pidfile em um diretório que é gravável pelos usuários root e foo . Mas todos os nossos outros pidfiles estão em /var/run , incluindo pidfiles de outros programas que são executados como usuários sem privilégios, então eu gostaria de colocar o arquivo foo.pid lá também.

Existe alguma maneira de fazer isso além de usar seteuid ?

    
por Eli Courtwright 03.11.2010 / 15:03

3 respostas

7

Não coloque o arquivo PID em /var/run/foo.pid , coloque-o em /var/run/foo/foo.pid e tenha /var/run/foo de propriedade do usuário foo e grupo foo . Dessa forma, você pode excluir o arquivo pid antes de sair e não precisar aumentar seu nível de privilégio.

Observe, no entanto, que essa é uma prática de segurança ruim, pois permitir que o seu manejo de aplicativo sem privilégios com o arquivo abra uma brecha de segurança: imagine que seu aplicativo foi sequestrado (afinal, qual era o objetivo de descartar privilégios se não o aplicativo pode ser atacado?) - agora, o invasor atualiza o arquivo pid e coloca, digamos, o número do pid do sshd lá. Agora, quando os scripts de todo o sistema (em execução como root) tentarem parar seu aplicativo usando esse arquivo pid, eles irão encerrar o sshd. Este é apenas um exemplo, há mais maneiras de abusar do seu sistema. Em suma, o arquivo pid deve ser criado antes de eliminar privilégios e a limpeza dos arquivos pid deve ser executada pelos scripts do sistema. - Dmitry D. Khlebnikov

Uma idéia ainda melhor seria mudar para um sistema init como systemd ou Upstart que não requer arquivos PID para gerenciar serviços.

    
por 03.11.2010 / 15:07
2

Você pode criar um novo processo antes de executar seu daemon. O processo pai permanece com o usuário privilegiado root . O processo filho descarta seus privilégios para foo user. Esse processo faz o daemon real funcionar.

O processo pai criará o arquivo PID depois de bifurcar seu filho e o removerá quando o filho terminar.

    
por 03.11.2010 / 15:19
2

Dando uma olhada no meu sistema Ubuntu, vejo que alguns softwares instalados criaram diretórios sob / var / run, de propriedade de um usuário não-root, como sugere a jcollie.

Outra opção é ter o pidfile de propriedade do usuário não-root e zerar o arquivo em vez de excluí-lo.

    
por 03.11.2010 / 15:24

Tags