Onde os programas do espaço do usuário devem salvar seus logs?

23

Estou escrevendo um script que quero executar sem privilégios. Quero que os erros encontrados pelo script sejam registrados em algum arquivo de log. Eu não tenho privilégios para escrever um /var/log. E eu não quero ter um no meu diretório pessoal.

Existe um local em que os scripts do espaço do usuário possam registrar informações de tempo de execução? Qual é a melhor prática para ter meu script registrar informações /var/logsem criar possíveis problemas de segurança? Hesito em definir uid / gid no script.

Lorde Loh.
fonte

Respostas:

8

Você não pode gravar em / var / log como um usuário normal, mas o daemon syslog fará isso por você, se você perguntar. Se você deseja registrar mensagens nos logs padrão do sistema (por exemplo /var/log/syslog), o utilitário 4.4BSD loggerpode estar disponível no seu sistema. Ele é instalado por padrão no Debian e está no bsdutilspacote de derivativos do Debian.

Você terá a vantagem de qualquer ferramenta de rotação, manutenção e monitoramento de logs preexistentes, com a desvantagem de precisar de privilégios para ler os logs do sistema e de ter as mensagens do seu script misturadas às mensagens de outros programas.

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

Existem várias opções de configuração disponíveis; você pode ler mais em man logger.

Jander
fonte
existem ligações de idioma para este utilitário? Prefere não gerar subprocessos para cada linha de stdout no aplicativo.
precisa saber é o seguinte
@ThorSummoner: Como a resposta de Gilles diz, syslogé uma rotina de biblioteca C, e C ++ pode chamar qualquer C usando extern "C". Outros idiomas geralmente fornecem uma ligação genérica a qualquer coisa C ou uma ligação a coisas específicas, mas isso depende do idioma.
dave_thompson_085
12

Se você, como usuário comum, decidir executar um programa, o local natural para seus logs estará no diretório inicial. Seu diretório pessoal é para você armazenar todos os seus arquivos, sejam eles logs de um programa que você executa ou qualquer outra coisa.

Se o programa é executado como parte do sistema, funcionando como um usuário do sistema normalmente dedicado, então o lugar natural para seus logs está em /var/log. Crie um subdiretório /var/log/myappe conceda permissões apropriadas para que seu aplicativo possa gravar nele.

Se relevante e o seu sistema operacional permitir, marque o arquivo de log como somente anexado. Somente o root pode fazer isso. Isso tem a vantagem de que, se seu aplicativo estiver comprometido, ele não poderá apagar logs anteriores, o que pode ser muito útil para análises forenses do comprometimento. Você precisará da intervenção do root para girar o log: chownpara que o arquivo de log não possa mais ser aberto pelo aplicativo rename, crie um novo arquivo somente de acréscimo com a propriedade apropriada e notifique o aplicativo para abrir o novo arquivo vazio .

Você pode fazer qualquer log de aplicativo nos logs do sistema chamando logger(1)ou syslog(3).

Gilles 'SO- parar de ser mau'
fonte
4

Geralmente para um daemon, o arquivo de log é criado roote as permissões são alteradas para que o usuário não privilegiado possa gravá-lo. logrotateé então configurado para preservar as permissões durante a rotação.

Se for um comando, não um daemon, faça o logon /tmp(de preferência usando mktemp) e informe o usuário por STDOUTonde o log foi.

bahamat
fonte
Boa ideia. Eu tenho algumas linhas no meu ~ / .profile que verifica se o dropbox demon está em execução e o inicia se não estiver. Eu estava pensando em adicionar um &para evitar atrasar o prompt, mas iniciar o dropbox grava no console. Atualmente, estou redirecionando sua saída para /dev/null, mas gostaria de ter uma maneira de depurar se o dropbox falhar ao iniciar.
Senhor Loh.
1
Confira daemonize.
bahamat
Só para saber, "as permissões são alteradas para que o usuário não privilegiado possa gravar nele". isso é feito simplesmente pelo chmod 666? ou eu tenho que adicionar usuário a um grupo ou algo assim?
Senhor Loh.
Melhor em / var / tmp, / tmp não é garantido para sobreviver a uma inicialização.
vonbrand
@LordLoh .: Sim, com chmod. Normalmente 0644ou 0664e a propriedade do usuário / grupo também é alterada para a do daemon que se espera que esteja gravando nele.
bahamat
3

Estou convencido de que os programas do espaço do usuário devem descartar logs por padrão. Eu já vi vários programas despejarem logs onde quer que fossem, e isso nunca é particularmente bem-vindo nos meus sistemas; tendendo a se acumular em um local que nunca é percebido, a menos / até que fique enorme.

Eu preferiria que, se houvesse um lugar definido para eles, estou brincando no meu sistema tentando encontrar um lugar estável para eles.

Minha primeira idéia foi usar /var/run/user/$UID/log, mas achei que no meu sistema, isso é uma montagem TMPFS, não grande o suficiente ou realmente boa para uso com logs.

Crie um lugar para eles

Como não entendo / var / run / user o suficiente para integrar com ele, optei por emular manualmente, para o usuário 1000.

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

Eu recomendaria aderir ao FHS / var / log spc para a estrutura nesta pasta, mas o formato livre de especificações para que não haja muito a cumprir.

Logrotate Config

Não existe rotação de log neste diretório fornecida pelo seu sistema, eu recomendo criar uma para o seu sistema:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

Abaixo está o meu post / var / run / user / 1000 / log anterior, não posso recomendá-lo, a menos que você realmente saiba o que está fazendo (e, se souber, me diga como também!)

talvez da seguinte maneira, mas acabei de inventar isso, porque fazia sentido para mim.

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

Integre com / var / log / user / 1000:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

ThorSummoner
fonte