Auditando/monitorando o root e demais usuários do linux





Rootsh é um shell (pseudo shell) que registra tudo o que um usuário do linux, inclusive o root, vê, digita e faz em seu terminal. Um wrapper para o interpretador de comando, onde faz uma camada repassando comandos e saídas para ambos os lados (tela e bash) e guardando tudo em logs.

 Em outras palavras, o rootsh possui quase a funcionalidade de um keylogger, porém feito com o objetivo de ter uma auditória, monitoramento e registro seguro do que cada usuário está realizando no terminal (pode-se configurar para todos os usuários, somente alguns ou somente o root).

Segundo o desenvolvedor: "Isto é útil se você tiver mais de um administrador do sistema para um servidor e você quer um registro exato do que qualquer usuário faz."
 

SIM, isto é permitido num ambiente de trabalho ou desenvolvimento, desde que cada integrante da equipe esteja ciente que está sendo monitorado e/ou conte na politica de segurança (que deve estar acessível a todos). Não é só de logs de Squid que se vive um monitoramento efetivo.

O ambiente ideal para o uso é onde todos os que possuem (e precisam) de acesso ao root sabem de sua existência (do rootsh) e do monitoramento realizado, e usá-lo não só para auditória/monitoramento, mas para uma ferramenta de log extremamente usual e também uma prevenção (ou modo de rastreio) caso seus servidores venham a ser atacados/invadidos.

O objetivo principal do rootsh é permitir que você dê ao usuário o acesso ao root mas mantendo o monitoramento e logs sobre suas ações. O usuário não terá a senha de root, usará o comando sudo, mas terá no final das contas, o terminal logado como root.



Se você quer saber se o rootsh "pega" o que digitaram e quer descobrir as senhas usadas, já pode parar por aqui. A resposta é NÃO. O rootsh não foi feito para o conceito real do que é um keylogger (aquilo que pega as senhas dos winusers), novamente, seu propósito é ter uma auditória, monitoramento e registro seguro do que estão fazendo ao logar como root (ou também o que determinado usuário está fazendo, ou até mesmo todos).

 O rootsh trabalha entre o usuário e o shell (bash) real. Ele passa as informações de um lado para o outro e direciona isto também para um arquivo de log.







Compilação e opções de instalação


A versão atual do rootsh é a 1.5.3 (de 2008), apesar de um pouco antiga, funciona perfeitamente. Nos meus testes utilizei um Debian Wheezy (Servidor Web).

Como dependência, basicamente é o compilador que você precisa para poder instalar o rootsh.

Dependências: gcc, gcc-multilib, make, sudo e bash.

Faça o download do código-fonte e descompacte-o na 

pasta /usr/local (ou /opt preferivelmente).




Neste ponto, você tem que decidir algumas coisas importantes antes de começar a construir os binários.

Leia o arquivo INSTALL no diretório do rootsh, onde todas as escolhas estão documentadas.

Instalado as dependências, a compilação é simples (./configure com a opções escolhidas, make e make install).

Basicamente, para a compilação você precisa decidir de qual forma será utilizado o rootsh, pois é nesta fase, onde por exemplo, se escolhe entre manter os logs dentro do servidor (no diretório padrão ou num especifico) ou enviar para o syslog.

Optei por colocar os arquivos de log do rootsh no diretório padrão, /var /log, criando lá um diretório chamado rootsh (esta é a definição padrão na compilação), informei na compilação para não usar o syslog e também para não numerar as linhas dos logs.

O diretório padrão para os logs é /var/log/rootsh

Caso queira personalizar isto, coloque no parâmetro do ./configure:
- -with-logdir=/novo/caminho/para/logs
Caso você vá utilizar o syslog, deverá desabilitar os logs locais:
- -disable-logfile

Por default, esta opção não é usada, ou seja, os logs serão locais caso não informe nada. Na documentação também pede para desabilitar os logs locais caso você queira usar o rootsh como interpretador de comandos (shell) de algum usuário.

Caso não vá usar o syslog:
- -disable-syslog

Obs.: Ou você usa o syslog ou deixa os logs locais. Nunca desabilite as duas opções.

Se você compilou rootsh com as configurações padrão, as teclas e saída serão enviados linha a linha para o daemon syslog usando prioridade local5.info

Mudar o nível default de level facility dos logs para syslog:

- -enable-syslog=LEVEL.FACILITY

O default é:
priority "local5.notice"

