Centralized Logging
When you manage more than 2-3 servers, reading logs by SSHing into each server individually becomes unmanageable. If a server is compromised, its local logs can be deleted or modified. Centralized logging solves both problems: all servers ship their logs to a central system, giving you a single place to search across all servers and tamper-evident audit trails. Two approaches are common: syslog forwarding (simple, built-in) and log shippers like Filebeat (richer, works with Elasticsearch).
Why centralize logs?
Without centralized logging: With centralized logging:
server1: ssh in, grep auth.log Central log server / SIEM
server2: ssh in, grep auth.log ↑ ↑ ↑
server3: ssh in, grep auth.log server1 server2 server3
→ 30 servers = 30 SSH sessions Logs forwarded immediately after write
→ Compromised server logs deleted Attackers cannot delete already-shipped logsForwarding logs with rsyslog
# On each client server, configure rsyslog to forward to a central server:
sudo nano /etc/rsyslog.d/99-central.conf
/etc/rsyslog.d/99-central.conf (client)
# Forward all messages to central log server via TCP (reliable delivery)
*.* @@192.168.1.200:514
# Forward only critical messages to central server:
# *.crit @@192.168.1.200:514
# Queue messages locally if central server is unreachable:
$ActionQueueType LinkedList
$ActionQueueFileName fwdRule1
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
sudo systemctl restart rsyslog
# Test: send a test message and verify it arrives at the central server
logger -t testapp "Test message from $(hostname)"
Setting up a central log server
# On the central log collection server:
# Enable rsyslog to listen on TCP/UDP port 514
sudo nano /etc/rsyslog.conf
# Uncomment these lines:
# module(load="imudp")
# input(type="imudp" port="514")
# module(load="imtcp")
# input(type="imtcp" port="514")
# Route incoming messages to per-host log files:
sudo nano /etc/rsyslog.d/10-remote.conf
/etc/rsyslog.d/10-remote.conf (server)
# Store logs from remote hosts in their own directory
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
if $fromhost-ip != '127.0.0.1' then ?RemoteLogs
& stop ← stop processing remote logs after writing (don't also write to local syslog)
sudo mkdir -p /var/log/remote
sudo chown syslog:adm /var/log/remote
sudo chmod 755 /var/log/remote
sudo systemctl restart rsyslog
# Open firewall for syslog:
sudo ufw allow from 192.168.1.0/24 to any port 514 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 514 proto udp
Structured log shipping with Filebeat
# Filebeat (from Elastic) ships log files to Elasticsearch/Logstash
# Useful when you want structured querying and dashboards
# Install Filebeat:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo add-apt-repository "deb https://artifacts.elastic.co/packages/8.x/apt stable main"
sudo apt install -y filebeat
# Configure /etc/filebeat/filebeat.yml:
# filebeat.inputs:
# - type: log
# enabled: true
# paths:
# - /var/log/nginx/access.log
# - /var/log/auth.log
#
# output.logstash:
# hosts: ["logstash-server:5044"]
sudo systemctl enable --now filebeat
Conclusion
For a simple multi-server setup (under 20 servers), rsyslog forwarding to a central server is sufficient and requires no additional software beyond what's already installed. For larger environments or when you need searchable dashboards, use Filebeat + Elasticsearch. The key practice: enable reliable forwarding with disk-buffered queues so logs are not lost if the central server is briefly unreachable. Once centralized logging is in place, auth events across your entire fleet are searchable from a single location.
Need help with Ubuntu administration?
Work directly with Muhammad Irfan Aslam for Ubuntu Server, Linux, cloud, Docker, DevOps, CI/CD, or infrastructure troubleshooting support.
Work with Muhammad Irfan Aslam