Saudações, galera!! Tô na área de novo com meus amigos do Mundo TI e o post de hoje é sobre uma baita ferramenta de mercado, o Elastic Stack.
O Elastic Stack tem se tornado uma grata solução para quem deseja indexar, armazenar e buscar logs dos seus servidores e serviços de maneira centralizada e rápida. Na verdade, ele é muito maior que isso mas neste post vamos nos ater apenas a esta funcionalidade.
Neste laboratório, vamos usar 3 produtos da Elastic (que, junto ao Beats, formam o Elastic Stack):
- Elasticsearch – recebe os logs e os armazena em diretórios de indexes dentro de seus clusters. Desta forma, o administrador pode optar por ter um index para cada tipo de serviço de vários servidores diferentes. Exemplo: armazenar os logs de todos os serviços httpd de um parque que conta com 10 servidores Web. A porta padrão do Elasticsearch é a 9200;
- Logstash – é um agente que captura os arquivos, aplica os filtros necessários, classifica os tipos de campo, os insere em variáveis e envia o resultado para o Elasticsearch;
- Kibana – é um frontend para os indexes do Elasticsearch. Com ele você é capaz de fazer pesquisas, criar gráficos com métricas personalizadas e dashboards via interface Web. A porta padrão do serviço é 5601;
Vamos ao trabalho então.
Cenário:
Servidor CentOS 7 com Elasticsearch e Kibana recebendo os logs dos servidores.
Servidor Debian9 com o Logstash enviando os logs do apache para o Elasticsearch.
No servidor CentOS:
Instalando o Elasticsearch
Acessando a url https://www.elastic.co/downloads você tem acesso ao download do Elasticsearch, Kibana e Logstash.
Como estes serviços usam Java, precisamos primeiro fazer a instalação do openjdk na última versão disponível:
#yum install java-1.8.0-openjdk -y
Baixando e instalando o Elasticsearch e o Kibana:
#wget–no-check-certificate https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.rpm
#wget –no-check-certificate https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-x86_64.rpm
#rpm -ivh elasticsearch-6.2.4.rpm
#rpm -ivh kibana-6.2.4-x86_64.rpm
Habilitando os 2 serviços para serem inicializados no boot do sistema via SystemD:
#systemctl enable elasticsearch kibana
O serviço está habilitado mas ainda não iniciado pois precisamos fazer as configurações.
#vim /etc/elasticsearch/elasticsearch.yml
Inserir, no fim do arquivo as seguintes linhas:
http.cors.allow-origin: “/.*/”
http.cors.enabled: true
cluster.name: elasticcluster
host: 192.168.0.13
network.bind_host: 192.168.0.13
As configurações acima dizem respeito ao nome do cluster a ser criado para o Elasticsearch, qual origem ele vai aceitar e o IP no qual o serviço deve responder (caso fique vazio, ele vai responder em qualquer IP de interface do servidor).
Não é necessária nenhuma configuração inicial no Kibana, a não ser que você queira customizar, o que é o nosso caso, pois o serviço do Elasticsearch não responde por ‘http://localhost:9200’ e sim por ‘http://192.168.0.13’ e também é uma boa prática configurar o kibana para responder da mesma forma.
Vamos lá então:
#vim /etc/kibana/kibana.yml
Inserir as seguintes linhas:
elasticsearch.url: “http://192.168.0.13:9200”
server.host: “192.168.0.13”
Iniciando os serviços:
#systemctl start elasticsearch kibana
#systemctl status elasticsearch kibana
No servidor Debian9
#wget –no-check-certificate https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.deb
#dpkg -i logstash-6.2.4.deb
Criando as configurações de INPUT, FILTER e OUTPUT:
#vim /etc/logstash/01-input.conf
input {
file {
path => [ “/var/log/apache2/access.log” ]
type => “apache-log”
}
file {
path => [ “/var/log/kern.log” ]
type => “iptables-log”
}
}
No caso acima, estamos usando o tipo de input chamado ‘file’ para capturar o arquivo de log do apache2.
#vim /etc/logstash/02-filter.conf
filter {
if [type] == “apache-log” {
grok {
match => { “message” => “%{IPORHOST:clientip} %{GREEDYDATA:syslog_message}” }
}
}
}
É um filtro bem simples, que separa o campo do IP do cliente e joga o restante como mensagem simples.
#vim /etc/logstash/03-output.conf
output {
if [type] == “apache-log” {
elasticsearch {
hosts => [ “192.168.0.13” ]
index => “http-log-%{+YYYY.MM.dd}”
}
}
if [type] == “iptables-log” {
elasticsearch {
hosts => [ “192.168.0.13” ]
index => “iptables-log-%{+YYYY.MM.dd}”
}
}
}
Criando regra de log no Iptables:
#iptables -I INPUT -p tcp –dport 22 -j LOG –log-prefix ‘Acessos à porta 22’ –log-level warning
Agora é só reiniciar o logstash no cliente e visualizar na aba ‘Discover’ do Kibana os logs chegando.
#systemctl restart logstash
No browser:
http://192.168.0.13:5601
Acesse a seção ‘Management/Index Patterns’ para criar o index pattern:
Escolha @timestamp como ‘Time filter field name’.
Agora é só acessar a seção ‘Discover’ e visualizar os logs.
O HowTo Online lançou recentemente o treinamento on-line de Elastic Stack , que conta com implementações de mercado para a solução. Dá uma conferida!!
Grande abraço e até os próximos posts!!