A importância de rastrear comandos com o HISTFILE

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

[ Hits: 15.117 ]

 


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

Perdeu a senha de root? Não esquenta!

Conheça o BackBox Linux! Mais uma distribuição para "penetration tests"

Um milhão de computadores contra Bill Gates

Filtrando porcarias com Squid III

Permitir mudança de senha via SSH (e só!)

  

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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts