A importância de rastrear comandos com o HISTFILE
Dica publicada em Linux / Segurança
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:
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
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
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.