Pular para o conteúdo principal

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
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
gpgcheck=1
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'
{
  "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.
{
  "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
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
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
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_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/

Comentários

Postagens mais visitadas deste blog

Upgrading Iomega ix2-200 to Cloud Edition

You just got your ix2-200 from eBay and there are no disks inside the NAS. Or you have a brand new ix2-200 -yet you could not afford Cloud Edition. No problem. With just a USB stick and a SATA adapter or desktop PC, you will easily upgrade your ix2-200 to ix2-200 Cloud Edition. Not only your ix2-200 will have a brand new interface and Cloud options, but also will become Mac OS X Lion compatible! What do we need? Decrypted! ix2-200 Cloud Edition Firmware 3.1.12.47838 S endSpace or RapidShare * USB Flash Drive with at least 2 GB capacity and LED indicator** SATA to USB adapter or desktop PC Toothpick or paperclip Preparing Hard Drives Preparing hard drives is the first step because you have to wipe all the data inside the hard drives and make them just like brand new. We used 2 x Seagate 2 TB 5900 RPM Drives. Backup any files if you have and then remove both disks from ix2-200 and attach them to SATA to USB adapter or your desktop PC's SATA port. Using

Cuckoo com Vmware Esxi

Cuckoo is an open-source malware analysis platform using sandboxing technology. The tool allows people like us to analyze malicious binaries in an isolated environment. Since Cuckoo is commonly used with Oracle VirtualBox as its virtualization platform, a majority of online documentation is focused on configuration using VirtualBox. PlantainStan and I decided to test running Cuckoo on ESXi and document our success. This guide will help with the basic configuration of ensuring Cuckoo properly interacts with ESXi. We will continue to update this post as we make continue to make an even more baller Cuckoo environment! Note: In order to successfully interact with vSphere's API, you will need the VMWare ESX Standard license. API functionality is required for Cuckoo to work with ESX. Configure ESX Since this guide is not a "how to" on installing ESXi, we will assume that you have successfully installed the hypervisor on your system. There

CentOS7 with Snort Barnyard2 Snorby PulledPork SElinux

This post is about how to install Snort "stack" on CentOS7 with potentially all the latest libs an stuff. Here I will install and configure everything to run Snort as IDS. I will write another post shortly how to run it as IPS - INLINE. System details: [ root@nfsec-ids-01 ~ ] # cat /etc/redhat-release CentOS Linux release 7.3.1611 ( Core ) [ root@nfsec-ids-01 ~ ] # uname -a Linux nfsec-ids-01.nfsec.co.uk 3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6 23:06:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux Snort 2.9.9.0 Installation of snort is very basic: yum install https://www.snort.org/downloads/snort/daq-2.0.6-1.centos7.x86_64.rpm yum install https://www.snort.org/downloads/snort/snort-2.9.9.0-1.centos7.x86_64.rpm Register at Snort and download registered rule set: mkdir /usr/local/src/snortrules cd /usr/local/src/snortrules wget https://www.snort.org/rules/snortrules-snapshot-2990.tar.gz?oinkcode = < oinkcode > tar -zxvf snort