Centralização e análise de logs com Graylog, MongoDB e Elasticsearch

“Open source log management that actually works” – www.graylog.org
Neste tutorial vamos instalar e configurar o Graylog para a centralização e análise de logs.

É fundamental ter uma ferramenta para análise de logs na sua infraestrutura, isto te possibilita um debug mais apurado do ambiente, melhora a segurança, ajuda a compartilhar informações com os times, auxilia na monitoração com o uso de triggers, centralização de logs, enfim é uma ferramenta estratégica que oferece vários recursos para uma boa análise da sua infraestrutura.

Graylog é uma excelente alternativa ao Splunk e Kibana+Logstash.

1.Infraestrutura e pré-requisitos

Sistema operacional: Centos 7 x86_64.

Componentes:
Graylog Server – Análise e coleta de logs. Insere os logs no Elasticsearch.
Graylog Web – Interface Web para o Graylog Server.
MongoDB– Armazenamento de configurações e metadados.
Elasticsearch – Armazenamento de logs e ferramenta de busca.
graylog-Diagram

Versões utilizadas neste tutorial:
graylog-web-1.3.4-1.noarch
graylog-server-1.3.4-1.noarch

mongodb-org-server-3.2.4-1.el7.x86_64
mongodb-org-3.2.4-1.el7.x86_64

elasticsearch-1.7.5-1.noarch

Servidores:
Graylog Server e interface Web:
10.0.2.100 graylog-webeserver-01.devopslab.com.br

MongoDB:
10.0.2.101 graylog-mongodb-01.devopslab.com.br

Elasticsearch
10.0.2.102 graylog-elasticsearch-01.devopslab.com.br

2. Instalação do Elasticsearch

Faça o login no servidor do Elasticsearch graylog-elasticsearch-01.devopslab.com.br
Recomendo 1GB de RAM.
Até o presente momento o Graylog funciona apenas com o Elasticsearch 1.7.

Desative o Firewall e Selinux.

# systemctl stop firewalld.service
# systemctl disable firewalld.service
# sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
# setenforce 0

Tuning do Sistema Operacional – Aumente a quantidade de Openfiles

# vi /etc/security/limits.conf
*                soft   nofile     64000
*                hard  nofile      64000
# ulimit -n 64000

Verifique o fs.file-max, pois ele tem que ser maior que 64000.

# sysctl -a | grep fs.file-max
fs.file-max = 98929

Instalação do Java
Versões suportadas: OpenJDK ou Java Oracle
Java 8 update 20 ou posterior.
Java 7 update 55 ou posterior.

# yum -y install java-1.8.0-openjdk.x86_64
# java -version
openjdk version "1.8.0_77"

Repositório – Importação da chave pública do repositório

# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

Crie o arquivo do repositório do Elasticsearch.
#vi /etc/yum.repos.d/elasticsearch.repo

[elasticsearch-1.7]
name=Elasticsearch repository for 1.7.x packages
baseurl=http://packages.elastic.co/elasticsearch/1.7/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

Instale o Elasticsearch 1.7

# yum -y install elasticsearch

Configuração do Elasticsearch
Todas as configurações serão executadas no arquivo /etc/elasticsearch/elasticsearch.yml
# vi /etc/elasticsearch/elasticsearch.yml

Defina um nome qualquer para o cluster.
cluster.name: graylog-lab

Desabilitando a descoberta automática de nodes Elasticsearch e definindo o servidor do Elasticsearch.
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: [“graylog-elasticsearch-01.devopslab.com.br:9300”]

Desabilitando a execução remota de scripts.
Adicione ao final do arquivo elasticsearch.yml
script.disable_dynamic: true

Arquivo completo elasticsearch.yml.
# cat  /etc/elasticsearch/elasticsearch.yml| grep -v ^#| grep -v ^$
cluster.name: graylog-lab
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["graylog-elasticsearch-01.devopslab.com.br:9300"]
script.disable_dynamic: true

Reinicie o Elasticsearch.

# systemctl enable elasticsearch.service
# systemctl restart elasticsearch.service

Verificando a saúde do cluster de Elasticsearch.
Status 200 está ok.

