RSS-Feed anzeigen

jahlives

Zentraler Logserver und fail2ban

Bewerten
Hier möchte ich zeigen wie man sich einen zentralen Logserver mit Autoblock (fail2ban) zusammenbaut. Der Vorteil daran ist für mich, dass die gesamte Überwachung zentral auf einem Server erfolgen kann. Zudem macht es dies einem allfälligen Angreifer wesentlich schwerer die Logfiles zu manipulieren und seine Spuren zu verwischen.

Dieser Beitrag ist eher auf ein "echtes" Linux gemünzt. Grundsätzlich sollte dies aber auch im Zusammenspiel mit einer DS funktionieren. fail2ban sollte auf einer DS eigentlich stabil laufen und wird auch von Usern hier im Forum genutzt. Die Installation und Basiseinrichtung ist hier beschrieben
Beim Logging schaut es jedoch etwas anders aus. Dies da Synology viele eigene Logs hat, welche nicht in den Standartlogs landen. Damit ist es für syslog-ng nicht möglich an diese Infos zu kommen und diese an einen Remoteserver zu schicken. Zusätzlich erfordert syslog-ng, dass ein bereits installierter Logdienst deaktiviert wird. Wie man syslog-ng installiert habe ich mal hier beschrieben

Voraussetzungen
  • zwei Server (bei mir mit Debian)
  • syslog-ng (geht sicher auch mit anderen Loggern wie rsyslog, ich persönlich finde aber syslog-ng angenehmer)
  • fail2ban (auf dem Logserver)
  • mysql-server und Client Libraries (auf dem Logserver)
  • zusätzlich wäre eine sichere Verbindung zwischen den Servern von Vorteil (z.B. via OpenVPN)
Installation

Auf dem Logserver (ServerLocal) installiert man sich die nötigen Pakete am besten via Paketverwaltung. Bei mir wegen Debian also via apt-get
Code:
apt-get update
apt-get install fail2ban mysql-server syslog-ng libmysqlclient18 mysql-client
Auf dem anderen Server (ServerRemote), welcher seine Logs an den Logserver sendet brauchen wir nur ein Paket
Code:
apt-get update
apt-get install syslog-ng
Damit sind alle Komponenten installiert, machen wir uns also an's Einrichten

Konfiguration

Zuerst schauen wir uns syslog-ng auf ServerRemote an. Da muss die Konfiguration des syslog angepasst werden (bei Debian unter /etc/syslog-ng/syslog-ng.conf)
Dazu fügt man eine sogenannte Destination ein
Code:
destination d_net { udp("ServerLocal" port(514)); };
Definiert eine Destination Namens d_net, legt fest, dass UDP verwendet werden soll und auf ServerLocal und Port 514 verbunden wird. Bei ServerLocal sollte man aber besser eine IP als einen Hostnamen verwenden, denn wenn sonst der DNS mal zickt kann das Logging u.U. scheitern

Dann muss die erstellte Destination noch zum Ziel des Loggings machen. Dazu trägt man wieder in der syslog-ng.conf
Code:
log { source(s_src); destination(d_net); };
ein. s_src ist der default Name und sollte eigentlich bereits vorhanden sein (bei Debian ist es zumindest so). Damit wäre ServerRemote dann ready, gehen wir also zum ServerLocal

Beim ServerLocal muss etwas mehr angepasst werden an syslog-ng.conf. Zuerst einmal müssen wir eine Source definieren welche am UDP lauscht und Meldungen entgegennimmt
Code:
source s_external {
             udp ( ip(0.0.0.0) port(514));
};
s_external bindet sich also auf den UDP Port 514 auf jeder verfügbaren IP des ServerLocal. Man kann aber auch explizit eine IP angeben, wenn man das nicht will. Der Vorteil wenn man es so macht: s_external bindet sich so auch an 127.0.0.1 und man kann dann auch einfach die Logs von ServerLocal an sich selber schicken ;-)

Dann fügen wir eine Destination für mysql ein
Code:
destination d_mysql {
          program("/usr/bin/mysql --user=USERNAME --password=PASSWORD DATABASE" template("INSERT INTO TABLE (host, facility, priority, level, tag, datetime, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC','$PROGRAM', '$MSG' );\n")
          template-escape(yes)); 
};
dabei USERNAME, PASSWORD, DATABASE und TABLE so anpassen, dass es für eure Umgebung passt.

