Como registrar todos os comandos do Bash por todos os usuários em um servidor?

21

Nossa pequena empresa executa um Ubuntu Server 11.10, ao qual algumas pessoas têm acesso SSH. Às vezes, os terminais reais também são usados. Como podemos registrar localmente todos os comandos do Bash executados, junto com o usuário e a hora?

Podemos assumir que ninguém é nefasto e está tentando evitar ativamente o log, mas ainda assim preferimos que os usuários não tenham acesso direto à gravação em seus arquivos de log. As sessões simultâneas devem ser tratadas corretamente.

Lata
fonte

Respostas:

32

Para shells BASH, edite o arquivo de configuração do tempo de execução BASH em todo o sistema:

sudo -e /etc/bash.bashrc

Anexar ao final desse arquivo:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Configure o log para "local6" com um novo arquivo:

sudo -e /etc/rsyslog.d/bash.conf

E o conteúdo ...

local6.*    /var/log/commands.log

Reinicie o rsyslog:

sudo service rsyslog restart

Sair. Entrar. Voila!

Mas eu esqueci a rotação de logs:

sudo -e /etc/logrotate.d/rsyslog

Há uma lista de arquivos de log para girar da mesma maneira ...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

Portanto, adicione o novo arquivo de log dos comandos bash nessa lista:

/var/log/commands.log

Salve .


fonte
Esqueci a rotação de logs que eu adicionei à resposta.
1
Dessa forma, funciona, mas eu poderia inventar um método para contornar isso (com csh, .bash_logout talvez). Eu iria com a solução de conta da Sabacon. Estas foram excelentes leituras: linuxjournal.com/article/6144 e beginlinux.com/blog/2010/01/…
2
Acredito que isso possa ser facilmente desativado pelo usuário simplesmente redefinindo ou desabilitando PROMPT_COMMANDou executando em um shell que não seja do bash.
Stefan Lasiewski
1
@Benubird, parece que existem alguns níveis de instalação predefinidos, 8 deles sendo local0-local7: en.wikipedia.org/wiki/Syslog . 0 significa emergência, 7 significa depuração e 6 tem apenas 7, "mensagens operacionais normais".
Munchybunch
1
@yukashima porque os registros podem se tornar grandes arquivos, se não eliminados, os meios de rotação para girar os arquivos de log e delet os mais velhos para manter os logs menor ...
Badr Elmers
4

Um sistema de contabilidade de processo pode ser útil nesse sentido, particularmente o pacote acct que fornece os comandos lastcomm e ac.

Os comandos ac imprimem estatísticas sobre o tempo de conexão dos usuários, em horas. Esta é a quantidade de tempo que o usuário foi conectado ao sistema, remotamente via SSH ou um terminal serial ou enquanto estiver no console.

O comando lastcomm exibe informações sobre os comandos executados anteriormente. As entradas mais recentes são fornecidas no topo da lista. Também é exibida a quantidade total de tempo de CPU que cada processo usou.

Um tutorial antigo que pode ser útil está aqui:

http://www.linuxjournal.com/article/6144?page=0,1

Outros comandos de contabilidade como last e assim por diante podem ser encontrados neste tutorial:

http://www.techrepublic.com/article/system-accounting-in-linux/1053377

Sabacon
fonte
lastcomm é bastante inútil como um registrador de comandos. Ele registra apenas o executável que foi executado. Nenhum argumento, comutador ou caminho é registrado.
Phil_1984_
3

Você poderia usar snoopy .

O registrador Snoopy pode se adequar bem ao seu objetivo. Não se destina a ser uma solução de log inevitável, mas sim uma ferramenta útil para administradores diligentes que preferem acompanhar suas próprias ações.

Divulgação: Eu sou mantenedor do Snoopy.

Bostjan Skufca
fonte
Forneça instruções sobre como instalá-lo e usá-lo na resposta.
Muru
1
Instruções de instalação detalhadas estão disponíveis na página do snoopy github, que é o principal recurso do snoopy no momento: github.com/a2o/snoopy . Estou novamente fornecendo instruções de instalação em outros lugares, pois o local principal é mantido por design e outros não. O BTW Readme foi atualizado apenas para ser mais estruturado.
Bostjan Skufca
1
Talvez sim. Mas, mesmo sem um resumo das etapas necessárias para usar isso, esta é uma resposta apenas para link e provavelmente será excluída.
Muru
1
Bem, eu forneci um ponteiro para uma solução alternativa e viável. Se esse não é o objetivo deste site, então ele deve ser excluído, juntamente com a minha conta.
Bostjan Skufca
2
@BostjanSkufca não precisa se ofender. É apenas uma coisa do Stack Exchange ter pelo menos respostas razoavelmente independentes. Se você se opõe tanto a adicionar etapas, esse é o seu desejo. Meu voto negativo permanece. Alguém provavelmente irá aprová-lo.
Muru
3

Você pode encontrar aqui um script para registrar todos os comandos / built-ins do bash em um arquivo de texto ou syslog servidor sem usar um patch ou uma ferramenta executável especial.

Muito fácil de implantar, pois é um shell script simples que precisa ser chamado uma vez na inicialização do bash .

É gratuito e espero que atenda às suas necessidades.

François Scheurer
fonte
1
Essa é uma boa resposta, mas é preferível incluir as etapas e o script no corpo da resposta, em vez de vincular ao seu blog. Você pode editar sua resposta para incluir isso?
Tom Brossman
2
Site indisponível agora
Gaia
0

Para cuidar de várias sessões que não sobrescrevem o arquivo de histórico, você deverá colocar "shopt -s histappend" em um arquivo de inicialização do Bash. Veja, também esta pergunta sobre o mesmo problema.

pdp
fonte
0

tente isso (as soluções acima não funcionarão 100% com o bash 4.3):

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

isso faz o registro E evita o registro de registros de data e hora usados ​​para o arquivo de histórico do bash. a armadilha é necessária, pois o bash enviará os sinais para o "subjob" depois de pressionar strg + c várias vezes (testado com o bash 4.3). isso forçará o logout do usuário atual (por exemplo, logado com o sudo)

Hans-Joachim Kliemeck
fonte
0

Você também pode tentar instalar o acct. A Acct mantém uma trilha de auditoria detalhada do que está sendo feito em seus sistemas Linux.

sudo apt-get install acct
edwinksl
fonte