A importância de rastrear comandos com o HISTFILE

Publicado por Hertz Raya Zocolan Silva em 06/08/2006

[ Hits: 13.304 ]

 


A importância de rastrear comandos com o HISTFILE



A variável HISTFILE é de extrema importância para o administrador do sistema, pois podemos conferir todos os comandos que foram executados pelo usuário.

A seguir vamos configurar esta variável para ela fique read-only e o usuário não possa alterá-la.

Geralmente para burlar o HISTFILE o usuário loga-se e abre outro shell para que a variável seja trocada. Para que isto não ocorra editamos os arquivos /etc/profile e /etc/bashrc ou em algumas distribuições, /etc/bash.bashrc.

O processo de customização do HISTFILE é simples e de fácil implementação, para isto basta ter a senha do root.

Para customizar a variável, faça o seguinte.

Para exemplificar o arquivo de log do arquivo de HISTFILE, considere os seguintes dados:

Login: uxhsilva logou-se no dia 23/05/2006 as 09:00:00 Hs

# echo $HISTFILE
/.HISTORY/uxhsilva/05_2006/history_uxhsilva_23052006_090000.log

A linha acima é o caminho e nome do arquivo do HISTFILE. O conteúdo dele, por exemplo, é esse:

Login : uxhsilva_root from pts/2 --> (179.16.1.204) - 23/05/2006 09:00:00 - PID : 14213
Logout : uxhsilva_root from pts/2 --> (179.16.1.204) - 23/05/2006 11:58:07 - PID : 14213
ls -l
clear
ll bin
ls -l
clear
ls -lx
crontab -l
cd /var/spool
cd cron
ll
cd tabs/
ll
cat root
exit

No exemplo acima a string "uxhsilva_root" indica que o usuário uxhsilva tem privilégios de root, pois é identificado com o comando "id -un".

O que está entre parênteses é o IP de onde este usuário abriu a sessão, quer dizer, a sessão originou-se do IP: 179.16.1.204.

Na customização do HISTFILE será criado um arquivo de controle para toda vez que os usuários postgres, root e oracle logarem-se.

Este arquivo fica em /var/log/login/root.2323 (onde 2323 é o PID), por exemplo.

Este arquivo contém o nome do arquivo de HISTFILE, este arquivo serve para monitorar ações de determinados usuários do sistema. Pode-se criar um script que roda a cada minuto verificando a existência destes arquivos no /var/log/login e enviar por e-mail os comandos que foram executados por determinado usuário.

Para customizar o HISTFILE siga os passos abaixo:

Como root execute os seguintes passos:

1. Criar diretório do HISTFILE e de log:

# mkdir /.HISTORY
# chmod 777 /.HISTORY
# mkdir /var/log/login
# chmod 777 /var/log/login
# cp /etc/profile /etc/profile.ori
# cp /etc/bashrc /etc/bashrc.ori

Ou
# cp /etc/bash.bashrc /etc/bash.bashrc.ori

2. Incluir linhas de código no /etc/profile.

3. Incluir linhas de código no /etc/bashrc ou no /etc/bash.bashrc (depende da distribuição do seu Linux).

Após executar o passo 1, inclua as linhas abaixo no /etc/profile, ao final do mesmo:

TTY="`tty | sed 's:/dev/::g'`"
IPSRC="`who | grep ${TTY} | awk '{print $6}'`"
MES="`date +%m_%Y`"
DIA="`date +%d%m%Y_%H%M%S`"

mkdir -p /.HISTORY/`id -un`/${MES}
HISTFILE="/.HISTORY/`id -un`/${MES}/history_`logname`_${DIA}.log"

cat<<EOT>>${HISTFILE}
Login : `logname`_`id -un` from ${TTY} --> ${IPSRC} - `date +%d/%m/%Y` `date +%H:%M:%S` - PID : $$
EOT

if [ -f /etc/.bash_logout ]
then
 &nbssp; echo OK>/dev/null
else

# postgres --> 282f3c1a5e7a21462aa16ba4944c44dcf6abe52f
# root --> 552c0ba71b1046a083583ebf943cc9aa09f39a32
# oracle --> 45ad32906b7c8d3fea4093201d9e27359c564802


cat<<EOTF>/etc/.bash_logout
# ~/.bash_logout

TTY="\`tty | sed 's:/dev/::g'\`"
IPSRC="\`who | grep \${TTY} | awk '{print \$6}'\`"

cat<<EOT>>\${HISTFILE}
Logout : \`logname\`_\`id -un\` from \${TTY} --> \${IPSRC} - \`date +%d/%m/%Y\` \`date +%H:%M:%S\` - PID : \$\$
EOT

if [ "\`id -un | openssl dgst -sha1\`" = "552c0ba71b1046a083583ebf943cc9aa09f39a32" ]
then
 &nbssp; if [ "\`logname | openssl dgst -sha1\`" = "282f3c1a5e7a21462aa16ba4944c44dcf6abe52f" ]
 &nbssp; then
 &nbssp; &nbssp; &nbssp;echo "" > /dev/null
 &nbssp; else
 &nbssp; &nbssp; &nbssp;mkdir -p /var/log/login
 &nbssp; &nbssp; &nbssp;echo \${HISTFILE} > /var/log/login/\`id -un\`.\$\$
 &nbssp; fi
fi

if [ "\`id -un | openssl dgst -sha1\`" = "282f3c1a5e7a21462aa16ba4944c44dcf6abe52f" ]
then
 &nbssp; mkdir -p /var/log/login
 &nbssp; chmod 777 /var/log/login 2>/dev/null
 &nbssp; echo \${HISTFILE} > /var/log/login/\`id -un\`.\$\$
fi

clear
EOTF
chmod 777 /etc/.bash_logout 2>/dev/null
fi

if [ -f ${HOME}/.bash_logout ]
then
 &nbssp; HASH_LOGOUT="`cat ${HOME}/.bash_logout | openssl dgst -sha1`"
 &nbssp; HASH_LOGOUT="`echo ${HASH_LOGOUT}`"
 &nbssp; if [ "$HASH_LOGOUT" = "ceb4000623711205e71e78cc47cf6b884d815e41" ]
 &nbssp; then
 &nbssp; &nbssp; &nbssp;echo OK > /dev/null
 &nbssp; else
 &nbssp; &nbssp; &nbssp;cp /etc/.bash_logout ${HOME}/.bash_logout
 &nbssp; &nbssp; &nbssp;chmod 777 ${HOME}/.bash_logout
 &nbssp; fi
else
 &nbssp; cp /etc/.bash_logout ${HOME}/.bash_logout
 &nbssp; chmod 440 ${HOME}/.bash_logout
fi

HISTSIZE=90000
readonly HISTFILE
readonly HISTSIZE

Após executar o passo 2, inclua as linhas abaixo no /etc/bashrc ou /etc/bash.bashrc, no início do mesmo:

conf_hist="`echo $HISTFILE | grep HISTORY | wc -l`"
conf_hist="`echo $conf_hist`"

if [ "${conf_hist}" -eq 0 ]
then
 &nbssp; &nbssp;TTY="`tty | sed 's:/dev/::g'`"
 &nbssp; &nbssp;IPSRC="`who | grep ${TTY} | awk '{print $6}'`"
 &nbssp; &nbssp;MES="`date +%m_%Y`"
 &nbssp; &nbssp;DIA="`date +%d%m%Y_%H%M%S`"
 &nbssp; &nbssp;mkdir -p /.HISTORY/`id -un`/${MES}
 &nbssp; &nbssp;HISTFILE="/.HISTORY/`id -un`/${MES}/history_`logname`_${DIA}.log"

cat<<EOT>>${HISTFILE}
Login &nbssp;: `logname`_`id -un` from ${TTY} --> ${IPSRC} - `date +%d/%m/%Y` `date +%H:%M:%S` - PID : $$
EOT

 &nbssp; if [ -f ${HOME}/.bash_logout ]
 &nbssp; then
 &nbssp; &nbssp; &nbssp;echo OK> /dev/null
 &nbssp; else
 &nbssp; &nbssp; &nbssp;cp /etc/skel/.bash_logout ${HOME}/.bash_logout
 &nbssp; &nbssp; &nbssp;chmod 440 ${HOME}/.bash_logout
 &nbssp; fi

 &nbssp; HISTSIZE=90000
 &nbssp; readonly HISTSIZE
 &nbssp; readonly HISTFILE
else
 &nbssp; echo "" > /dev/null
fi

unset conf_hist

Após o passo 3, abra uma nova sessão no shell ou faça logout e volte novamente para o shell e execute a linha de comando abaixo:

# echo $HISTFILE
/.HISTORY/uxhsilva/05_2006/history_uxhsilva_23052006_125753.log

Tente trocar o valor da variável HISTFILE:

# HISTFILE=/tmp/teste.txt
-bash: HISTFILE: readonly variable

Abra um novo shell:

# bash
# echo $HISTFILE

/.HISTORY/uxhsilva/05_2006/history_uxhsilva_23052006_125908.log

Veja que ao abrir um novo shell um novo HISTFILE é gerado.

E fique mais sossegado ao centralizar todos HISTFILE´s em um único caminho.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Introdução ao Hydra - Brute-force

Backtrack 4 - 0trace

Ativando proxy transparente no SuSefirewall

Uma dica de firewall baseado em iptables

Definindo a inicialização em modo gráfico ou texto no Red Hat

  

Comentários
[1] Comentário enviado por thelinux em 07/08/2006 - 11:44h

Excelente dica. Bem útil.

[2] Comentário enviado por K1LL -9 em 14/09/2006 - 03:13h

Eu não li o artigo com a devida atenção (03:04 da matina ... sono).
Porém achei obrigatório como definir uma senha de root após a instalação do server.

Mas aí vai minha pergunta (desculpe se for idiota):
Se antes do user deslogar de cada sessão (ou a cada comando mal-intencionado) ele rodar o comando history -c
não vai limpar pelo menos a parte interessante do log ?
Será que não vai constar apenas quem se logou ?


Abraço kra ! bom artigo.

[3] Comentário enviado por removido em 26/03/2013 - 23:12h

Encontrei agora essa dica.

A única que conhecia era mudar um atributo do arquivo .bash_history no filesystem (não é o rwx do chmod) usando o chattr para o arquivo só receber acréscimo de textos ao final, chamado de modo append.

Deste modo o arquivo não é sobrescrito e nem apagado, todos os comandos serão armazenados como se fossem um log.



Contribuir com comentário