Maneira mais limpa de reiniciar os serviços daemontools

2

No nosso produto, criamos serviços usando daemontools. Um dos meus serviços se parece com isso,

/service/test/run
/service/test/log/run (has multilog command to log into ./main dir)
/service/test/log/main/..

Todo o processo e seus diretórios são de propriedade do usuário root. Agora há um requisito de segurança para mudar assim,

1. Service should run in non-root user.
2. Log main directory should be readable only to user and groups.

Para isso, eu tenho que mudar o arquivo 'run' no diretório 'log'. Também preciso alterar as permissões do diretório 'principal' abaixo dele.

Observe que todos esses arquivos em '/ service' eram de propriedade de test-1.0-0.rpm. Quando eu atualizo meu rpm, ele sobrescreve o arquivo de execução existente e recebe um erro como este,

multilog: fatal: unable to lock directory ./main: access denied

Eu sei que não devemos substituir o arquivo 'run' em tempo de execução. Eu planejei seguir estas etapas na seção% post do meu script rpm,

//Stop service
svc -d /service/test/log

//Moving the main directory
mv /service/test/log/main /service/test/log/main_old

//Updated run file has code to create main with limited permissions.

//Start service
svc -u /service/test/log

Em alguns artigos, eles sugeriram recriar o arquivo 'lock' em 'log / main'. Existe alguma outra maneira mais limpa de fazer isso sem mover o diretório 'principal'? Se não, é seguro seguir os passos acima?

    
por Prabu 18.08.2014 / 11:14

1 resposta

1

1. Service should run in non-root user.

Fácil o suficiente. Você copiaria sua definição de serviço para um diretório de serviço na casa do "usuário". Por exemplo, digamos que você crie um usuário, chamamos de niftyuser . Digamos também que seu serviço seja chamado de niftyservice . Então, você copiaria sua definição de serviço para um diretório controlado por esse usuário; por uma questão de discussão (e não necessariamente que você queira fazer isso), digamos que você usará o diretório pessoal do niftyuser . Então,

cp -Rav /etc/service/niftyservice /home/niftyuser/service/niftyservice

criará a definição de serviço. Então você teria que iniciar uma varredura de serviço no diretório desse usuário, mas iniciado com as credenciais do usuário. Se você escrevesse como um script, seria parecido com:

#!/bin/sh
exec setuidgid niftyuser svscan /home/niftyuser/service

O resultado será uma árvore de serviço controlada por esse usuário. Note que, ao fazer deste um script, você pode dividir a sub-árvore do seu processo controlado pelo usuário na árvore principal do processo ... você pode ver o exemplo do runit para como isso é , pois o runit foi inspirado nos daemontools.

2. Log main directory should be readable only to user and groups.

Francamente, eu simplesmente faço /service/(service-name)/log/main um link simbólico para um diretório real, ou seja, /service/niftyservice/log/main pontos para /var/log/niftyservice . No script de execução do diretório de log, aponte para ./main como o destino; Isso significa que você pode configurar a definição uma vez e mover o registro conforme necessário simplesmente alterando o link simbólico. E, finalmente, para resolver a questão (2), você definiria as permissões de usuário e grupo para /var/log/niftyservice conforme necessário e definiria o modo como 775. Isso permitiria que qualquer pessoa lesse os arquivos, mas apenas o usuário ou grupo para gravar eles.

    
por 28.04.2015 / 00:57