Administração de Sistemas

Análise de logs com journalctl, logrotate e stack ELK

• 8 min de leitura

Análise de logs com journalctl, logrotate e stack ELK
Em ambientes Linux, os logs são a principal fonte de informação para diagnóstico de falhas, auditoria de segurança e monitoramento de desempenho. Sem uma estratégia adequada de coleta e análise, problemas críticos podem passar despercebidos, comprometendo a disponibilidade e a integridade dos sistemas. A centralização de logs permite correlacionar eventos de múltiplos servidores, facilitando a identificação de padrões e anomalias.

Análise de logs com journalctl, logrotate e stack ELK

1. Introdução ao ecossistema de logs no Linux

1.1. Importância da centralização e análise de logs para diagnóstico e segurança

Em ambientes Linux, os logs são a principal fonte de informação para diagnóstico de falhas, auditoria de segurança e monitoramento de desempenho. Sem uma estratégia adequada de coleta e análise, problemas críticos podem passar despercebidos, comprometendo a disponibilidade e a integridade dos sistemas. A centralização de logs permite correlacionar eventos de múltiplos servidores, facilitando a identificação de padrões e anomalias.

1.2. Visão geral das ferramentas: journald (systemd), logrotate e stack ELK

O ecossistema moderno de logs no Linux combina três componentes fundamentais:

  • journald: sistema de logging nativo do systemd, que coleta logs binários estruturados do kernel, serviços e aplicações.
  • logrotate: utilitário clássico para rotação, compressão e remoção automática de arquivos de log, evitando o consumo excessivo de disco.
  • Stack ELK (Elasticsearch, Logstash, Kibana): plataforma poderosa para armazenamento, processamento e visualização de logs em larga escala.

1.3. Diferença entre logs locais (journalctl) e logs centralizados (ELK)

Enquanto o journalctl é ideal para consultas rápidas em um único servidor, o stack ELK oferece busca full-text, agregação de dados de múltiplas fontes e dashboards interativos. A combinação das duas abordagens permite desde análises pontuais até monitoramento corporativo.

2. Gerenciamento de logs com journalctl

2.1. Comandos essenciais: filtragem por unidade, prioridade, data e boot

O journalctl é a interface principal para consultar logs do systemd. Exemplos práticos:

# Logs de uma unidade específica
journalctl -u nginx.service

# Logs com prioridade error ou superior
journalctl -p err

# Logs desde a última inicialização
journalctl -b -1

# Logs de um intervalo de tempo
journalctl --since "2024-01-01 00:00:00" --until "2024-01-02 23:59:59"

2.2. Exportação e consulta avançada: saída em JSON, uso de --output e --since

Para integração com outras ferramentas, a saída em JSON é essencial:

# Exportar logs em formato JSON
journalctl -u sshd.service --output=json-pretty --since "1 hour ago"

# Campos específicos com --output=verbose
journalctl -u cron.service --output=verbose --no-pager

2.3. Configuração do journald: tamanho máximo, persistência e rotação nativa

O arquivo /etc/systemd/journald.conf controla o comportamento do journald:

[Journal]
Storage=persistent
SystemMaxUse=500M
SystemMaxFileSize=100M
MaxRetentionSec=2weeks
ForwardToSyslog=yes

Após alterações, reinicie o serviço:

systemctl restart systemd-journald

3. Rotação e retenção de logs com logrotate

3.1. Estrutura de configuração: diretório /etc/logrotate.d/ e diretivas comuns

O logrotate gerencia arquivos de log texto. As configurações ficam em /etc/logrotate.d/:

/var/log/nginx/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 640 nginx adm
    postrotate
        systemctl reload nginx > /dev/null 2>&1 || true
    endscript
}

3.2. Exemplos práticos: configurar rotação para logs do Apache, Nginx e syslog

Para logs do Apache:

