Archive

Kategorien

Zentraler Logserver mit Autoblock

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.

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

apt-get update
apt-get install fail2ban mysql-server syslog-ng libmysqlclient18 mysql-client

Auf dem anderen Server, welcher seine Logs an den Logserver sendet (ServerRemote) brauchen wir nur ein Paket

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

1
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

1
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

1
2
3
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

1
2
3
4
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

1
2
3
4
5
6
7
8
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

1
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

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

mysql -umysqlUser -peuerPasswort

testen.
Jetzt startet man syslog-ng neu. Zuerst auf ServerLocal, dann auf ServerRemote

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

1
2
3
4
5
6
[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 …

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

  

  

  

4 + 20 =

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie mehr darüber, wie Ihre Kommentardaten verarbeitet werden .