Jetzt braucht es auch eine weitere Destination damit die RemoteLogs auch lokal auf dem Logserver als Files abgelegt werden. Wiederum in syslog-ng.conf
Code:
destination d_hosts { file("/var/log/ext/$HOST/$FACILITY.log" 
 owner(root)
 group(root)
 perm(0600)
 dir_perm(0751)
 create_dirs(yes)
);
};
dabei sollte /var/log/ext manuell erstellt werden. Dieser Basispfad kann aber beliebig gesetzt werden

zum Schluss definieren wir noch wie die externen Logs verarbeitet werden sollen
Code:
log { source(s_external); destination(d_hosts); destination(d_mysql); };
dabei wir also die Quelle (s_external) sowohl an d_hosts als auch an d_mysql geschickt. Damit sind die Logs sowohl als Files als auch in der Datenbank vorhanden.

Nun muss auf ServerLocal noch die Datenbank vorbereitet werden
Code:
mysql -uroot -pEUER_MYSQL_ROOT_PW
CREATE DATABASE syslog;
CREATE TABLE `logs` (
  `host` varchar(32) DEFAULT NULL,
  `facility` varchar(10) DEFAULT NULL,
  `priority` varchar(10) DEFAULT NULL,
  `level` varchar(10) DEFAULT NULL,
  `tag` varchar(10) DEFAULT NULL,
  `datetime` datetime DEFAULT NULL,
  `program` varchar(32) DEFAULT NULL,
  `msg` text,
  `seq` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`seq`),
  KEY `host` (`host`),
  KEY `program` (`program`),
  KEY `datetime` (`datetime`),
  KEY `priority` (`priority`),
  KEY `facility` (`facility`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE USER 'mysqlUser'@'localhost' IDENTIFIED BY 'euerPasswort';
GRANT ALL on syslog.* TO 'mysqlUser'@'localhost';
FLUSH PRIVILEGES;
\q
mysqlUser und euerPasswort müssen dann in syslog-ng.conf von ServerLocal bei der mysql-Destination eingetragen werden. So kann sich dann syslog-ng an die DB verbinden und Daten schicken.

Stellt sicher, dass mysqlUser sich an die DB verbinden darf. Kann man mittels
Code:
mysql -umysqlUser -peuerPasswort
testen.
Jetzt startet man syslog-ng neu. Zuerst auf ServerLocal, dann auf ServerRemote
Code:
service syslog-ng restart
#oder
/etc/init.d/syslog-ng restart
Wenn alles geklappt hat, dann solltet ihr auf ServerLocal unter /var/log/ext neue Ordner und darin die Remotelogfiles finden. Prüft auch, dass die mysql-DB abgefüllt wird!

fail2ban
Zum Schluss geht es noch um fail2ban auf ServerLocal. Dabei möchte ich nicht die grundsätzliche Eintrichtung zeigen, dazu gibt es hunderte gute Tutorials und HowTo's im Netz. Ich möchte lediglich kurz zeigen wie man die Remotelog auch mit fail2ban überwachen kann. Dabei kommt das nette Wildcard-Feature von fail2ban zum Tragen.

Hier am Beispiel eines SSH-Jails welches alle remote Auth-Logs überwacht
Code:
[ssh]
enabled = true
filter  = sshd
logpath  = /var/log/ext/*/auth.log
maxretry = 3
port = all
und schon sind alle auth.log der remote Server zentral überwacht. Das kann man dann für verschiedene Jails entsprechend anpassen
fail2ban wird auf ServerLocal nun seine Blockchains abfüllen. Diese kann man regelmässig in ein File dumpen und auf die remote Server verteilen. Dort können diese Files dann mittels eines Scripts verarbeitet werden und die IPs in die Firewall eingefügt werden. Dazu schreibe ich später mal noch was ... Kommt bald
Kategorien
Diskstation , etc ppt , Linux

Kommentare

  1. Avatar von Nikkko
    Guten Tag, im ersten Kapitel sind zwei Links hier beschrieben welche mich interesieren würden, aber wo suchen?
    Danke.
    Der zweite Link "hier beschrieben" funktionniert.
    Aber der erste Link "hier beschrieben" noch nicht. (Basisinstallation)
    Danke.
    Aktualisiert: 03.02.2015 um 13:44 von Nikkko