Como logar todos os comandos do linux para um servidor de logs

13

Eu quero que cada comando digitado vá para um servidor de registros. Já configurado é o syslog-ng para enviar todos os logs para o servidor de logs.

Estou interessado em todo e qualquer método para fazer isso. Eu esperaria alguma discussão sobre usuários e segurança desonestos, mas o primeiro objetivo primário é simplesmente fazer com que as sessões sejam registradas. Todas as sessões são sobre ssh, mas os comandos de conexão do console também devem ser registrados. Eu gostaria que isso acontecesse para qualquer shell, mas o principal é o bash. (Mais uma vez, eu sei que um usuário não autorizado pode criar seu próprio shell ...)

    
por Leo 12.11.2010 / 17:20

7 respostas

29

Não é assim que você aborda o problema. Uma vez que você concede acesso ao shell a um usuário, você está confiando que o usuário faça qualquer coisa para a qual ele / ela tenha as permissões apropriadas. Esqueça o log de comandos, existem muitas maneiras de executar um comando em qualquer sistema Unix.

Por exemplo, o usuário pode iniciar um cliente de e-mail (o único comando logado é pine , por exemplo), lá ele seleciona "Compor", que inicia o VI, e do VI ele lança qualquer comando que desejar através de :!cmd . Este comando não está logado em nenhum lugar, e do ponto de vista do sistema, é como qualquer aplicativo auxiliar chamado pelo VI, como grep ou sort. O único comando registrado pelo shell foi pine .

Parece que o que você realmente quer é chamado de auditoria . Ative o subsistema de auditoria e use o comando auditctl e o daemon auditd do pacote auditoria para controlar o que é logado. Mais informações estão na página de manual auditctl (8) .

Observe que o registro de cada instanciação do processo também pode não ser o ideal. Por exemplo, o simples ./configure para um pacote de software (criado usando o autotools) é notável por criar milhares de instanciações de processo. Isso inundará o log de auditoria com tanto ruído que será muito difícil analisá-lo mais tarde.

    
por 12.11.2010 / 17:55
13

Instale o pacote acct (o nome do pacote varia de acordo com a distribuição, também conhecida como contabilidade de processo) e use lastcomm <username> :

[mithrandir]-[/home/sernin]-[1951] % lastcomm sernin
tr                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
tr                     sernin   pts/2      0.02 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
fortune                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xmodmap                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xrdb                   sernin   pts/2      0.00 secs Fri Nov 12 12:02
sh                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
cpp                    sernin   pts/2      0.00 secs Fri Nov 12 12:02

Você também pode pesquisar por tty ou nome do comando. Como de costume, man lastcomm para mais informações.

    
por 12.11.2010 / 18:05
11

Se você estiver disposto a fazer uma pequena programação em C, você pode fazer isso escrevendo uma biblioteca que envolve execve, registra no syslog e então dlopen na biblioteca que contém o syscall execve real. Então, em / etc / environment, defina LD_PRELOAD como o caminho da biblioteca que você criou.

Você vai querer ter cuidado ao inserir um loop aqui, então você pode querer registrar apenas os executáveis de determinados binários, ou excluir outros (como o syslog) de serem registrados.

    
por 12.11.2010 / 17:28
7

Parece-me que você está procurando por algo como rootsh ( página do manual ). Para citar a página man:

Rootsh is a wrapper for shells which logs all echoed keystrokes and terminal output to a file and/or to syslog.

Apesar do nome, isso pode ser usado para qualquer usuário.

    
por 12.11.2010 / 17:44
2

Provavelmente, é melhor que os usuários usem o sudo (ou similar) para executar os comandos de que você gosta e confiar nos usuários em algum nível. À medida que você se aproxima das coisas que "controlam totalmente", mais difícil é rastrear o que elas estão fazendo. Recentemente, tenho procurado ferramentas como essa, por exemplo. Principalmente eles apenas criam logs que são difíceis de gerenciar se você tiver usuários e máquinas suficientes para fazer com que tal coisa valha a pena. :)

Considere todas as informações que você irá gerar. Com quanto você se importa? Provavelmente muito pouco - então você está gerando logs que são praticamente inúteis. Auditar as coisas com as quais você realmente se importa, como os outros estão sugerindo, provavelmente leva você a um estado final melhor.

    
por 12.11.2010 / 22:49
1

O Bash pode ser compilado com suporte a syslog desde o 4.1.

Não é infalível (a contabilidade do processo pode ser melhor para isso), mas é principalmente interação com o usuário; o volume deve ser mais gerenciável e você poderá mudar para algo mais detalhado se suspeitar de algo anormal.

Dito isso, isso é intrusivo e, como usuário, eu esperaria um aviso de privacidade bem específico antes de você começar a fazer isso.

    
por 13.11.2010 / 00:12
0

Há também o sudosh ( link ) que fará o registro da sessão. Você tem a opção de executá-lo como um shell definido para um usuário ou através do sudo. Ele rastreia os timings de cada sessão para que você possa reproduzir a sessão e assisti-la (incluindo sessões de edição e outros).

    
por 25.05.2011 / 18:00