/var/log/apache2/*.log {
    weekly
    rotate 4
    compress
    maxsize 50M
    sharedscripts
    postrotate
        systemctl reload apache2 > /dev/null 2>&1 || true
    endscript
}

Para syslog tradicional:

/var/log/syslog {
    rotate 12
    weekly
    compress
    missingok
    notifempty
    postrotate
        systemctl restart rsyslog > /dev/null 2>&1 || true
    endscript
}

3.3. Teste e depuração: execução manual com -d (debug) e verificação de logs girados

Teste a configuração sem executar a rotação:

logrotate -d /etc/logrotate.d/nginx

Forçar a rotação manualmente:

logrotate -f /etc/logrotate.d/nginx

Verifique os logs girados:

ls -lh /var/log/nginx/

4. Introdução ao stack ELK (Elasticsearch, Logstash, Kibana)

4.1. Componentes e funções: Elasticsearch (armazenamento/busca), Logstash (processamento), Kibana (visualização)

  • Elasticsearch: banco de dados NoSQL baseado em Lucene, otimizado para busca e agregação de dados textuais.
  • Logstash: pipeline de processamento de dados que recebe, transforma e envia logs para o Elasticsearch.
  • Kibana: interface web para criar dashboards, gráficos e alertas sobre os dados armazenados no Elasticsearch.

4.2. Instalação básica do stack em um servidor Linux (repositórios oficiais)

Adicione os repositórios e instale os pacotes:

# Importar chave GPG
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

# Adicionar repositório
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list

# Instalar
apt update && apt install elasticsearch logstash kibana

Configure a memória do Elasticsearch em /etc/elasticsearch/jvm.options:

-Xms2g
-Xmx2g

4.3. Primeiros passos: envio de logs locais para o Logstash via filebeat ou syslog

Instale o Filebeat para enviar logs do sistema:

apt install filebeat

Configure /etc/filebeat/filebeat.yml:

filebeat.inputs:
- type: log
  paths:
    - /var/log/syslog
    - /var/log/*.log

output.logstash:
  hosts: ["localhost:5044"]

5. Configuração do Logstash e ingestão de logs

5.1. Pipelines de entrada: input (file, syslog, beats) e filtros (grok, mutate, date)

Exemplo de pipeline /etc/logstash/conf.d/nginx.conf:

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
  mutate {
    convert => { "response" => "integer" }
    convert => { "bytes" => "integer" }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "nginx-logs-%{+YYYY.MM.dd}"
  }
}

5.2. Parsing de logs comuns: extração de campos de logs do Apache e journald

Para logs do Apache:

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  geoip {
    source => "clientip"
  }
}

5.3. Saída para Elasticsearch: definição de índices e templates

Configure templates para otimizar o mapeamento:

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "apache-logs-%{+YYYY.MM.dd}"
    template => "/etc/logstash/templates/apache.json"
    template_name => "apache"
    template_overwrite => true
  }
}

6. Visualização e análise com Kibana

6.1. Criação de índices e descoberta de dados (Discover)

Acesse Kibana em http://localhost:5601, vá em Stack Management > Index Patterns e crie um padrão nginx-logs-*. No Discover, filtre por campos como response: 500 para encontrar erros.

6.2. Construção de dashboards: gráficos de barras, linhas do tempo e tabelas

Crie visualizações no Visualize Library:

  • Gráfico de barras: contagem de requisições por clientip.
  • Linha do tempo: número de erros 4xx/5xx ao longo do tempo.
  • Tabela: top 10 URLs mais acessadas.

Combine as visualizações em um Dashboard.

6.3. Alertas e monitoramento: uso de Watcher (Elasticsearch) ou Kibana Alerting

No Kibana 8.x, vá em Stack Management > Alerts e crie uma regra:

Rule: Threshold
Index: nginx-logs-*
Condition: response >= 500
Schedule: Every 5 minutes
Actions: Email, Slack

7. Integração de journalctl com ELK

7.1. Envio de logs do journald via journalctl --output=json para Logstash

Crie um script que envia logs continuamente:

#!/bin/bash
journalctl -f --output=json | while read line; do
  echo "$line" | nc localhost 5050
done

Configure o Logstash para receber na porta 5050 com input tcp:

input {
  tcp {
    port => 5050
    codec => json
  }
}

7.2. Uso de systemd-journal-remote para coleta remota de logs

Instale o pacote:

apt install systemd-journal-remote

Configure o receptor em /etc/systemd/journal-remote.conf:

[Remote]
Seal=false
SplitMode=host
ServerKeyFile=/etc/ssl/private/journal-remote.pem
ServerCertificateFile=/etc/ssl/certs/journal-remote.pem

7.3. Exemplo prático: pipeline completo com filtro grok para logs do systemd

Pipeline Logstash para logs do journald:

input {
  beats {
    port => 5044
  }
}

filter {
  if [fields][service] == "systemd" {
    grok {
      match => { "message" => "%{SYSLOG5424PRI}%{SYSLOG5424SD} %{SYSLOG5424MSG}" }
    }
    mutate {
      add_field => { "service_name" => "%{[fields][unit]}" }
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "systemd-logs-%{+YYYY.MM.dd}"
  }
}

8. Boas práticas, manutenção e troubleshooting

8.1. Estratégias de retenção: balanceamento entre armazenamento e necessidade de auditoria

Defina políticas de ciclo de vida no Elasticsearch (ILM):

PUT _ilm/policy/logs_policy
{
  "policy": {
    "phases": {
      "hot": { "min_age": "0d", "actions": { "rollover": { "max_size": "50GB" } } },
      "delete": { "min_age": "30d", "actions": { "delete": {} } }
    }
  }
}

8.2. Segurança: criptografia de transporte (TLS) e controle de acesso aos índices

Habilite TLS no Elasticsearch:

# Gerar certificados
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --pem

# Configurar em elasticsearch.yml
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: true

Crie usuários e atribua permissões no Kibana:

PUT _security/role/logs_admin
{
  "indices": [ { "names": ["*"], "privileges": ["all"] } ]
}

8.3. Troubleshooting comum: logs perdidos, alto consumo de disco e lentidão no Elasticsearch

  • Logs perdidos: verifique se o Filebeat está rodando (systemctl status filebeat) e se a porta 5044 está aberta.
  • Alto consumo de disco: ajuste SystemMaxUse no journald e configure ILM no Elasticsearch.
  • Lentidão no Elasticsearch: monitore heap usage com GET _nodes/stats/jvm e aumente os shards se necessário.

Referências

💬 Comentários
Mais em Administração de Sistemas