Skip to content

#ToolTip - ELK Stack - Part4(Command Monitoring)

Uma necessidade muito importante para um ambinte de infraestrutura, é saber o por que uma coisa aconteceu e se possível ter a auditoria da mesma. As vezes se faz necessário descobrir quais atividades foram realizadas por qual usuário. Segue abaixo um meio que encontrei de ter evidências dos comandos executados.

Passo 1: Adicionar o trecho abaixo no final do arquivo “/etc/bashrc” para que seja padrão para todos usuários conforme realize login.

[root@linux00 ~]$vim /etc/bashrc
....
# Adicionando comandos no rsyslogd
export PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -p local6.debug -t "$USER[$$] $SSH_CONNECTION")'
[root@linux00 ~]$

Explicação: A linha informa que o ultimo comando executado, além de adicionado ao .bash_history também será enviado via logger com as informações do Usuário logado e informações de conexão SSH.

Passo 2: Adicionar o serviço rsyslog o arquivo conforme abaixo:

[root@linux00 ~]$vim /etc/rsyslog.d/bash.conf
local6.* @<IP DO LOGSTASH>:4514
[root@linux00 ~]$
[root@linux00 ~]$ systemctl restart rsyslog
[root@linux00 ~]$

Passo 3: Configurar o Logstash para receber as informações passadas.

[root@elk ~]# vim /etc/logstash/conf.d/40-linuxcommands.conf
input {
  udp {
    port => 4514
    type => "rsyslog"
  }
}

filter {
        grok {
            match => {
                "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}?: %{DATA:syslog_user}\[%{POSINT:syslog_pid}\] : %{GREEDYDATA:syslog_command}"
                }
            add_field => [ "received_from", "%{host}" ]
        }
        grok {
            match => {
                "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program} %{DATA:syslog_user}\[%{POSINT:syslog_pid}\] %{DATA:syslog_ip_src} %{DATA:syslog_port_src} %{DATA:syslog_ip_dest} %{DATA:syslog_port_dest}: %{GREEDYDATA:syslog_command}"
                }
            add_field => [ "received_from", "%{host}" ]
        }
}

output {
 if [type] == "rsyslog" {
    elasticsearch {
      hosts => ["<IP DO ELASTIC>:9200"]
      index => "linuxcommands-%{+YYYY.MM.dd}"
    }
 }
}

[root@elk ~]#

Neste arquivo, criei dois Matchs possiveis, um que indique o IP/Porta de Origem, e outro para quando não seja possível informar (Ex: após uma escalada de privilégios).

Passo 4: Adicionar o Index Patterns, conforme configurado no arquivo do Logstash.

Passo 5: Visualizar os logs. É possivel ver a quantidade de informação recebida pelo syslog a partir do campo “message”, a partir dai o Logstash faz um parse na mensagem e a divide em informações melhores vistas do ponto de vista humano.

Log com a informação do IP de origem:

Log sem a informação do IP de origem (após escalada de privilégio)

Também é possivel criar um dashboard informando a lista de últimos comandos executados.