O logrotate não lê mais o arquivo de configuração com link simbólico devido à propriedade não raiz

15

Atualmente, estamos atualizando do Ubuntu 12.04 LTS para 14.04 LTS em nossos servidores de aplicativos ruby ​​on rails e percebemos que os arquivos de log não estão mais girando.

Nas duas máquinas, temos um arquivo de /var/app-name/config/logrotatepropriedade de nosso usuário unix, deployerque contém um arquivo de logrotate válido da seguinte maneira:

/var/app-name/log/*.log {
  daily
  rotate 365
  delaycompress
  compress
  dateext
  dateformat -%Y%m%d
  missingok
  copytruncate
}

Isso é vinculado ao /etc/logrotate.d/diretório comoapp-name

No nosso servidor Ubuntu 12.04, temos o logrotate 3.7.8, que roda muito bem. Ele entra no var/app-name/log/diretório e gira todos os arquivos de log de saída

Mas no servidor Ubuntu 14.04, temos o logrotate 3.8.7, que não gira os arquivos de log para o nosso aplicativo.

Quando depuro isso via sudo logrotate -d -f /etc/logrotate/.conf, recebo a seguinte saída:

Ignoring /etc/logrotate.d/app-name because the file owner is wrong (should be root).

Perseguindo isso no código, parece que essa alteração foi adicionada ao fluxo de versão 3.8.x: https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526

Se eu alterar a propriedade do arquivo com o link simbólico /var/app-name/config/logrotatepara root, ele começará a funcionar novamente. Mas, como esse arquivo faz parte do meu aplicativo e criado pela estrutura de implantação capistrano que usamos neste estado, prefiro não precisar alterar sua propriedade, quando costumava funcionar bem.

Então, os arquivos de configuração com link simbólico são recomendados / suportados pelo logrotate?

E, nesse caso, a recusa de usar meu arquivo (de propriedade de deployer), que está vinculado ao /etc/logrotate.ddiretório, deve ser visto como um bug?

Ou existe outra abordagem recomendada para a rotação de logs específica do aplicativo?

(também solicitado no StackExchange unix )

baleia-fantasma
fonte
Boa pergunta! Vejo que houve algumas discussões mais tarde sobre a verificação do nome de usuário "root" em vez de uid == 0, mas isso também não desencadeou a pergunta por que a propriedade da raiz é necessária.
agtoever

Respostas:

6

O problema é que um arquivo de configuração logrotate pode executar qualquer comando como root (usando prerotate / estrofes postrotate). Portanto, você efetivamente concederia deployerprivilégios de root ao usuário, dando-lhe acesso de gravação aos arquivos /etc/logrotate.d/. Então não, não é um bug.

Se você confia no usuário do implementador, acho que você pode resolver o problema concedendo a ele direitos de copiar arquivos no sudo /etc/logrotate.d/. Supondo, é claro, que o usuário do implementador não seja o mesmo usuário em que o aplicativo Web está sendo executado.

pelle
fonte
Nossa abordagem sempre foi a de preferir desvincular os diretórios externos ao aplicativo para os arquivos do aplicativo, de modo que cada implantação não apenas elimine o novo aplicativo, mas também qualquer alteração no arquivo de configuração. Mesmo conceder ao implementador o direito de implantar código fora do diretório do aplicativo viola essa abordagem - mas ter que exibir um arquivo de aplicativo como propriedade raiz após a implantação também parece uma coisa ruim (tm). Talvez a abordagem original, portanto, não pode mais trabalhar bem com logrotate 3.8.0+
phantomwhale
2
@phantomwhale Sua abordagem original implicitamente deu privilégios de root completos ao usuário do implementador. Isso não é novidade no logrotate 3.8. Se você deseja restringir os direitos do implementador e, ao mesmo tempo, permitir que ele atualize a configuração, acho que você precisa usar algo diferente de logrotate.
Pelle
2

Percebo que estou atrasado para a festa, mas estava tendo um problema semelhante e pensei em compartilhar minha solução.

Meus problemas começaram quando logrotatenão leram a configuração que eu havia escrito. Não queria implantar novas configurações em uma pasta pertencente à raiz, porque não queria que o usuário de implantação tivesse acesso raiz a nada .

No começo, tentei executar logrotatecomo o usuário de implantação, mas ele reclamou de ter acesso ao arquivo de estado em /var/lib/logrotate/state. Então eu li a página de manual. Você pode especificar o arquivo de estado que logrotateusa! Portanto, pareceu-me uma solução melhor configurar um cron diário para executar logrotatecomo o usuário de implantação com um arquivo de estado personalizado. Dessa forma, nenhum acesso root é necessário pelo usuário de implantação ou pelo aplicativo.

Veja como você especifica o arquivo de estado:

logrotate --state /path/to/status /path/to/custom_logrotate.conf

Agora você pode executar o logrotate como qualquer usuário e proprietário de configuração que desejar!

dayer4b
fonte