curl -X GET http://localhost:9200
# curl -X GET 'http://localhost:9200'
{
  "status" : 200,
  "name" : "Hydro",
  "cluster_name" : "graylog-lab",
  "version" : {
    "number" : "1.7.5",
    "build_hash" : "00f95f4ffca6de89d68b7ccaf80d148f1f70e4d4",
    "build_timestamp" : "2016-02-02T09:55:30Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

Status ‘green’ está ok.

# curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
# curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
{
  "cluster_name" : "graylog-lab",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0
}

3. Instalação do MongoDB

Servidor graylog-mongodb-01.devopslab.com.br
Recomendo 1GB de RAM.
Desative o Firewall e Selinux.

Tuning do S.O – Aumente a quantidade de Openfiles e Max process

# vi /etc/security/limits.conf
*                soft   nofile      64000
*                hard  nofile      64000
*                soft   nproc      64000
*                hard  nproc      64000
# ulimit -n 64000
# ulimit -u 64000

Verifique o fs.file-max. O valor tem que ser maior que 64000.

# sysctl -a | grep fs.file-max
fs.file-max = 98929

Repositório – Crie o arquivo do repositório do MongoDB

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

Instale a última versão do MongoDB.

# yum install -y mongodb-org

Comente a linha ‘bindIp: 127.0.0.1’ no arquivo ‘/etc/mongod.conf’ para que o MongoDB escute em todas as interfaces de rede.

# sed -i s/bindIp:/#bindIp:/g /etc/mongod.conf 

Inicie o MongoDB.

# systemctl enable mongod.service
# systemctl start mongod.service

4. Instalação do Graylog Server

Servidor graylog-webeserver-01.devopslab.com.br
Desative o Firewall e Selinux.
Instale o java. Utilize o mesmo passo descrito na instalação do Elasticsearch.

Repositório – Instalação do pacote graylog-1.3-repository-el7_latest.rpm

# rpm -hiv https://packages.graylog2.org/repo/packages/graylog-1.3-repository-el7_latest.rpm

Instalação do Graylog server.

# yum -y install graylog-server

Instale o repositório Epel. Ele é dependencia para a instalação do pacote pwgen.

# yum -y install epel-release.noarch

Configuração do Graylog Server.
# vi /etc/graylog/server/server.conf
Define este node como master.
is_master = true

Gere uma senha de segurança para proteger o armazenamento das senhas dos usuários.

# pwgen -N 1 -s 96
bD9QUDQMjkd0JZ5S205p3mJDtcLAjH61K0jP48wGxcETvcPV8zI7kgRSB5KJwzxpw6CSAelzILFr9zxMXt0wXhOqnKGCkdNA

Configure a senha em password_secret

password_secret =U2UAb7rBEvc0Q1CLRiSaANdaQcEMWYALoN8TuNCph1nCUcII1oyNFtLXZrC4yoBQ3BVWMUSg8WoVRnvo4mURElJjeoC653LQ

Rest API para a conexão do Graylog Web e outros Graylog Server.

rest_listen_uri = http://127.0.0.1:12900/

Crie uma senha para o usuário Administrativo ‘admin’.

# echo -n minha_senha | sha256sum
f9b88ac71caec840be639a8eb18e68728744252316456ce9b3cf6b58d82bb7cd  -
root_password_sha2 = f9b88ac71caec840be639a8eb18e68728744252316456ce9b3cf6b58d82bb7cd

Quantidade de nodes e replicas do Elasticsearch

elasticsearch_shards = 1
elasticsearch_replicas = 0

Nome do Cluster Elasticsearch. É o mesmo definido em no arquivo elasticsearch.yml do servidor do Elasticsearch.

elasticsearch_cluster_name = graylog-lab

Desabilitando a descoberta automática e definindo o servidor do Elasticsearch.

elasticsearch_discovery_zen_ping_multicast_enabled = false
elasticsearch_discovery_zen_ping_unicast_hosts = graylog-elasticsearch-01.devopslab.com.br:9300

Desativando a autenticação e definindo a string de conexão com o banco MongoDB.

mongodb_useauth = false
mongodb_uri = mongodb://graylog-mongodb-01.devopslab.com.br:27017/graylog2

Arquivo server.conf completo.

# cat server.conf | grep -v ^# |grep -v ^$
is_master = true
node_id_file = /etc/graylog/server/node-id
password_secret = bD9QUDQMjkd0JZ5S205p3mJDtcLAjH61K0jP48wGxcETvcPV8zI7kgRSB5KJwzxpw6CSAelzILFr9zxMXt0wXhOqnKGCkdNA
root_password_sha2 = 8b7baf6899f95c2f4723ef35f4cb10ac678221ac2d63ae8901f63151d243881e
plugin_dir = /usr/share/graylog-server/plugin
rest_listen_uri = http://127.0.0.1:12900/
rotation_strategy = count
elasticsearch_max_docs_per_index = 20000000
elasticsearch_max_number_of_indices = 20
retention_strategy = delete
elasticsearch_shards = 1
elasticsearch_replicas = 0
elasticsearch_index_prefix = graylog2
allow_leading_wildcard_searches = false
allow_highlighting = false
elasticsearch_cluster_name = graylog-lab
elasticsearch_discovery_zen_ping_multicast_enabled = false
elasticsearch_discovery_zen_ping_unicast_hosts = graylog-elasticsearch-01.devopslab.com.br:9300
elasticsearch_analyzer = standard
output_batch_size = 500
output_flush_interval = 1
output_fault_count_threshold = 5
output_fault_penalty_seconds = 30
processbuffer_processors = 5
outputbuffer_processors = 3
processor_wait_strategy = blocking
ring_size = 65536
inputbuffer_ring_size = 65536
inputbuffer_processors = 2
inputbuffer_wait_strategy = blocking
message_journal_enabled = true
message_journal_dir = /var/lib/graylog-server/journal
dead_letters_enabled = false
lb_recognition_period_seconds = 3
mongodb_useauth	= false
mongodb_uri = mongodb://graylog-mongodb-01.devopslab.com.br:27017/graylog2
mongodb_max_connections = 100
mongodb_threads_allowed_to_block_multiplier = 5
content_packs_dir = /usr/share/graylog-server/contentpacks
content_packs_auto_load = grok-patterns.json

Inicie o Graylog Server

# systemctl enable graylog-server.service
# systemctl start graylog-server.service

5. Instalação do Graylog Web

O Graylog Web vai ficar no mesmo servidor do Graylog Server, então Java, Firewall e Selinux já estão ok.
Recomendo pelo menos 2GB de RAM.
Servidor graylog-webeserver-01.devopslab.com.br

Instalação do graylog-web.

# yum -y install graylog-web

Configuração do Graylog Web
# vi /etc/graylog/web/web.conf

Gere uma chave para criptografia de funções do graylog com o comando ‘pwgen -N 1 -s 96’ e cole no campo:
application.secret=””

Configure a conexão com a API do Server em graylog2-server.uris=””
graylog2-server.uris=”http://127.0.0.1:12900/”

Veja como ficou a configuração do greylog web.

# cat web.conf| grep -v ^#| grep -v ^$
graylog2-server.uris="http://127.0.0.1:12900/"

application.secret="OGBIrIC2eCOGqc3P621rIXFbGFF0DP6l1FU4A5FN8Zu4RATafF6y2EEdpHIvytkiCG8G2n7C18eUoQxGlJzHd5KHaJE3Sc20"

field_list_limit=100

application.global=lib.Global

Inicie o Graylog Web.

# systemctl enable graylog-web
# systemctl start graylog-web

Faça o login na interface Web (http://ip-webserver:9000):
http://graylog-webeserver-01.devopslab.com.br:9000/

Usuário: admin
Senha: Foi definida na instalação do graylog-server, lembra?.
home-graylog1

6. Configuração dos clientes e envio de Log

O Graylog aceita logs nos formatos RFC-5424 e RFC-3164, que são os utilizados pelo syslog-ng e rsyslog.

Equipamentos e aplicações com logs fora do padrão precisam de plugins, como por exemplo roteadores Cisco e Fortigate ou app Java e Web servers.

Visite o Marketplace para checar todos os plugins disponíveis: https://marketplace.graylog.org/

É possível você desenvolver seu próprio padrão de log com a ferramenta Graylog Extractor ou enviar o log via API.

6.1 – Configuração do Input de logs

Antes de começar a receber logs no Graylog é necessário criar uma configuração de Input, que basicamente diz quais tipos de logs serão aceitos. Os tipos de logs aceitos podem ser estendidos com plugins próprios ou de terceiros (veja o o site graylog markeplace).
Logue na interface Web e vá para:
System/Inputs → Inputs → Launch New Input
Selecione Syslog UDP.
Selecione Syslog TCP.
Clique em Lauch.

Escolha uma porta acima de 1024. Portas <1024 apenas o usuário root pode manipular. Eu escolhi a porta 1030/tcp e 1030/udp para o recebimento de logs do syslog. graylog-input

6.2 – Configuração do Firewall

Eu quero que meus servidores enviem o log para a porta 514/tcp e 514/udp. Simplesmente pois é um padrão, é comum enviar logs para estas portas.
Você também pode enviar direto para a porta definida no Input, no meu caso 1030.

Se você quer usar o padrão, crie uma regra de firewall que redirecione todo o tráfego em vier pela porta 514/tcp e 514/udp para a porta 1030.

# iptables -t nat -A PREROUTING -i enp0s3 -p udp -m udp --dport 514 -j REDIRECT --to-ports 1030
# iptables -t nat -A PREROUTING -i enp0s3 -p tcp -m tcp --dport 514 -j REDIRECT --to-ports 1030

6.3 – Configuração em envio de logs

Vou configurar os próprios servidores do Cluster do Graylog para o envio de log.
Hoje em dia todos os Linux estão utilizando o rsyslog, então vou configurar o rsyslog da seguinte forma.

# vi /etc/rsyslog.conf
*.*	@graylog-webeserver-01.devopslab.com.br:514;RSYSLOG_SyslogProtocol23Format

graylog-webeserver-01.devopslab.com.br:514 – Meu servidor do Graylog ouvindo na porta 514. poderia ser a porta definida no Input 1030tcp/udp.
*.* – Todos os logs e facilidades.
@ – Protocolo UDP.
@@ – Protocolo TCP.

Reinicie o rsyslog para que o logs comecem a ser enviados para o graylog.

# systemctl restart rsyslog

Obs: Este template ‘RSYSLOG_SyslogProtocol23Format’ funciona apenas caso a versão do rsyslog seja maior que 5.

# rsyslogd -version
rsyslogd 7.4.7, compiled with:
	FEATURE_REGEXP:				Yes
	FEATURE_LARGEFILE:			No
	GSSAPI Kerberos 5 support:		Yes
	FEATURE_DEBUG (debug build, slow code):	No
	32bit Atomic operations supported:	Yes
	64bit Atomic operations supported:	Yes
	Runtime Instrumentation (slow code):	No
	uuid support:				Yes
See http://www.rsyslog.com for more information.

Se seu rsyslog for menor 5, utilize apenas a linha:

# vi /etc/rsyslog.conf
*.*	@graylog-webeserver-01.devopslab.com.br:514

7. Verificação dos logs na interface Web

Logue na interface web e entre na abas sources e search que será possível ver os logs e a origem dos logs.

Aba SOURCES.
dashboard-sources

Aba SEARCH.
dashboard-search
Se você chegou até aqui seu Graylog está funcionando e recebendo logs, agora basta você explorar a ferramenta, clicar nas várias opções, integrar com Ldap, criar logins para seus times, criar triggers de monitoramento, criar Dashboards, fazer filtros específicos e etc.

8. Graylog via proxy com o Nginx

Este passo é opcional.
Digitar a url com a porta no navegador não é algo muito legal, então vamos configurar um proxy reverso com Nginx para não ter que digitar http://x.x.x.x:porta/

No servidor Graylog Server e Web instale o Nginx.

# yum -y install nginx

Altere estes campos:

server {
        listen       80 default_server;
        server_name  graylog.devopslab.com.br;
        location / {
	proxy_pass http://localhost:9000;
        }

E reinicie o nginx. Agora você pode simplesmente digitar http://graylog.devopslab.com.br/ sem ter que digitar porta.

Segue todo o arquivo nginx.conf, basta copiar e colar ;). O restante do arquivo está padrão, conforme veio instalado.

# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        server_name  graylog.devopslab.com.br;
        location / {
	proxy_pass http://localhost:9000;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

Referência:
Graylog
http://docs.graylog.org/en/1.3/

Elasticssearch
https://www.elastic.co/guide/en/elasticsearch/reference/1.7/index.html

MongoDB
https://docs.mongodb.org/manual/

Qualquer dúvida, sugestão e etc, só chamar.

[]’s

Leonardo Macedo Cerqueira

16 comentários sobre “Centralização e análise de logs com Graylog, MongoDB e Elasticsearch

  1. Olá Leonardo como vai?

    Gostaria de saber se já fez a instalação do graylog na sua última versão a 2.0.2 e enfrentou um problema na hora de fazer o acesso a interface web, de simplesmente não ter acesso. Nesta nova versão não há a necessidade da instalação do graylog-web, me parece que vem nativamente instalado no rpm. Tem informações a respeito?

    • Olá Allan,

      Eu ainda não instalei o Graylog 2. Dei uma olhada na documentação e de fato a interface web agora está integrada com o Graylog Server, não precisa mais do Graylog Web.
      Primeiramente: MongoDb, ElasticSearch e Java estão instalados na versão correta e funcionando?.
      Você precisa ter isto aqui pronto:
      Elasticsearch 2.1.x ou versão mais nova.
      MongoDB 2.0 ou versão mais nova.
      Java 8 – Oracle Java SE 8 ou OpenJDK 8 versão mais nova.

      Nos logs do Graylog Server não tem nenhum erro?.

      Abç.

      Leonardo

  2. Opa Leonardo , ótimo tutorial .

    Estou com uma duvida : já realizei o imput e está funcionando ok. Agora preciso que um outro servidor envie logs para o graylog , eu preciso instalar o Logstash nesse novo servidor ?

    Desde já agradeço

    • Não precisa instalar o Logstash, basta você configurar o Rsyslog (Syslog) de forma que ele envie os logs para o Graylog. Existe uma grande variedade de plugins e formas de enviar logs para o Graylog por exemplo via API HTTP.

      Entre no Market Place https://marketplace.graylog.org/ (Na sessão GELF Library), e veja a quantidade de plugins que podem ser instalados nas aplicações para que as mesmas enviem os logs para o Graylog.

      É possível combinar o Logstash com Graylog, para aumentar a variedade de tipos de inputs, mas não é este o caso.

      Abraços,

      Leonardo

  3. Bom dia Leonardo, a documentação que enviou ajudou muito mas ainda estou comum problema para configurar o NXLOG em um servidor Windows. Deixei a configuração da seguinte forma:

    define ROOT C:\Program Files (x86)\nxlog

    Moduledir %ROOT%\modules
    CacheDir %ROOT%\data
    Pidfile %ROOT%\data\nxlog.pid
    SpoolDir %ROOT%\data
    LogFile %ROOT%\data\nxlog.log

    Module xm_gelf

    Module im_msvistalog

    Module om_tcp
    Host 10.7.1.35
    Port 1030
    OutputType GELF


    Recebo os eventos no Graylog mas as msg vem com caracteres errados. Ex: �b�7���?�b?�S�`R�̡e�T37V=��sV�3wUyL;��RbV� e��c��VX)ğ�ֱ���V�6��e�`;;

    Não consegui localizar nada que pudesse ajudar. Alguma dica?

    Path in => out

  4. Olá. Baixei o graylog-contentpack-nginx do marketplace do Graylog. Gostaria de coletar os logs de meu nginx. No entanto, no site é mostrado apenas a configuração do servidor Nginx, que enviará os logs.
    Como eu configuro meu servidor Graylog? Ele disponibiliza um arquivo .json nesse content pack, que descreve o formato do log. Aonde deveria colocá-lo?
    []’s

  5. Leonardo, boa tarde!

    Achei muito bom o seu artigo e o seguirei para implantar o graylog aqui na minha rede, porem tenho uma duvida com relação ao banco de dados.
    Posso instalar tudo em um unico equpamento ou você recomenda o servers separados?
    Valeu!

    • É melhor manter cada componente separado, tudo em apenas uma máquina, além de ficar desorganizado, pode começar a dar problemas de desempenho e ficar difícil de debugar.
      Sem falar que manter os componentes separados é melhor caso você precise aumentar o ambiente.

      Este tutorial está defasado, você pode usar este como uma orientação, mas prefira instalar o Graylog 2, que é a versão mais nova até o momento.

      Abraços,

      Leonardo

    • Wesley,
      Nunca mexi com Fortigate, mas se não me engano ele usa Syslog ou Rsyslog. Siga a parte deste tutorial que ensina a enviar os logs utilizando o Syslog.
      Você precisa fuãr no Fortigate e configurar o Syslog aí.
      Depois, tem um “plugin” no GrayLog Market Place https://marketplace.graylog.org/, basta procurar por Fortigate, que já deixa configurado todas as interfaces do Fortigate dentro do Graylog.
      Este é apenas o caminho das pedras, para instalar o plugin você terá que dar uma procurada no google ok.

  6. Bom dia Amigo.

    Preciso de uma solução para centralizar logs que aguente muitos ativos de rede e vários servidores.
    Foi feito teste com LogAnalyser e Mysql porém como são muitos ativos e muitos logs, acaba demorando muito qualquer pesquisa de mais de 6 meses.

    Na rede são: 30 storages
    21 servidores físicos de virtualização com vmware
    153 Máquinas virtuais Linux e Windows
    40 switches L2
    13 Switches L3
    switch e storage = são da marca netgear
    Firewalls da Sonicwall
    Voce indicaria esta solução para centralização de logs, ou tem alguma outra em mente ?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *