Shell - Lida com vários arquivos de histórico de comandos

4

Onde eu trabalho, para fins de segurança e auditoria, temos que manter um arquivo de histórico para cada sessão (usuário, data, terminal, etc no nome do arquivo).

Obviamente, a variável HISTFILE está configurada para somente leitura ( readonly HISTFILE ), portanto, um usuário normal não pode definir um arquivo de histórico diferente (seja não root, sem alterar /etc/profile ).

Isso é o que temos no /etc/profile :

EXTENDED_HISTORY=ON
readonly EXTENDED_HISTORY
export EXTENDED_HISTORY
HISTFILE=$HOME/.history/'date +%y%m%d.%H%M%S'.${WHO_USER:-user}.${WHO_TERMINAL:-term}.${SSH_PORT:-port}.${MY_PID:-pid}
readonly HISTFILE
export HISTFILE

O grande problema é que não podemos procurar por comandos antigos, exceto fazer um grep nos arquivos mais antigos.

Você tem uma solução simples ou até mesmo uma solução melhor para manter a auditoria e ainda poder compartilhar o histórico de comandos em várias sessões?

Nós usamos ksh e bash.

    
por tmow 23.11.2012 / 11:24

2 respostas

4

Os arquivos do histórico da shell são uma maneira ruim de auditar comandos. Eles podem ser modificados ou ignorados por usuários. Eles são úteis somente se você confiar nos usuários para não ignorar deliberadamente ou acidentalmente o mecanismo de auditoria. Por exemplo, comandos iniciados a partir de uma GUI, de um editor, etc. não são gravados dessa maneira. Há muitas outras maneiras de um usuário iniciar comandos não registrados e até mesmo manter a negação plausível de que eles estavam fazendo isso por conveniência ou sem perceber e não como uma tentativa deliberada de ignorar uma medida de segurança.

Se você fizer os arquivos de histórico apenas com acréscimo (o que requer a execução de chattr +a como root no arquivo de histórico), tudo que foi gravado permanecerá gravado, mas ainda assim é fácil ignorar a gravação.

Em vez de manter arquivos de histórico separados, você poderia mantém um único arquivo de histórico e faz o backup regularmente. Isso manterá a data em que os comandos foram executados, mas não o terminal.

Se você precisa ter alguma confiança de que os logs correspondem aos comandos que foram executados, os arquivos do histórico do shell são a ferramenta errada. Use o daemon de auditoria. Configure-o para registrar todas as chamadas execve .

auditctl -A exit,always -S execve

Veja as seguintes perguntas para mais informações:

por 24.11.2012 / 01:33
1

Não estou 100% claro sobre o que você está pedindo, mas eis como obtenho um histórico separado para cada sessão. É basicamente nomeado de acordo com o host e o pty. Isso é para o bash.

# Unique history file per shell session.
HISTSIZE=300
HISTFILE=$HOME/.bash_hist_${HOSTNAME/.*/}_$(basename $(tty))
SAVEHIST=500
export HISTCONTROL=ignoredups

Isso está em um arquivo ~/.bashrc . Eu não entendo o que você quer dizer com você não pode mudar o HISTFILE.

Uma desvantagem é que você não pode prever qual será o histórico da sessão. Mas para auditar você pode grep o conjunto completo:

grep something ~/.bash_hist_*

Mas você mantém o contexto de uma sessão em um arquivo separado.

    
por 23.11.2012 / 16:09