Como registrar todos os comandos linux em um servidor de logs

13

Eu quero que cada comando digitado vá para um servidor de logs. Já está 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 não autorizados e segurança, mas o primeiro objetivo principal é simplesmente fazer com que as sessões sejam registradas. Todas as sessões terminaram 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. (Novamente, eu sei que um usuário não autorizado pode criar seu próprio shell ...)

Leo
fonte

Respostas:

29

Não é assim que você aborda o problema. Depois de conceder acesso ao shell a um usuário, você está confiando a ele que faça tudo o que ele / ela tiver 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 email (o único comando registrado é pine, por exemplo); nele, ele seleciona "Compor", que inicia o VI e, a partir do VI, ele lança qualquer comando que desejar :!cmd. Este comando não é registrado 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 deseja é chamado de auditoria . Ative o subsistema de auditoria e use o auditctlcomando e o auditddaemon do pacote de auditoria para controlar o que está registrado. Mais informações estão na página do manual auditctl (8) .

Observe que o registro de todas as instâncias do processo também pode não ser o ideal. Por exemplo, o simples ./configurepara um pacote de software (criado usando ferramentas automáticas) é notável por criar milhares de instanciações de processo. Isso inundará o registro de auditoria com tanto ruído que se torna muito difícil analisá-lo mais tarde.

Juliano
fonte
13

Instale o acctpacote (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 procurar por tty ou nome do comando. Como de costume, man lastcommpara mais informações.

Sam Halicke
fonte
11

Se você estiver disposto a fazer um pouco de programação C, poderá fazer isso escrevendo uma biblioteca que agrupe execve, faça logon no syslog e, em seguida, dlopen é a biblioteca que contém o syscall real do execve. Em / etc / environment, defina LD_PRELOAD para o caminho da biblioteca que você criou.

Você deve ter cuidado ao inserir um loop aqui, portanto, você pode querer apenas registrar os executivos de certos binários ou excluir outros (como o syslog) do log.

marca
fonte
Na verdade, isso é bastante útil. A primeira pesquisa no wrapper execve exibe o snoopy ( sourceforge.net/projects/snoopylogger ). Parece perto do que eu estava procurando, embora um pouco detalhado. Após o teste, percebo que vou precisar da aprovação da gerência para colocar isso em um ambiente de produção. (Um aviso para tudo que você datilografa nefastas)
Leo
@Leo Desde a versão 2.0.0, o Snoopy suporta especificação de formato de log personalizado ao executar ./configure, portanto o excesso de verbosidade não deve ser mais um problema. Divulgação: mantenedor do Snoopy aqui.
Bostjan Skufca
7

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

Rootsh é um invólucro para shells que registra todas as teclas digitadas e a saída do terminal em um arquivo e / ou no syslog.

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

Andrew M.
fonte
2

Provavelmente é melhor ter usuários usando o sudo (ou similar) para executar comandos importantes e confiar nos usuários em algum nível. À medida que você se aproxima de "controlar totalmente" as coisas, mais difícil é rastrear o que elas estão fazendo. Recentemente, estive analisando 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 isso valer a pena. :)

Considere todas as informações que você estará gerando. Quanto disso você se importa? Provavelmente muito pouco - então você está gerando logs que geralmente não têm valor. Auditar as coisas com as quais você realmente se importa, como os outros sugerem, provavelmente leva você a um estado final melhor.

dannysauer
fonte
1

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

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

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

Tobu
fonte
0

Também há sudosh ( http://sudosh.sourceforge.net ) 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. Também rastreia os tempos de cada sessão, para que você possa reproduzi-la e assisti-la (incluindo editar sessões e outros enfeites).

Bastão
fonte