Heeey!
Fiz um lab utilizando a arquitetura do Graylog de alta disponibilidade e resolvi criar um guia com os passos que fiz nessa jornada.
Na documentação do graylog essa configuração se chama "Multi-node Setup". Utilizaremos 3 servidores com Graylog e MongoDB, 3 servidores com Elasticsearch e 1 com HAProxy.
Para ter uma ideia. Nossa arquitetura vai ficar desta forma:
OBS:Os servidores foram criados com a distro CentOS 7. Logo, se fizer em outra distro vai ter que rever os processo de instalação. Vamos lá ;)
Elasticsearch
O Elasticsearch é o mecanismo de busca e análise de dados que o Graylog utiliza para indexar os logs recebidos.
Instalação
O Graylog apenas suporta até a versão 6.x do Elasticsearch.
eu que sempre instalo a última versão das coisas descobri isso após ter finalizado o cluster </3
Um pré-requisito para todos servidores é o java. Então vamos começar por ele.
yum update && yum -y install java-1.8.0-openjdk-headless.x86_64 Para a instalação do Elasticsearch, vamos importar a Elastic GPG key.
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch E adicionar o arquivo elasticsearch.repo no /etc/yum.repos.d/.
$ vim elasticsearch.repo [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/oss-6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md Após isso basta instalar
yum install elasticsearch-oss Configuração
Como os meus servidores eu coloquei o mínimo de RAM (1G) precisei mudar algumas opções do Java, limitando o uso de memória dele. Caso tiver mais que 1G não precisa fazer essa etapa.
Altere as linhas:
$ vim /etc/elasticsearch/jvm.options -Xms512m -Xmx512m Edite o arquivo de configuração:
$ vim /etc/elasticsearch/elasticsearch.yml cluster.name: graylog node.name: ${HOSTNAME} network.host: 0.0.0.0 http.port: 9200 discovery.zen.ping.unicast.hosts: ["elastic1.lab", "elastic2.lab", "elastic3.lab"] OBS: Para ficar melhor a identificação dos servers, configurei o DNS no /etc/hosts
Após configurar basta subir o serviço:
systemctl daemon-reload systemctl enable elasticsearch.service systemctl restart elasticsearch.service Você consegue checar o status do Elasticsearch através do curl:
$ curl http://elastic1.lab:9200 { "name" : "elastic1", "cluster_name" : "graylog", "cluster_uuid" : "qMtqk9hUTcm9gT8a6wF7-w", "version" : { "number" : "6.8.12", "build_flavor" : "oss", "build_type" : "rpm", "build_hash" : "7a15d2a", "build_date" : "2020-08-12T07:27:20.804867Z", "build_snapshot" : false, "lucene_version" : "7.7.3", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" } No meu caso não foi de primeira, por um bloqueio do SELinux. Então caso não conseguir verifique se o SELinux ou o firewall está bloqueando a conexão.
Você pode apenas desabilitar o firewall ou deixá-lo ativo e liberar a conexão do elasticsearch.
Para desabilitar basta rodar o comando:
$ systemctl disable firewalld Após replicar esses processos nos outros dois servidores, o nosso cluster do Elasticsearch estará pronto!
MongoDB
OBS: Agora vamos configurar 3 servidores com mongo e Graylog, então recomendo no mínimo 2G
O MongoDB é um serviço de banco de dados NoSQL que o Graylog utiliza para armazenar os dados de configuração.
Instalação
Crie um arquivo mongodb-org-4.4.repo no /etc/yum.repos.d/
$ vim mongodb-org-4.4.repo [mongodb-org-4.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc Após isso basta instalar
yum update && yum install -y mongodb-org
Configuração
Crie os diretórios:
mkdir -p /var/lib/mongo mkdir -p /var/log/mongodb mkdir -p /data/db Configure as permissões do usuário mongod:
chown -R mongod:mongod /var/lib/mongo chown -R mongod:mongod /var/log/mongodb Na documentação do mongo, tem uma seção para configurar a política do SELinux para que permita os acessos. Caso sua distro não use SELinux, pode pular essa etapa.
$ yum install checkpolicy policycoreutils-python cat > mongodb_cgroup_memory.te <<EOF module mongodb_cgroup_memory 1.0; require { type cgroup_t; type mongod_t; class dir search; class file { getattr open read }; } #============= mongod_t ============== allow mongod_t cgroup_t:dir search; allow mongod_t cgroup_t:file { getattr open read }; EOF $ checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te $ semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod $ semodule -i mongodb_cgroup_memory.pp Após configurar basta subir o serviço:
$ systemctl daemon-reload $ systemctl enable mongod $ systemctl start mongod Você consegue testar a conexão rodando:
mongo OBS:Caso mostrar alguma falha, verifique o firewall.
Para a configuração das réplicas do mongo basta executar (antes é preciso parar a instancia do mongod que está rodando):
mongod --replSet "rs0" --bind_ip localhost,mongodb1.lab --fork --logpath /var/log/mongodb/mongod Sobre o esta linha de comando:
- mude mongodb1.lab para o endereço do server
-
--forké para que o processo seja executado em segundo plano -
--replSetpara inserir o nome da configuração de replicação.
Após fazer esses procedimentos nos 3 servers. Em apenas um, conecte ao mongo shell:
$ mongo e inicialize a configuração da replica:
rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "mongodb1.devops.lab:27017" }, { _id: 1, host: "mongodb2.devops.lab:27017" }, { _id: 2, host: "mongodb3.devops.lab:27017" } ] }) você consegue verificar a configuração rodando:
rs.status() a saída deve estar mais ou menos desta forma:
rs0:PRIMARY> rs.status() { "set" : "rs0", "date" : ISODate("2020-10-07T04:23:25.190Z"), "myState" : 1, "term" : NumberLong(12), "syncSourceHost" : "", "syncSourceId" : -1, "heartbeatIntervalMillis" : NumberLong(2000), "majorityVoteCount" : 2, "writeMajorityCount" : 2, "votingMembersCount" : 3, "writableVotingMembersCount" : 3, "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1602044601, 9), "t" : NumberLong(12) }, "lastCommittedWallTime" : ISODate("2020-10-07T04:23:21.627Z"), "readConcernMajorityOpTime" : { "ts" : Timestamp(1602044601, 9), "t" : NumberLong(12) }, "readConcernMajorityWallTime" : ISODate("2020-10-07T04:23:21.627Z"), "appliedOpTime" : { "ts" : Timestamp(1602044604, 11), "t" : NumberLong(12) }, "durableOpTime" : { "ts" : Timestamp(1602044602, 11), "t" : NumberLong(12) }, "lastAppliedWallTime" : ISODate("2020-10-07T04:23:24.975Z"), "lastDurableWallTime" : ISODate("2020-10-07T04:23:22.958Z") }, "lastStableRecoveryTimestamp" : Timestamp(1602044492, 7), "electionCandidateMetrics" : { "lastElectionReason" : "electionTimeout", "lastElectionDate" : ISODate("2020-10-07T04:19:54.787Z"), "electionTerm" : NumberLong(12), "lastCommittedOpTimeAtElection" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "lastSeenOpTimeAtElection" : { "ts" : Timestamp(1601673721, 7), "t" : NumberLong(11) }, "numVotesNeeded" : 2, "priorityAtElection" : 1, "electionTimeoutMillis" : NumberLong(10000), "numCatchUpOps" : NumberLong(0), "newTermStartDate" : ISODate("2020-10-07T04:19:55.550Z"), "wMajorityWriteAvailabilityDate" : ISODate("2020-10-07T04:19:56.455Z") }, "members" : [ { "_id" : 0, "name" : "mongodb1.devops.lab:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 424, "optime" : { "ts" : Timestamp(1602044604, 11), "t" : NumberLong(12) }, "optimeDate" : ISODate("2020-10-07T04:23:24Z"), "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1602044395, 1), "electionDate" : ISODate("2020-10-07T04:19:55Z"), "configVersion" : 1, "configTerm" : 12, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "mongodb2.devops.lab:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 219, "optime" : { "ts" : Timestamp(1602044604, 6), "t" : NumberLong(12) }, "optimeDurable" : { "ts" : Timestamp(1602044601, 9), "t" : NumberLong(12) }, "optimeDate" : ISODate("2020-10-07T04:23:24Z"), "optimeDurableDate" : ISODate("2020-10-07T04:23:21Z"), "lastHeartbeat" : ISODate("2020-10-07T04:23:24.801Z"), "lastHeartbeatRecv" : ISODate("2020-10-07T04:23:25.012Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncSourceHost" : "mongodb1.devops.lab:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1, "configTerm" : 12 }, { "_id" : 2, "name" : "mongodb3.devops.lab:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 212, "optime" : { "ts" : Timestamp(1602044604, 6), "t" : NumberLong(12) }, "optimeDurable" : { "ts" : Timestamp(1602044601, 5), "t" : NumberLong(12) }, "optimeDate" : ISODate("2020-10-07T04:23:24Z"), "optimeDurableDate" : ISODate("2020-10-07T04:23:21Z"), "lastHeartbeat" : ISODate("2020-10-07T04:23:24.801Z"), "lastHeartbeatRecv" : ISODate("2020-10-07T04:23:25.031Z"), "pingMs" : NumberLong(1), "lastHeartbeatMessage" : "", "syncSourceHost" : "mongodb1.devops.lab:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1, "configTerm" : 12 } ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1602044604, 11), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1602044604, 11) } Crie um banco de dados e um usuário para o Graylog:
use graylog; db.createUser( { user: "mongo_admin", pwd: "graylog", roles: [ { role: "root", db: "admin" } ] } ) Certo, com o Elasticsearch e o MongoDB configurados, vamos para o Graylog!
Graylog
Instalação
$ rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-3.3-repository_latest.rpm $ yum update && yum -y install java-1.8.0-openjdk-headless.x86_64 graylog-server Configuração
Você também consegue alterar o uso de memória do Java, o arquivo de configuração dessas opções que fica em /etc/sysconfig/graylog-server.
Antes de editar o arquivo de configuração, você irá precisar gerar duas senhas.
Para gerar a password_secret basta rodar o comando:
pwgen -N 1 -s 96 obs: caso não tenha o pwgen instalado basta seguir esses passos:
$ yum install epel-release $ yum install pwgen Para gerar a root_password_sha2, rode esse comando:
echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1 Após isso, edite o arquivo de configuração:
$ vim /etc/graylog/server/server.conf is_master = true password_secret = [gerada anteriormente] root_password_sha2 = [gerada anteriormente] root_timezone = America/Sao_Paulo http_bind_address = graylog1.lab:9000 http_publish_uri = http://graylog.1.lab:9000/ elasticsearch_hosts = http://elastic1.lab:9200,http://elastic2.lab:9200,http://elastic3.lab:9200 elasticsearch_shards = 3 mongodb_uri = mongodb://mongo_admin:graylog@mongodb1.lab:27017,mongodb2.lab:27017,mongodb3.lab:27017/graylog?replicaSet=rs0 obs:
- apenas deixe
is_master = trueem um dos servidores - modifique web.graylog1 para o endereço do server
- modifique a linha
elasticsearch_hostscom os endereços dos servidores do elasticsearch - modifique a linha
mongodb_uricom os endereços dos servidores do mongo
Agora basta subir o server do graylog:
$ systemctl daemon-reload $ systemctl enable graylog-server $ systemctl start graylog-server Após alguns minutos você irá conseguir acessar o endereço do graylog http://graylog1.lab:9000/. O login é admin e a senha é a que você inseriu no campo root_password_sha2.
HAProxy
o HAProxy vai servir como um balanceador de carga para o nosso cluster. Isso quer dizer que ao configurar o envio de logs, nós iremos mandar para o endereço do servidor que está o HAProxy e ele que vai ser o responsável por enviar para os servidores do graylog.
Instalação
yum update && yum install haproxy Configuração
Edite o arquivo de configuração e insira os blocos:
$ vim /etc/haproxy/haproxy.cfg listen stats bind :32700 stats enable stats uri / stats hide-version stats auth devops:devopslab listen syslog_1514 bind *:1514 mode tcp option tcplog timeout client 120s timeout server 120s default-server inter 2s downinter 5s rise 3 fall 2 maxconn 64 maxqueue 128 weight 100 server graylog1 graylog1.lab:1514 check server graylog2 graylog2.lab:1514 check server graylog3 graylog3.lab:1514 check O primeiro bloco é para a página de estatísticas que o HAProxy exibe, ao acessá-la você conseguirá ver o balanceamento de dados entres os servidores do graylog. Basta acessar o endereço do server na porta 32700:
O segundo bloco é a configuração da porta onde o HAProxy irá "ouvir" e depois realizar o balanceamento entre os servers. O "check" é para que ele verifique se o server está up antes de enviar.
Enviando log para o Graylog
Você consegue enviar praticamente qualquer log de sistema para o servidor do graylog. Neste guia eu vou demonstrar apenas como configurar o envio utilizando o rsyslog.
Para outros tipos de log, você pode utilizar o Graylog Sidecar, é um serviço que roda em segundo plano coletando logs que deseja enviar para a API do Graylog.
O primeiro passo para isso é configurar o Input na API do graylog, ele é o responsável por criar uma porta específica para os variados tipos de log.
Acesse a API do Graylog (no meu caso http://graylog1.lab:9000/) e siga os passos:
- Vá em System
- Depois em Inputs
- Selecione SysLog TCP
- Selecione Launch new Input
Ao seguir esses passos irá abrir uma janela para que preencha os detalhes do Input então vamos preencher os campos:
- Marque a opção Global
- Title: “Log Syslog”
- Bind address: 0.0.0.0
- Port:1514
- Clique em Salvar.
Ao clicar em salvar, verá que o status do input passará de NOT RUNNING para RUNNING.
Agora que você já configurou o input, basta configurar o rsyslog da máquina que irá enviar os logs:
$ vim /etc/rsyslog.d/graylog.conf *.* @@web.graylog.lab:1514;RSYSLOG_SyslogProtocol23Format obs:Troque web.graylog.lab para o endereço do servidor do HAProxy
Reinicie o serviço
systemctl restart rsyslog 
Após todos esses passos, ao acessar a API do Graylog, na aba Search você conseguirá visualizar, fazer consultas e criar dashboards personalizadas :)
última observação: Quando lidamos com cluster é muito importante que todos os servidores estejam com o mesmo horário, a divergência pode gerar erros no graylog.
Vlw pessoal! \o/



Top comments (0)