Em cada linha do log é inserido o número desta linha, um contador formado por 3 digitos (informado qual o número de linha em que o usuário ou o root digitou/visualizou), para desabilitar esta numeração, use:
- -disable-linenumbering

Após instalar com sucesso, você precisa criar o diretório de logs.

Caso desabilitou o syslog e deixou que o rootsh use o diretório padrão para os logs, você deverá criar o diretório rootsh dentro de /var/log:
mkdir /var/log/rootsh

Dentro deste diretório estará todos os logs de todos os usuários monitorados.

No meu exemplo, eu conpilei da seguinte forma:
./configure –disable-syslog –disable-linenumbering
make
make install







Configuração e modos de uso


Ao instalar o rootsh você vai colocar dentro do sudoers a permissão para o usuário apenas rodar o rootsh (o rootsh vai abrir uma sessão como root, dando assim, todos os privilégios a este usuário).

Como na linha:

eslih ALL=/usr/local/bin/rootsh


Com isto, o usuário eslih vai digitar em seu terminal "sudo rootsh" (será o único comando que ele vai conseguir digitar com o sudo).

Ao inserir a sua senha (do usuário eslih), irá entrar no terminal com o root, irá abrir uma nova sessão logado como root (e todas as informações visualizadas, comandos dados etc.. será gravado nos logs.).

"Sudo su", "sudo qualquer outra coisa", não vai funcionar. Pode até tentar o "su root", mas ele não vai ter a senha do root.


Usuário eslih tentando executar "sudo mkdir /teste"

Comando "sudo rootsh" - Usuário eslih logado como root com sucesso e sendo monitorado




Com isto, todos que precisam usar o root, vão usar sudo rootsh e possuir acesso ao terminal do root, porém tudo sendo monitorado/registrado.

Os que não necessitam de acesso ao root não possuem este acesso obviamente né? E também tira aquele cliche de sempre os sysadmin colocar um "user ALL=ALL(ALL)" dentro do sudoers e depois ficar com pé atrás, desconfiado,....

Obs: Desta maneira, logando com o "su root" (ou somente "su") não estará sendo "monitorado" pelo rootsh nos logs...

Dica nº0: *tentar* Monitorar o root sem ele saber

Para que dificulte um pouco (quem for usar não saber explicitamente que você está monitorando-o), pode-se criar um link simbolico do rootsh com outro nome (por exemplo, admin ou simplesmente root), assim, no sudoers ficaria:

eslih ALL=/usr/local/bin/root


O usuário digitaria para usar o root então, "sudo root".

Ok, não é uma dica safada, pois ele vai estar como root (dããã), um cat, whereis e alguns outros comandinhos básicos dá para sacar o que está sendo usado.

Dica nº1: Monitorar os usuários do linux (todos)

No 7º campo do /etc/passwd conta a informação de qual interpretador (shell) o usuário irá utilizar. Geralmente está assim:

"/bin/bash"

da linha toda:

"eslih:x:1004:1004:Esli Silva:/home/eslih:/bin/bash"
Apenas substituía-o por "/usr/local/bin/rootsh" (ou pelo nome do link simbólico que você criou).

Não se preocupe, pois na compilação padrão do rootsh, ele aponta para o /bin/bash para usar, então, não haverá mudanças para o usuário comum.

"eslih:x:1004:1004:Esli Silva:/home/eslih:/usr/local/bin/rootsh"

Também coloque o caminho do binário rootsh (ou do link simbólico) dentro do arquivo /etc/shells, neste arquivo está o caminho absoluto de todos os shells existentes, apenas insira /usr/local/bin/rootsh no final. Se não inserir a distro pode reclamar, falando que não é um shell declarado.

O problema que pode ocorrer neste caso é a falta de permissão para a criação do arquivo de log.

Neste caso você pode dar mudar as permissões do diretório /var/log/rootsh para que todos os usuários tenham direito (mas aí perde a confiança no caso de uma auditória ou o risco do arquivo ser apagado existe), ou usar o syslog na compilação. Mandando para um servidor de logs centralizado, por exemplo.

Obviamente, usar esta opção além de ser mais transparente (invisível) para o usuário, caso alguém logue como root (ou usando o sudo ou su), não precisará informar nada, implicitamente será chamado o rootsh, já que ele está configurado como o shell padrão do root também (caso faça isto).

Desta maneira é bem improvável (difícil, mas nem tanto) que seja percebido, onde o usuário só vai conseguir saber se:

Achar o rootsh está instalado (path);

achar os logs no servidor (caso não esteja direcionando-os para um syslog);

verificando os arquivos /etc/shells e /etc/passwd, mas se estiver usando link simbólico e ter alterado o nome do rootsh na compilação, provavel que qualquer usuário, um invasor no sistema ou até mesmo o root(sysadmin) não fique sabendo explicitamente do monitoramento.







Arquivos de Log


Para visualizar os logs, preferencialmente use o tail ou head...


A diferença (e o ponto interessante) do rootsh é que ele grava os logs mesmo se o usuário limpar seu histórico (já que o rootsh não '‘conversa’' ou depende do mesmo) usando o comando "history -c" ou até mesmo apagar ou limpar o arquivo bash_history dentro do home do root.


Exemplo:

Abaixo, o usuário eslih logou-se como root (sendo monitorado pelo rootsh).
Criou um diretório teste na raiz do sistema, depois removeu este diretório.
Após isto, apagou seus rastros.


Na próxima tela, estou visualizando os logs gerado pelo rootsh. Onde mostra exatamente o que o usuário eslih fez logado como root na sessão da tela acima.




Cada arquivo de log contém o monitoramento a partir do login do usuário como root (pelo comando sudo rootsh) até o seu logoff. Do inicio ao fim de cada sessão. Cada arquivo de log refere-se a uma sessão.

O nome do log contém um .closed no final informando que aqueles logs são de uma sessão que o usuário já saiu (exit/logoff), caso não tenha, significa que o usuário ainda está logado como root.

No diretório de log, ele cria um arquivo cujo prefixo é o nome do usuário (no meu exemplo, o prefixo "eslih." e "root."), depois vem o timestamp de data e hora (AAAAMMDDHHMMSS - AnoMesDiaHoraMinutoSegundo), e o ID do processo. Caso o usuário já fechou a sessão, o nome do arquivo de log terminará com um ".closed"

Após o timestamp, há 6 caracteres hexadecimais que indica o ID do processo. No exemplo abaixo, o "03eca" é o ID do processo do rootsh que foi executado durante esta sessão.



Exemplo:
eslih.20140710225359.03eca.closed
O arquivo acima tem os logs de uma sessão onde o usuário eslih logou-se em 10/07/2014 as 22:53.



Na tela abaixo, eu visualizo o log com o comando:
head -n 15 eslih.20140710154049.01675.closed

Para facilitar a leitura, eu selecionei as linhas referentes ao log, onde é informado:
Usuário eslih abriu uma sessão em /dev/pts/3 as 15:40 em 10/07/2014;
Deu o comando cd (foi para o seu home);
tentou criar um diretório chamado teste dentro de /etc (comando "mkdir /etc/teste");
Foi retornado na tela dele permissão negada e em seguida o usuário encerrou a sessão (comando logout).




 

Outras Opções

 Após instalado e funcionando, você pode chamar o rootsh usando determinadas flags, lembrando que para monitorar o root, sempre logue-se com o comando “sudo rootsh”.

Mas pode-se chama-lo como uma aplicação independente e registrar a sua própria sessão, por exemplo:

rootsh -i
Inicia o shell com login, ou informando um comando a ser executado

rootsh -u User
Inicia o rootsh monitorando uma sessão de usuário especifico, por exemplo: “rootsh -u eslih”

-f 

Use o -f caso queira um outro nome para os arquivos de log.

-d 

Use-o caso queira que a sessão que será iniciada o rootsh grave os logs em outro diretório sem ser o padrão definido na compilação. (Usando junto com o -f, mude o nome também).

-no-logfile
Desliga o log para esta sessão

-no-syslog

Desliga o syslog para esta sessão





Mais Exemplos:


sudo rootsh
Iniciar um shell de root.

sudo rootsh -u eslih
Iniciar um shell logado com o usuário eslih

rootsh -f mysession.log - no-syslog
Inicia um shell de root monitorado, onde o aquivo de log será local com o nome mysessio.log e o envio para o syslog estará desabilitado.

rootsh -i -u eslih apache stop
Envia o comando "apache stop" para o shell (bash) com o usuário eslih logado.







 

Download




Fontes/referências:
Man Page do rootsh

cormander.com
https://github.com/cormander

Mais vistos no mês:

As melhores distribuições Linux para 2017

Teste de Performance de Rede com Iperf

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

OPNsense - Firewall Open Source

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

Modelo Firewall Completo em Iptables para pequena rede/office

DHCP - Guia Completo

SSD no linux

Administração de sistema e Deploys: Ansible, Chef, Fabric, Puppet ou Salt?